TensorFlow 与深度学习 (11) 卷积网络:理论
在卷积网络层中,一个神经元仅对该图像上的一个小部分的像素求加权和。然后,通常会加上一个偏置,并且将得到的加权和传给激活函数。与全连接网络相比,其最大的区别在于卷积网络的每个神经元重用相同的权重,而不是每个神经元都有自己的权重。
在卷积网络层中,一个神经元仅对该图像上的一个小部分的像素求加权和。然后,通常会加上一个偏置,并且将得到的加权和传给激活函数。与全连接网络相比,其最大的区别在于卷积网络的每个神经元重用相同的权重,而不是每个神经元都有自己的权重。
你可能已经注意到,在数千次迭代之后,测试和训练数据的交叉熵曲线开始不相连。学习算法只是在训练数据上做工作并相应地优化训练的交叉熵。它从来看不到测试数据了,所以看到这一点也不必感到奇怪:过了一会儿它不再对测试交叉熵产生影响,交叉熵不再下降,有时甚至反弹回来。
通过两个、三个或者四个中间层,你现在可以将准确度提升至接近 98%,当然,你的迭代次数要达到 5000 次以上。然而你会发现结果并不一直如此。
随着层数的增加,神经网络越来越难以收敛。但现在我们知道如何控制它们的行为了。这里是一些只用一行就可以实现的改进,这些小技巧会帮到你,当你看到准确度曲线出现如下情况的时候:
为了提高识别准确度,我们将为神经网络增加更多层(Layer)。第二层神经元将计算前一层神经元输出的加权和,而非计算像素的加权和。这里有一个 5 层全连接神经网络的例子:
单层神经网络的代码已经写好了。请打开
mnist_1.0_softmax.py
文件并按说明进行操作。
你在本节的任务是理解代码,以便之后对其改进。
你应该看到,在文档中的说明和启动代码只有微小的差别。它们对应于可视化的函数,并且在注释中被标记。此处可忽略。
1 | import tensorflow as tf |
现在我们的神经网络从输入图像中产生预测,我们需要知道这个模型有多好,即,事实情况和网络的预测之间到底有多大的距离。回忆下,这个数据集中的所有图像都有一个真实的标签(label)。
任何一种定义的距离都可以进行这样的操作,普通欧几里得距离是可以的,但是对于分类问题,被称为交叉熵(cross-entropy)的距离更加有效。
MNIST 数据集中,手写数字是 28x28 像素的灰度图像。将它们进行分类的最简单的方法就是使用 28x28=784 个像素作为单层神经网络的输入。
我们首先来观察一个正在训练的神经网络。代码会在下一节解释,所以现在不必查看。
我们的神经网络可以输入手写数字并对它们进行分类,即,将它们识别为 0、1、2……9。它基于内部变量(“权重(weights)”和“偏差(bias)”,会在后面进行解释),需要得到正确的值,分类才能正常工作。这个“正确的值”通过训练过程进行学习,这也将在后面详细解释。你现在需要知道的是,训练回路看起来像这样:
1 | Training digits => updates to weights and biases => better recognition (loop) |
在你的电脑上安装必要软件:Python、TensorFlow 和 Matplotlib。完整的安装说明在这里:INSTALL.txt
克隆 GitHub 仓库:
1 | $ git clone https://github.com/martin-gorner/tensorflow-mnist-tutorial |