专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
Python爱好者社区  ·  月薪3万35岁脑干出血程序员:ICU躺了28 ... ·  2 天前  
Python爱好者社区  ·  软考,yyds ·  2 天前  
Python爱好者社区  ·  Science披露:近3年,垃圾论文激增,9 ... ·  3 天前  
51好读  ›  专栏  ›  Python开发者

你好,TensorFlow

Python开发者  · 公众号  · Python  · 2017-04-06 20:03

正文

请到「今天看啥」查看全文


op . name )

## Const

## Variable/initial_value

## Variable

## Variable/Assign

## Variable/read


我们并不想单独观察每个 op 太久,但至少观察一个来看看真实的运算。


>>> output_value = weight * input_value


现在图中有 6 个 ops,最后一个是乘法。


>>> op = graph . get_operations ()[ - 1 ]

>>> op . name

## 'mul'

>>> for op_input in op . inputs : print ( op_input )

## Tensor("Variable/read:0", shape=(), dtype=float32)

## Tensor("Const:0", shape=(), dtype=float32)


这说明了乘法 op 的输入来源:来自图中的其它 ops。要了解整个图,按这种方法很快会使人恹恹欲睡。所以 TensorBoard graph visualization 就应运而生了。


怎样查看生成了些什么呢?我们必须“运行” output_value op。但它取决于变量:weight。我们将初始的 weight 设为 0.8,但这个值在当前会话中还没有设置。tf.initialize_all_variables() 函数会生成一个可以初始化所有变量(虽然本例中只有一个变量)的 op,下面运行这个 op。


>>> init = tf . initialize_all_variables ()

>>> sess . run ( init )


运行 tf.initialize_all_variables() 后会对目前存在于图中的所有变量进行初始化,所以如果添加更多变量后,会想再次使用 tf.initialize_all_variables();但原有的 init 不包括新的变量。


下面我们准备运行 output_value 的 op。


>>> sess . run ( output_value )

## 0.80000001


回想一下 0.8 * 1.0 进行 32 位的浮点型运算很难得到 0.8;0.80000001 是最接近的数。


在 TensorBoard 观察你的图


到目前为止,简单的图已经完成了,但通过图解(diagram)能观察会更棒。用 TensorBoard 就能生成这个图解。TensorBoard 读取命名字段(name field)并将每个 op 存储在内部(和 Python 的变量名比起来很不同)。我们可以使用这些 TensorFlow 命名并转换成更符合 Python 习惯的变量名。在这使用的 tf.mul 和前面用 * 一样都是乘法,但它可以设置 op 的命名。


>>> x = tf . constant ( 1.0 , name = 'input' )

>>> w = tf . Variable ( 0.8 , name = 'weight' )

>>> y = tf . mul ( w , x , name = 'output' )


TensorBoard 由 TensorFlow 会话创建的输出目录进行观察。我们可以用 SummaryWriter 写入这个输出,如果创建图的时候我们不做任何操作,它只会写入这个图。


当我们创建 SummaryWriter 时,第一个参数是输出目录的名称,如果不存在会自动创建。


>>> summary_writer = tf.train.SummaryWriter('log_simple_graph', sess.graph)


我们现在可以在命令行启动 TensorBoard了。


$ tensorboard -- logdir = log_simple _ graph

TensorBoard 会运行一个本地的 web 应用,在 6006 端口(“6006”是“goog”的翻转)。如果你浏览 localhost:6006/#graphs,你可以看到你在 TensorFlow 图的图解,就像图 2 所示。


图2:最小 TensorFlow 神经元的 TensorBoard 可视化


让神经元学习


我们已经创建了神经元,但怎么让它学习呢?我们将输入值设置为 1.0,正确的输出值设置为 0。现在我们有一个非常简单的“训练集”,只有一个值为 1 的特征(feature)和值为 0 的标签(label)。我们希望这个神经元能够学会从 1 变为 0。


现在向程序输入 1,返回 0.8 的结果是不正确的。我们需要一种方式来描述系统误差。所以我们用“损失(loss)”来描述系统误差,我们的目标就是尽可能减少系统误差。当然,如果误差为负,就不是越小越好了。因此我们用实际输出(current output)和期望输出(desired output)的平方差来定义误差的值。


>>> y_ = tf . constant ( 0.0 )

>>> loss = ( y - y_ ) ** 2


目前,图里还没有东西进行学习。因此我们需要一个优化器(optimizer)。我们将使用梯度下降优化器使我们能够按照误差的导数(derivative)来更新权重。这个优化器通过学习率(learning rate)来调节(moderate)更新的大小,我们设置为 0.025。








请到「今天看啥」查看全文