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

本文详细介绍了卷积神经网络(CNN)的结构,包括输入层、卷积池化层、扁平层和全连接层的数据处理。通过一个具体的例子展示了在TensorFlow中构建CNN模型的过程,解释了卷积和池化操作的参数设置,并分析了各层输出的特征图尺寸。此外,还讨论了如何将数据从多维数组转换为适合全连接层的二维数据,最后输出分类结果。
摘要由CSDN通过智能技术生成

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

目录

二、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模型了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔法攻城狮MRL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值