本教程由深度学习中文社区(Studydl.com)持续发布与更新, 本系列其余教程地址见文章末尾.

在上期的文章中, 我们使用了softmax回归模型去识别mnist数据集, 但是正确率只有91%, 我们今天将在上期的基础上使用卷积神经网络来进一步提高正确率, 这会达到大概99.2%的准确率。虽然不是最高,但是还是比较让人满意。在后面的时间里我们会推出一系列的TensorFlow与PyTorch的入门教程, 希望大家多多转发与关注。

权重初始化

为了创建这个模型,我们需要创建大量的权重和偏置项。这个模型中的权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度。由于我们使用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,以避免神经元节点输出恒为0的问题(dead neurons)。为了不在建立模型的时候反复做初始化操作,我们定义两个函数用于初始化。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

初始化权重

卷积和池化

TensorFlow在卷积和池化上有很强的灵活性。我们怎么处理边界?步长应该设多大?在这个实例里,我们会一直使用vanilla版本。我们的卷积使用1步长(stride size),0边距(padding size)的模板,保证输出和输入是同一个大小。我们的池化用简单传统的2x2大小的模板做max pooling。为了代码更简洁,我们把这部分抽象成一个函数。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

建立卷积和池化层

第一层卷积

现在我们可以开始实现第一层了。它由一个卷积接一个max pooling完成。卷积在每个5x5的patch中算出32个特征。卷积的权重张量形状是[5, 5, 1, 32],前两个维度是patch的大小,接着是输入的通道数目,最后是输出的通道数目。 而对于每一个输出通道都有一个对应的偏置量。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

第一层卷积

为了用这一层,我们把x变成一个4d向量,其第2、第3维对应图片的宽、高,最后一维代表图片的颜色通道数(因为是灰度图所以这里的通道数为1,如果是rgb彩色图,则为3)。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

改变维度

我们把x_image和权值向量进行卷积,加上偏置项,然后应用ReLU激活函数,最后进行max pooling。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

激活与池化

第二层卷积

为了构建一个更深的网络,我们会把几个类似的层堆叠起来。第二层中,每个5x5的patch会得到64个特征。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

第二层卷积

密集连接层

现在,图片尺寸减小到7x7,我们加入一个有1024个神经元的全连接层,用于处理整个图片。我们把池化层输出的张量reshape成一些向量,乘上权重矩阵,加上偏置,然后对其使用ReLU。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

全连接层

Dropout

为了减少过拟合,我们在输出层之前加入dropout。我们用一个placeholder来代表一个神经元的输出在dropout中保持不变的概率。这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout。 TensorFlow的tf.nn.dropout操作除了可以屏蔽神经元的输出外,还会自动处理神经元输出值的scale。所以用dropout的时候可以不用考虑scale。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

dropout层

输出层

最后,我们添加一个softmax层,就像前面的单层softmax regression一样。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

输出层

训练和评估模型

这个模型的效果如何呢?

为了进行训练和评估,我们使用与之前简单的单层SoftMax神经网络模型几乎相同的一套代码,只是我们会用更加复杂的ADAM优化器来做梯度最速下降,在feed_dict中加入额外的参数keep_prob来控制dropout比例。然后每100次迭代输出一次日志。

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区

模型训练与验证

在最终测试集上的准确率大概是99.2%。目前为止,我们已经学会了用TensorFlow快捷地搭建、训练和评估一个复杂一点儿的深度学习模型。

本系列教程往期文章地址:

TensorFlow入门教程(三): 使用softmax回归模型识别MNIST数据集

TensorFlow入门教程(二): 构建神经网络分类器,对鸢尾花进行分类

TensorFlow入门教程(一): 变量,图与会话的基本用法

从零开始搭建深度学习服务器:TensorFlow PyTorch Torch

TensorFlow入门教程(四): 使用CNN提高MNIST数据集识别正确率-深度学习中文社区