CNN内部计算及卷积核、通道数关系

目录

CNN

内部计算

具体实现:tensorflow

1*1卷积的作用

卷积和池化后的大小计算


CNN

  • 局部连接:不是全连接,而是使用size相对input小的kernel在局部感受视野内进行连接(点积运算)
  • 权值共享:在一个卷积核运算中,每次都运算一个感受视野,通过滑动遍历的把整个输入都卷积完成,而不是每移动一次就更换卷积核参数

两者目的都是减少参数。通过局部感受视野,通过卷积操作获取高阶特征,能达到比较好的效果。

内部计算

  • 先看卷积(卷积核与感受视野的点积)与池化示意图:部分图片来自于:链接
标准卷积过程
CNN内部计算及卷积核、通道数关系_第1张图片 最大池化层

 

  • 输入、卷积、池化形状定义:
  1.  输入为(长,宽,RGB通道数)=(7*7*3)的图片,即inputs = (batch_size, 7, 7, 3)
  2. 卷积核为(长,宽,卷积通道数,卷积核个数),即filter = (3, 3, 3, 32)。
  3. 池化为(长,宽,步长)
  • 标准卷积运算过程:
  1. 对于输入没有疑问,对于卷积操作,定义的32个卷积核,每一个卷积核都有3个通道,相同的卷积核在三个通道的卷积核参数不相同,只有尺寸相同,每个卷积核都有3个尺寸但参数不一样的变量,最后该卷积核的结果为每个通道的卷积结果相加,得到卷积后的新通道。卷积核的个数为卷积完成后新的通道数。
  2. 参数个数为 32*3, 参数最后的size为3*3*3*32。
  • 池化的意义

1.特征不变形:池化操作是模型更加关注是否存在某些特征而不是特征具体的位置。

  2.特征降维:池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。

  3.在一定程度上防止过拟合,更方便优化。

具体实现:tensorflow

#示意代码,理解具体实现的定义
#输入
x_image = tf.reshape(x, [-1,28,28,1])

#卷积核
W_conv1 = weight_variable([5, 5, 1, 32])

#卷积操作,在用tensorflow调用卷积核api的时候,会有填padding方式的参数.'SAME'就是填充0到成为满足整除的列数/行数,而'VALID'则是丢弃直到满足整除。
#strides窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1],规定前后为1
conv2d = tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding='SAME')

#池化操作,ksize卷积核大小,strides步长,padding填充方式
tf.nn.max_pool(conv2d, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')  

1*1卷积的作用

  • 可以实现通道的维度变化,如增加卷积后的通道数和减少卷积后的通道数
  • 进行非线性映射(也就是多通道信息交互):使用多通道卷积后的结果相加作特征映射,而不是单一通道

卷积和池化后的大小计算

给定的值:原大小(H,W), 卷积核大小(h,w), 池化大小(h,w), padding(填充)=a, strids(滑动步长)=b,公式通用

计算公式:

 

 

假设:输入图片大小为200×200,依次经过一层卷积(kernel size 5×5,padding 1,stride 2),pooling(kernel size 3×3,padding 0,stride 1),又一层卷积(kernel size 3×3,padding 1,stride 1)之后,输出特征图大小为:

解:由于原图片、卷积和池化大小长宽相等,则按一个计算就可。

  1. 卷积后:

  2. 池化后:

最后大小为

你可能感兴趣的:(深度学习)