TensorFlow入门-MNIST进阶
前言
1、本文将介绍使用TensorFlow获取数据、构建网络、训练网络、测试网络的流程。
2、请先学习MNIST机器学习入门。
3、项目构建流程官方文档TensorFlow中文社区-MNIST进阶写得很简洁,并不能让人学习整个流程。建议边看官方文档构建项目。而本文详细解释了构建该项目需要的知识:
- 介绍卷积神经网络CNN、卷积、卷积核filter、池化pooling、dropout等。
- 介绍CNN常用结构,CNN的学习过程与物理意义。
- 介绍全连接层FC。
- 项目中使用的TensorFlow函数。
最后,附上完整代码。能够直接运行。
卷积神经网络CNN
卷积:
利用一个卷积核(矩阵),在图像等(矩阵)上依次做卷积(矩阵对应数据相乘,后最后求和)。再将得到的卷积数值作为新的特征图(矩阵)的值。该操作的目的特征提取。而CNN的目的就是利用大量样本训练出卷积核的权重来进行目标特征挖掘。
比如下列两个矩阵,第一个为提取竖线特征卷积核,第二个为提取横线特征的卷积核。
几个重要参数:
- 卷积核尺寸:长x宽x通道数;
- 卷积核移动步长(Stride):每一次卷积核在图片上移动的长度,步长约长效率越高,但精度会降低。反之则反。
- 边缘扩展(Pad):因为卷积核的中间要与图片边缘处像素对齐,所以边缘外的像素可初始化为0。我们需要根据卷积核尺寸来确定pad的大小。
问:卷积得出的图片物理意义是什么?
答:卷积从低到高,获得的特征层次也就从低到高。
问:RGB只有三个通道,为什么卷积核可以有甚至10个通道?
答:一个通道构建一个类型的特征,当把多个通道混合后可得到深层信息。如图:
问:什么叫权值共享?
答:因为对每一个卷积核,对图片的各个像素均为相同权值,所以这个就叫权值共享。
卷积后的特征图尺寸计算:
其中:
- out为输出矩阵的长或宽,in为输入矩阵的长或宽。
-
filter为卷积核的长或宽。
-
pad为在长或宽上添加0的长度。
-
stride为步长。
eg
输入RGB图片为33x33*3,卷积核为5x5x6,步长为3,pad为1。
输出的特征图长宽均为:(33-5+2x1)/3 + 1 = 11,则为11x11的图,通道数为6。
关于卷积神经网络的详细内容:一文让你彻底了解卷积神经网络
池化
对特征图进行压缩,又叫下采样,可以在池化区域内选择max、min或者mean(均值)来代替哪个区域。该操作的目的为降低数据量。
卷积神经网络的一般构成
[[卷积(CONV)-激活(Sigmod/RELU)]-池化(POOL)]-全连接-分类或回归
本项目MNIST CNN的网络结构:
CNN学习流程
图片通过被初始化的卷积核一层层计算后,数据将通过前向传播生成特征图。此时我们需要将输出的特征图与训练集的标签建立联系,这样才能反向传播。(神经网络的训练需要按照一个损失函数,根据标签输出值最大,利用数据可微才能反向传播)所以大部分CNN后都接了全连接层和分类层来与标签建立联系。
构建一个多层卷积网络
卷积(Convolution)
作用:
根据卷积核,算出原始图像的卷积图像,进行在特征保留的前提下压缩数据量。
函数:
tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
参数:
-
input:输入的待卷积图片,要求为一个张量,shape为
[batch, img_height, img_width, img_channel]
,分别代表图片数量、图片高度、宽度、通道数(灰度图1,RGB图3) -
filter:卷积核,要求为一个张量,shape为
[filter_height, filter_width, img_channel, out_channels]
,分别代表卷积核高度、宽度、图像通道数、卷积核数量(输出通道数)。 -
strides:卷积时在图像每一纬的步长,这是一个一纬向量,shape为
[1, strides, strides, 1]
,第一位和最后一位必须是1。 -
padding:string类型,值为“SAME”和"VALID",表示卷积是否考虑边界,”SAME“是考虑边界,不足的时候用0去填充周围,”VALID“则不考虑。
-
use_cudnn_on_gpu:bool类型,是否用cudnn加速,默认为true。
返回值:
经过卷积的feature map。
池化(Pooling)
作用:
最大池化,取池化窗内最大的值保留,进一步在保留特征的前提下压缩数据量。
函数:
tf.nn.max_pool(value, ksize, strides, padding, name=None)
参数:
- value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,shape为
[batch, img_height, img_width, img_channel]
。 - ksize:池化窗口的大小,取一个四维向量,一般是
[1, height, width, 1]
,因为我们不想在batch和channels上做池化,所以这两个维度设为了1。 - strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也为
[1, strides, strides, 1]
。 - padding:string类型,值为“SAME”和"VALID",表示卷积是否考虑边界,”SAME“是考虑边界,不足的时候用0去填充周围,”VALID“则不考虑。
返回值:
经过池化的图像,shape仍然是[batch, height, width, channels]
这种形式
eg
全连接(Fully Connection)
在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布特征表示”映射到样本标记空间的作用。
在CNN中,全连接层常出现在最后几层,用于对前面设计的特征做加权合。为了提升CNN网络性能,全连接层每个神经元的激励函数一般采用ReLU函数。而全连接层输出的值可以输入softmax逻辑回归进行分类从而执行一个具体的分类任务。对于一个具体的分类任务,选择一个合适的损失函数是十分重要的。通常CNN的全连接层与MLP结构一样,CNN的训练算法也采用BP算法。
BP算法(Back Propagation):反向传播算法。
详细内容:对全连接层(fully connected layer)的通俗理解
reshape(x, [-1, 28, 28, 1])中的-1
-1 代表该维度由前面的x的batch决定,因为x代表的图片数可以任意给定的,这里就不能写定。
Dropout
引入Dropout的背景
在机器学习中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。
过拟合表现:训练数据上损失函数小,预测准确率较高,但是在测试数据上损失函数比较大,预测准确率较低。
Dropout发展历程
2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of featu