TensorFlow 实现卷积神经网络(Basic)

来源:互联网 发布:js延迟加载方式 编辑:程序博客网 时间:2024/05/29 19:39

在之前的学习中,已经阅读完了《面向机器智能的Tensorflow实践》一书,总体来看,入门而言此书还是值得一读的,但是其Tensorflow库过于陈旧了,许多模块发生了很大的变化,诸如summary, multiply等等,调代码很花时间,所以不很推荐这本书的代码。作为进阶,目前开始阅读TensorFlow实战一书,此文也是基于该书的第五章节而写作的。

Intro

卷积神经网络(CNN)最初用来解决图像识别问题,现在也有基于时间序列的应用。如果对于图像识别本身有所了解,基本都知道常用的SIFT、RIFT等方法,CNN的优势在于其整合了【特征提取】和【分类训练】两个环节,避免了复杂的图像预处理过程。

Procedure

卷积神经网络由多个卷积层组成,在每个卷积层中通常会执行以下几个操作:
卷积层

Core Codes

书中使用的数据集是MNIST,这里考虑到一个小技巧便是ReLU中为Bias添加一个小的正值(0.1)来避免死亡节点。第一次载入MNIST的时候,一般由于extracting 的操作会比较耗时,可能会有Kernel Busy的情况出现(Jupyter)。
这里已经将主要的Jupyter代码进行运行并托管到github,本文对应于CNN.ipynb,下面只关注一些重点的代码片。

Data_prepare

initial = tf.truncated_normal(shape, stddev = 0.1)

在代码片中,我们发现这里用的是截断正态分布,也即是加入一些权重的随机噪声项避免完全的对称。

Conv layer

 tf.nn.conv2d(x, W, strides = [1, 1, 1, 1], padding='SAME') 

strides: 步长,直观理解就是如果步长为n, 图像在这个方向上会缩小n倍数,步长为1则图像大小保持不变。

padding: 边缘处理方式,卷积核移动到边缘,如果用SAME则卷积的输入和输出保持相同

x: 输入

W: [1,2,3,4] 是卷积核的参数, 参数1、2代表的是卷积核的尺寸,3代表图像的通道数(1为灰度图像,3 为RGB图像),4代表卷积核的数量,4个卷积核也就是最终会提取4类特征。

x_image = tf.reshape(x, [-1,28,28,1])

这里最开始的-1代表样本数量不固定,最后的1是颜色通道数。

Pool layer

书中所给的代码实现了两个卷积层,第一层32特征,第二层64特征,其他一样。
在两次步长为2x2的的最大池化之后,图像尺寸已经由28*28变成了7*7

ReLU layer

Dropout layer

Dropout: 随机丢弃一部分数据防止过拟合,这里通过keep_prob来实现

Softmax layer

Training

原书中设置了2W 次训练,keep_prob设置为0.5, min_batch大小为50, 但着实运行时间比较长,在git版本只做了几次观察了一下。

Testing

CNN模型最终准确率为99.2%左右,其错误率0.8%相对于MLP而言降低了60%

TODO

MNIST不太适合评测复杂的CNN,下一步用CIFAR-10数据集进行训练

REFERENCE

1 面向机器智能TensorFlow实践. Sam Abrahams等
2 TensorFlow 实战. 黄文坚等