由于这个模型,TensorFlow 接管了分布式运算的大量运筹。例如,假如你指示它在计算机 1 上运行计算的一部分 ,而在计算机 2 上运行另一部分,它可以自动进行必要的数据传输。 计算需要将实际数据反馈进你在 TensorFlow 代码中定义的占位符。这是以 Python 的 dictionary 的形式给出的,其中的键是占位符的名称。 mnist_1.0_softmax.py: https://github.com/martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py
在这里执行的 train_step 是当我们要求 TensorFlow 最小化交叉熵时获得的。这是计算梯度和更新权重和偏置的步骤。 最终,我们还需要一些值来显示,以便我们可以追踪我们模型的性能。 在训练回路中使用该代码来计算准确度和交叉熵(例如每 10 次迭代): # success ? a,c = sess.run([accuracy, cross_entropy], feed_dict=train_data) 通过在馈送 dictionary 中提供测试而不是训练数据,可以对测试数据进行同样的计算(例如每 100 次迭代计算一次。有 10,000 个测试数字,所以会耗费 CPU 一些时间): # success on test data ? test_data={X: mnist.test.images, Y_: mnist.test.labels} a,c = sess.run([accuracy, cross_entropy], feed=test_data) TensorFlow 和 Numpy 是朋友:在准备计算图时,你只需要操纵 TensorFlow 张量和命令,比如 tf.matmul, tf.reshape 等。 然而,只要执行 Session.run 命令,它的返回值就是 Numpy 张量,即 Numpy 可以使用的 numpy.ndarray 对象以及基于它的所有科学计算库。这就是使用 matplotlib(基于 Numpy 的标准 Python 绘图库)为本实验构建实时可视化的方法。 这个简单的模型已经能识别 92% 的数字了。这不错,但是你现在要显著地改善它。
7、实验:增加层
为了提高识别的准确度,我们将为神经网络增加更多的层。第二层神经元将计算前一层神经元输出的加权和,而非计算像素的加权和。这里有一个 5 层全相连的神经网络的例子:
我们继续用 softmax 来作为最后一层的激活函数,这也是为什么在分类这个问题上它性能优异的原因。但在中间层,我们要使用最经典的激活函数:sigmoid:在这一节中你的任务是为你的模型增加一到两个中间层以提高它的性能。 答案可以在 mnist_2.0_five_layers_sigmoid.py 中找到。只有当你实在想不出来的时候再使用它!为了增加一个层,你需要为中间层增加一个额外的权重矩阵和一个额外的偏置向量: W1 = tf.Variable(tf.truncated_normal([28*28, 200] ,stddev=0.1)) B1 = tf.Variable(tf.zeros([200])) W2 = tf.Variable(tf.truncated_normal([200, 10], stddev=0.1)) B2 = tf.Variable(tf.zeros([10])) 对,就这么做。通过 2 个中间层以及例子中 200 个和 100 个神经元,你现在应该能够把你的神经网络的准确度推高到 97% 了。 8、实验:深度网络需要特别注意的地方 随着层数的增加,神经网络越来越难以收敛。但现在我们知道如何控制它们的行为了。这里是一些只用 1 行就可以实现的改进,当你看到准确度曲线出现如下情况的时候,这些小技巧会帮到你: 修正线性单元(ReLU)激活函数 在深度网络里,sigmoid 激活函数确实能带来很多问题。它把所有的值都挤到了 0 到 1 之间,而且当你重复做的时候,神经元的输出和它们的梯度都归零了。值得一提的是,出于历史原因,一些现代神经网络使用了 ReLU(修正线性单元),它大致是如下这个样子: (责任编辑:本港台直播) |