# CNN中的卷积
## 卷积过程
- **什么是卷积层**:多个滤波器(卷积核)叠加便成了卷积层
- **一个卷积层有多少个参数**:一个卷积核使用一套权值以便”扫视’数据每一处时以同样的方式抽取特征,最终得到的是一种特征
**举例**:

**解析**:图中input 7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B三个颜色通道,可以看到周边有填充0; 有两个卷积核Filter w0、Filter w1,每个filter对应每个通道有一组w权重;一个filter滑动到一个位置后计算三个通道的卷积,求和,加bias,得到这个filter在该位置的最终结果;每个filter的输出是各个通道的汇总;输出的个数与filter个数相同。所以最右边能得到两个不同的输出

**第一层卷积的计算过程:**
第一个通道和对应权重的结果:``` 0*1+0*1+0*(-1)+0*(-1)+0*0+1*1+0*(-1)+0*(-1)+1*0 = 1 ```
第二个通道和对应权重的结果:``` 0*(-1)+0*0+0*(-1)+0*0+1*0+1*(-1)+0*1+0*(-1)+2*0 = -1 ```
第三个通道和对应权重的结果:``` 0*0+0*1+0*0+0*1+2*0+0*1+0*0+0*(-1)+0*0 = 0 ```
偏置:``` 1 ```
``` 1+(-1)+ 0 + 1 = 1 ```
## 卷积层尺寸的计算原理
**输入矩阵格式**:四个维度,依次为:样本数、图像高度、图像宽度、图像通道数
**输出矩阵格式**:与输出矩阵的维度顺序和含义相同,但是后三个维度(图像高度、图像宽度、图像通道数)的尺寸发生变化。
**权重矩阵(卷积核)格式**:同样是四个维度,但维度的含义与上面两者都不同,为:卷积核高度、卷积核宽度、输入通道数、输出通道数(卷积核个数)
输入矩阵、权重矩阵、输出矩阵这三者之间的相互决定关系
**卷积核的输入通道数**(in depth)由输入矩阵的通道数所决定。(红色标注)
**输出矩阵的通道数**(out depth)由卷积核的输出通道数所决定。(绿色标注)
**输出矩阵的高度和宽度**(height, width)这两个维度的尺寸由输入矩阵、卷积核、扫描方式所共同决定。计算公式如下。(蓝色标注)

```注:以下计算演示均省略掉了 Bias ,严格来说其实每个卷积核都还有一个 Bias 参数```
**标准卷积计算举例**
```
以 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
```

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

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

总结下来,其实只需要认识到,虽然输入的每一张图像本身具有三个维度,但是对于卷积核来讲依然只是一个一维向量。卷积核做的,其实就是与感受野范围内的像素点进行点积(而不是矩阵乘法)
**Reference:**
- [如何理解CNN中的卷积?](https://zhuanlan.zhihu.com/p/35083956)
- [CNN中卷积层的计算细节](https://zhuanlan.zhihu.com/p/29119239)
CNN中的卷积