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,这表示神经元在学习了。