Hello, TensorFlow入门教程之神经元

上页

  前面我们学习了使用会话计算一个简单的图,现在让我们使用权重构建一个神经元,即使最简单的神经元也有一个偏差值和一个非同一性non-identity函数。阅读本教程之前,最好按这里学习深度学习的基本原理和概念

神经元权重不是一个常量,因为在以后训练过程中会依据输出情况不断调整,权重是一个TensorFlow的变量,我们首先从值0.8开始:

>>> weight = tf.Variable(0.8)

你也许以为增加一个变量会增加一个操作到图中,但是实际上一行代码会增加四个操作,我们看看所有操作名称:

>>> for op in graph.get_operations(): print op.name 
## Const 
## Variable/initial_value 
## Variable 
## Variable/Assign 
## Variable/read 

这里不对每个操作进行单独解释,但是其中只有一个操作是真正计算。

>>> output_value = weight * input_value

现在图中有六个操作了,最后一个是乘法。

>>> 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) 

这里显示对乘法操作的跟踪,输入来自于图中其他操作,为了理解整个图,我们需要TensorBoard graph visualization(图虚拟化图形化工具)。

回到我们这个案例,我们现在需要运行run获得output_value 结果值,但是这个操作会依赖weight权重,而权重初始值是0.8,但是我们没有在当前会话设置这个初始值,tf.initialize_all_variables()会帮助我们初始所有的变量初始值:

>>> init = tf.initialize_all_variables()  
>>> sess.run(init)

tf.initialize_all_variables()结果将会包括当前图中所有变量的初始值,你可以通过这个初始方法增加更多变量的初始值。

现在我们可以运行output_value 操作:

>>> sess.run(output_value)  
## 0.80000001

下面我们来让神经元进行学习。

让我们假设设置输入值是1.0,而正确输出值是0,我们也有一个带有一个特征的简单训练数据集,只有一个值和一个标签label,它是零,我们让神经元学习从1到0的函数。

目前的系统是获得输入1,返回的是0.8,这是不正确的,我们需要一个办法衡量系统是怎么错的,我们称为这种错误衡量是"loss",设定我们系统一个最小的loss,如果loss是负数,再减小就愚蠢了,让我们在当前输出和期望输出之间差值做个平方:

>>> y_ = tf.constant(0.0)  
>>> loss = (y - y_)**2

现在我们需要一个优化器,我们使用一个梯度递减的优化器,这样能够基于loss不断修改权重,这个优化器会采用一个学习率来调整更新的大小幅度,这个学习率设置为0.025

>>> optim = tf.train.GradientDescentOptimizer(learning_rate=0.025)

优化器是非常聪明,它能自动工作,在整个网络中使用合适的梯度,实施后续的学习步骤。

对于我们这个简单案例我们看看梯度是什么样?

>>> grads_and_vars = optim.compute_gradients(loss)
>>> sess.run(tf.initialize_all_variables())
>>> sess.run(grads_and_vars[1][0])
## 1.6 

为什么梯度值是1.6?我们的loss是一个错误平方,两次是错误,当前系统是0.8而不是0,这样错误就是0.8,0.8的平方是1.6。

对于较复杂的系统,它会工作得很好,tensorflow会计算并自动为我们应用这些梯度。

让我们应用这个梯度,完成反向传播B-P(backpropagation)。

>>> sess.run(optim.apply_gradients(grads_and_vars))  
>>> sess.run(w)  
## 0.75999999  # about 0.76

权重以0.04递减,因为优化器减去梯度次数(学习率1.6*0.025),将权重值变动推向了正确方向。

与其像这样我们这样手工制作优化器,我们可以制作一个操作:计算和应用梯度,这就是train_step:

>>> train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)
>>> for i in range(100):
>>>     sess.run(train_step)
>>> 
>>> sess.run(y)
## 0.0044996012 

运行这个训练步骤很多次以后,权重和输出值将不断接近0,这表示神经元在学习了。

 

Tensorflow简单教程

大数据专题