简述
在网上看了很多的解释,自己又大致的理解了一下之后明白了。
卷积
首先我们得明白什么是卷积。
但是由于我们这里只想要推理padding的大小,所以只会讨论这个大小的问题。
- (n,n)和(n, n)的矩阵相乘,规模任然是(n, n)。
- 我们知道,卷积的过程,其实是kernal在整体输入上的一个滑动的过程。
- 首先我们得知道滑动的步长。(stride)
- 推理这个公式其实非常简单。
(original_size - (kernal_size - 1)) / stride
- 上面的公式现在还没有化简,但是其实非常容易理解的。就是原图删除掉(kernal-1)大小之后的区间除以stride后,向下整数。
- 减去那个部分是为了避免越界。
- 之后再除以步长,就是小学经典的,给定长度的路,再给定一个树之间的间距,来算能插入多少棵树的问题了。
上面的公式就给出了,经过一次卷积之后,生成的图的大小。
加上padding的卷积
上面部分其实是容易理解,加上padding有两个作用
padding的含义: 在四周加格子
1.使得整个图大小不会发生变化。
- 如果留心上面的操作的话,会发现,只有当
kernal=1
并且stride=1
的时候,新图的大小才能等于原始大小。否则只能更小。但是对于研究深度学习的人(调模型参数的菜鸡们),这个怎么可以容忍了,没有参数可以调了!!只能是1!那还搞什么啊! - 所以,加上了padding
加上padding之后,上面的公式就要发生修改了。
( O r i g i n a l S i z e − ( K e r n a l S i z e − 1 ) + 2 ∗ p a d d i n g ) / s t r i d e (OriginalSize - (KernalSize - 1) + 2 * padding) / stride (OriginalSize−(KernalSize−1)+2∗padding)/stride
因为padding如果是数值的话,表示的是两边都加。也就加了两遍的padding在origin的大小上,所以,就乘以2
2.使得整个图大小不会发生变化。
使得边缘的数据可以被用到。非常显然,这里的边缘数据都很少被用到的。
所以加上之后,扩充了整个图,让边缘的数据的用到次数得到提高。这样才能更好的得到整张图的特征。
实际上的公式
O u t p u t S i z e = I n p u t S i z e − K e r n a l S i z e + 2 ∗ P a d d i n g s t r i d e + 1 OutputSize = \frac{InputSize - KernalSize + 2 * Padding}{stride} + 1 OutputSize=strideInputSize−KernalSize+2∗Padding+1
非常奇怪,公式是这样的。
其实,当OutputSize这些都是2的倍数的时候,这个是没什么考虑的。
个人认为是考虑到有奇数的情况。但具体的我也没有经过数学推导证明过,如果有的话,欢迎大佬分享。
关于padding的数值
这里就引进了一个新的参数,那就是bias.
有兴趣的朋友可以自己查一查。
引用
https://blog.csdn.net/u012442157/article/details/78570505
https://pytorch.org/docs/stable/nn.html
https://blog.csdn.net/g11d111/article/details/82665265