注意:这是一个完整的项目,建议您按照完整的博客顺序阅读。
目录
二、CNN模型分析
1、输入层的数据输出
2、卷积池化层的数据输出
A、卷积操作
B、池化操作
3、扁平层的数据输出
4、全连接层的数据输出
在该阶段我们将使用TensorFlow搭建一个CNN模型,这个CNN模型的结构如下图:
经过数据预处理部分,我们的输入数据是一个shape=(batch_size,image_length,image_width,color_channel)的四维数组(在TensorFlow中用Tensor表示这个数组,但我们这里为了理解,仍使用数组的说法,下同。)
层 |
英文术语 |
中文释义 |
输入层 |
batch_size |
批大小,每次输入的图片数量 |
image_length |
图片长宽,一般相等,用统一的image_size表示 |
|
image_width |
||
color_channel |
颜色通道,彩色图片一般为RGB的3通道 |
在该CNN模型中shape=(?,64,64,3)的含义为每次训练输入的是?张64*64的的RGB的3个颜色通道的图片数据。
这里需要理解的是,这个四维数组存储的值是?*64*64个(R,G,B)的0-255的RGB值,在之后的reshape()操作中并不会改变这个整体数量,只会改变数组的维度,现在的输入的四维数组数据的存储方式如下:
得到输入数据后,它要经过的第一个层是一个卷积池化层(卷积层和池化层的总称)。
第一个卷积池化层中卷积操作设置为(filter_length,filter_width,in_channel,out_channel),stride=1,Padding=SAME/VALID,各个含义如下:
|
英文术语 |
中文释义 |
卷积层 |
filter_length |
卷积核(滤波器)尺寸,一般长宽相等,用filter_size表示 |
filter_width |
||
in_channel |
输入通道数,设置为上一层的输出通道数 |
|
out_channel |
输出通道数,与卷积核数量相等 |
|
stride |
步长,卷积核每次扫描的间隔 |
|
padding |
边界扩充方式,卷积核扫描时可能会出界,取值为SAME/VALID |
该CNN模型中第一个卷积池化层中卷积操作设置为(3,3,3,32),stride=1,Padding=SAME/VALID,表示该层有32个3*3的卷积核以Stride=1为间隔、不足部分以0填充的方式来扫描输入的四维数据。输入的是?张64*64*3的图片数据,经过该层卷积最后会生成?张64*64*32个通道的特征图。
为什么是这个结果呢?
首先卷积池化操作不会改变图片张数,所以还是?张;32是因为其使用了32个卷积核来扫描,一个卷积核生成一个单通道特征图,所以输入的是3通道图片,经过有32个卷积核扫描后生成32个通道;64*64的尺寸没有改变,为什么呢?因为经过了如下计算:
当stride=1时,padding = ‘same’卷积操作后图片大小不变,padding=‘valid’情况下,new_height = new_width = (image_size– filter_size + 1) / stride (结果向上取整)
当stride!=1时,new_height = new_width = image_size/ stride(结果向上取整)。
经过卷积操作后,就要进行池化操作。
池化操作也是从原始数据中进行采样,这里使用的是2*2的滤波器,stride=2,Padding=SAME来进行最大池化,此时的输入数据是卷积操作的输出数据,即(?,64,64,32),经过最大池化后变为(?,32,32,32)。这里可以看到池化操作只改变了图像尺寸,没有改变输出通道,这是因为池化只是在二维数据上操作的,不改变输入的通道数,而卷积操作是在三维数据上进行的,输出通道数与自己的卷积核数量相关。那么池化后的新图像尺寸计算如下:
new_height = (input_height - filter_height)/stride+ 1
new_width = (input_width - filter_width)/stride + 1
如此经过上述3次卷积池化层的处理,最后的输出为shape=(?,8,8,64)的四维数组。
卷积池化层之后是无法直接连接全连接层的,经过一个扁平层来将数据压平(Flatten),也就是把shape= (?,image_height,image_width,color_channel)的四维数据压缩成长度为 shape=(?,height × width × channel) 的二维数据,所以经过扁平层处理后,数据的shape=(?,4096)。
全连接层的输出就好确定了,有多少个神经元就有多少个输出,第1个全连接层是4096*1024,即有1024个输出,数据变为shape=(?,1024)。
第1个全连接层是1024*2,即有2个输出,数据变为shape=(?,2)。
接下来我们就要构建这个CNN模型了。