前言
因为最近在自学CNN,在认识了卷积的一些基本概念后,对卷积过程中的一些过程有困惑,故想借助theano的conv2d函数加深理解。
问题
首先,对于conv2d的输入,第一层的输入往往是[多少张图片,RGB通道数,图片有多少行,图片有多少列], 权重的形状往往是[卷积核数量,三层特征图数,卷积核宽,卷积核高]。
假设输入图片是[1, 2, 1, 5],权重是[2,2,1,2],那么卷积的结果是[1, 2, 1, 4]。
明明权重是2*2个1*2,为什么最后得到的特征图数会更前面的卷积核数相同?
其实我们说的卷积核一般都是三维的,它是[上一层特征图数,宽,高]。进行卷积运算后还有一个求和的运算,这才是完整的conv2d。
实验
测试代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
输出的结果如下:
输入为(1,2,3,4,5),(1,2,3,4,5)
对于第一个卷积核(1,1)(1,1)得到的结果为(3,5,7,9),(3,5,7,9),两个相加就是第一个输出(6,10,14,18)。
总结
刚开始学,没有深入了解细节很多时候都会走弯路。特别是刚开始是用的是MNIST的单通道的进行学习,一旦用三通道的就开始傻了。