1. 卷积层尺寸和计算量的原理

  • CNN输入输出格式说明
  • 输入矩阵格式:四个维度,依次为:样本数、图像高度、图像宽度、图像通道数(batch_size,height,width,depth)
  • 输出矩阵格式:与输出矩阵的维度顺序和含义相同,但是后三个维度(图像高度、图像宽度、图像通道数)的尺寸发生变化。(batch_size, height, width, depth)
  • 权重矩阵(卷积核)格式:同样是四个维度,但维度的含义与上面两者都不同,为:卷积核高度、卷积核宽度、输入通道数、输出通道数(卷积核个数)
  • 注意:每个输入通道数(比如RGB)都有独立的二维卷积核,所有通道结果相加得到一个输出通道结果。
  • 输入矩阵、权重矩阵、输出矩阵三者之间的相互决定关系
  • 卷积核的输入通道数(in depth)由输入矩阵的通道数所决定。(下列图中的红色标注)
  • 输出矩阵的通道数(out depth)由卷积核的输出通道数所决定。(下列图中的绿色标注)
  • 输出矩阵的高度和宽度(height, width)这两个维度的尺寸由输入矩阵、卷积核、扫描方式所共同决定。计算公式如下。(下列图中的蓝色标注)
  • 卷积尺寸计算公式

stride 的数值为 S, padding 的数值为 P。

new_height = (input_height - filter_height + 2 * P)/S + 1
new_width = (input_width - filter_width + 2 * P)/S + 1

在卷积的时候有一个参数叫padding, 它的取值为same或者valid, valid则P=0,same则P不等于0,这个参数在有些时候会对模型造成较大的影响!

首先看一下valid的情况,即padding=0的时候的情况,不能整除时,一般去掉小数部分取整,如计算出来的new_height/new_width如果等于4.5,则取4(注意向下取整。0.5 取 0; -0.5取-1);实际上,这也就意味着当剩余图像的维度小于卷积核尺度的时候,就不进行卷积了,所以可能会丢失边缘信息,不过边缘信息一般不太重要。

接着是same,此时padding不等于0,那它应该等于几呢?在我实践过程的理解中,same的作用是为了达到如下目的

卷积神经网络输出不同尺寸的特征图 卷积神经网络输入尺寸_深度学习

因此,可以计算出来:

卷积神经网络输出不同尺寸的特征图 卷积神经网络输入尺寸_卷积神经网络维度计算_02

实际中,通道数一般为偶数,卷积核一般是奇数,这样在SAME模式下可以确保整除

2. 输入输出矩阵维度举例

以下计算演示均省略掉了 Bias ,严格来说其实每个卷积核都还有一个 Bias 参数。

(1)标准卷积计算举例

以 AlexNet 模型的第一个卷积层为例

  • 输入图片的尺寸统一为 227 x 227 x 3 (高度 x 宽度 x 颜色通道数),
  • 本层一共具有96个卷积核,
  • 每个卷积核的尺寸都是 11 x 11 x 3。
  • 已知 stride = 4, padding = 0,
  • 假设 batch_size = 256,
  • 则输出矩阵的高度和宽度为 (227 - 11) / 4 + 1 = 55

(2)1x1卷积计算举例

后期 GoogLeNet、ResNet 等经典模型中普遍使用一个像素大小的卷积核作为降低参数复杂度的手段。从下面的运算可以看到,其实 1 x 1 卷积没有什么神秘的,其作用就是将输入矩阵的通道数量缩减后输出(512 降为 32),并保持它在宽度和高度维度上的尺寸(227 x 227),简言之就是高度和宽度不变,缩减通道数而已

卷积神经网络输出不同尺寸的特征图 卷积神经网络输入尺寸_深度学习_03

(3)全连接层计算举例

实际上,全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1。

卷积神经网络输出不同尺寸的特征图 卷积神经网络输入尺寸_卷积神经网络维度计算_04

总结下来,其实只需要认识到,虽然输入的每一张图像本身具有三个维度,但是对于卷积核来讲依然只是一个一维向量。卷积核做的,其实就是与感受野范围内的像素点进行点积(而不是矩阵乘法)。