基于TensorFlow的CNN模型——猫狗分类识别器(三)之CNN模型分析

注意:这是一个完整的项目,建议您按照完整的博客顺序阅读。

目录

二、CNN模型分析

1、输入层的数据输出

2、卷积池化层的数据输出

A、卷积操作

B、池化操作

3、扁平层的数据输出

4、全连接层的数据输出


二、CNN模型分析

在该阶段我们将使用TensorFlow搭建一个CNN模型,这个CNN模型的结构如下图:

1、输入层的数据输出

经过数据预处理部分,我们的输入数据是一个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()操作中并不会改变这个整体数量,只会改变数组的维度,现在的输入的四维数组数据的存储方式如下:

  1. 2、卷积池化层的数据输出

得到输入数据后,它要经过的第一个层是一个卷积池化层(卷积层和池化层的总称)。

A、卷积操作

第一个卷积池化层中卷积操作设置为(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(结果向上取整)。

经过卷积操作后,就要进行池化操作。

B、池化操作

池化操作也是从原始数据中进行采样,这里使用的是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)的四维数组。

3、扁平层的数据输出

卷积池化层之后是无法直接连接全连接层的,经过一个扁平层来将数据压平(Flatten),也就是把shape= (?,image_height,image_width,color_channel)的四维数据压缩成长度为 shape=(?,height × width × channel) 的二维数据,所以经过扁平层处理后,数据的shape=(?,4096)。

4、全连接层的数据输出

全连接层的输出就好确定了,有多少个神经元就有多少个输出,第1个全连接层是4096*1024,即有1024个输出,数据变为shape=(?,1024)。

第1个全连接层是1024*2,即有2个输出,数据变为shape=(?,2)。

接下来我们就要构建这个CNN模型了。

猜你喜欢

转载自blog.csdn.net/qq_41959920/article/details/114490958