LeNet5介绍
LeNet-5是一种高效的卷积神经网络,在论文《Gradient-Based Learning Applied to Document Recognition》中 有详细的解释,它在大家熟知的手写数字识别项目中它得到广泛地使用。该网络一共有7层,依次为:卷积层、池化层、卷积层、池化层、全连接层、全连接层(输出层)。
分类训练的准备工作
- 准备数据集
- 设计网络结构
数据集的准备杰瑞在前一篇文章中已经讲过了,所以在本篇文章中就不再阐述了,今天主要写一下网络结构的设计。今天教程中所使用的模型是LeNet-5模型,如上图,想必大家已经知道该网络的大概结构了吧?现在要做的就是用python代码实现上图中的网络结构。
主要函数:
tf.nn.conv2d()
tf.nn.max_pool()
tf.nn.lrn()
tf.nn.conv2d()函数主要用来进行卷积操作,tf.nn.max_pool()函数主要用来进行池化操作,tf.nn.lrn()用来对数据进行归一化。
代码实践
tf.nn.conv2d()的参数:input, filter
杰瑞一个batch的数据形状为[?, 64*64],所以在数据进入网络之前必须要将数据形状改变成[?, 64, 64, 1]。因为tf.nn.conv2d()函数第一个参数input需要[batch_size,图片高度,图片宽度,图片深度]形状的tensor。
filter就是我们用来进行卷积操作的卷积核,实际上它也是一个tensor,我们通过tf.Variable()函数来定义它,以下是定义卷积核的代码:
卷积完成之后我们就可以与偏执量一起求和了,最后经过一个激活函数Relu作为池化层的输入。
池化层
池化层我们通过tf.nn.max_pool()函数来实现,第一个参数就是需要池化的输入,第二个参数是池化窗口的大小,这里设置为[1, 3, 3, 1],第三个参数是步长,这里设置为[1, 1, 1, 1]。
池化过后我们需要进行局部响应归一化,把反映响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,说白了就是将明显“特征”放大,不明显“特征”减小。
剩下的5层的创建和上面两层的创建步骤差不多,所以就不重复解释了,直接把代码贴上来:
以上图片中的代码按顺序排列构成LeNet-5网络结构。
损失函数与优化方法
杰瑞使用tf.nn.softmax_cross_entropy_with_logits()方法计算交叉熵,并使用tf.train.AdamOptimizer()方法实现梯度下降较小损失值。
开启会话进行训练
这里我们直接开启会话进行训练,在下图中可以看到损失值的变化:
关注《高手杰瑞》,每天更新哦!