目录
CNN
- 局部连接:不是全连接,而是使用size相对input小的kernel在局部感受视野内进行连接(点积运算)
- 权值共享:在一个卷积核运算中,每次都运算一个感受视野,通过滑动遍历的把整个输入都卷积完成,而不是每移动一次就更换卷积核参数
两者目的都是减少参数。通过局部感受视野,通过卷积操作获取高阶特征,能达到比较好的效果。
内部计算
- 先看卷积(卷积核与感受视野的点积)与池化示意图:部分图片来自于:链接


- 输入、卷积、池化形状定义:
- 输入为(长,宽,RGB通道数)=(7*7*3)的图片,即inputs = (batch_size, 7, 7, 3)
- 卷积核为(长,宽,卷积通道数,卷积核个数),即filter = (3, 3, 3, 32)。
- 池化为(长,宽,步长)
- 标准卷积运算过程:
- 对于输入没有疑问,对于卷积操作,定义的32个卷积核,每一个卷积核都有3个通道,相同的卷积核在三个通道的卷积核参数不相同,只有尺寸相同,每个卷积核都有3个尺寸但参数不一样的变量,最后该卷积核的结果为每个通道的卷积结果相加,得到卷积后的新通道。卷积核的个数为卷积完成后新的通道数。
- 参数个数为 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卷积的作用
- 可以实现通道的维度变化,如增加卷积后的通道数和减少卷积后的通道数
- 进行非线性映射(也就是多通道信息交互):使用多通道卷积后的结果相加作特征映射,而不是单一通道
卷积和池化后的大小计算
给定的值:原大小, 卷积核大小
, 池化大小
, 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)之后,输出特征图大小为:
解:由于原图片、卷积和池化大小长宽相等,则按一个计算就可。
-
卷积后:
-
池化后:
最后大小为