20 卷积层里的填充和步幅【动手学深度学习v2】

卷积层里的填充和步幅
填充

- mnist中的都是32*32大小的图片
- 第一层为什么得到的输出是28*28?这里的步长应该是默认为1,到最右边的时候会剩下四列元素不能全部被5*5的卷积核看到(因为这里没有用池化),所以卷积核在横向移动的过程中走了28步之后,就不能再往右边走了,因为再往右边走的话,卷积核的所覆盖的部分列就没有输入的,这里由于没有采取池化操作,因此输入最右边的4列就被舍弃掉了,因为只走了28步,所以最后输出就是28*28了(高宽同理)
- 第七层得到的输出为什么是4*4?由第一层卷积得到28*28的输出可知,每做一次卷积操作就会舍去4个输出,所以做完7次卷积之后输出的大小为(32-4*7)*(32-4*7)= 4*4
- 更大的卷积核可以更快地减小输出的大小
特别是当用比较大的卷积核的时候,假设不想让输出变得太小怎么办?(随着卷积层的增加,输出会越来越小)
1、填充

- 填充就是在输入的四周加入一些额外的行和列,这样可以使的通过卷积层之后的输出变得比之前更大一些
- 上图的输入中中间3*3的矩阵是原始的输入,在它的上下左右分别填充了一些零,填充之后再做卷积会发现输出会由2*2变成4*4,也就是说输出比输入还要大(多出了一行一列)

- p表示padding
- 通常会填充卷积核的高宽减一的值,这样做的好处是输出和输入的形状不会发生变化(将其代入上图中的第一个公式就能得到),这样的话,不管选取多大的卷积核,都不会改变输出的形状
- 具体在填充的时候如果卷积核的大小是奇数的话,就在输入的上下两侧填充,当卷积核的大小为偶数的时候(卷积核的大小很少选取为偶数),在输入的上侧会多填一行,下侧会少填一行(反过来其实也可以,但是一般也差不多)
2、步幅

- 假设输入比较大的话需要进行大量的计算
- 上图中应该是需要55层才能将输入降低到4*4,因为每做一次卷积操作输出的大小减少4,所以需要55次卷积操作才能将输出降低到4*4
- 输出大小是跟卷积层的层数线性相关的,步幅可以将其变成指数相关

- 步幅指的滑动窗口在行/列上移动的步长,也就是往右走多少列,往下走多少行
- 具体的计算如下图所示

- 往下取整
总结

- 填充是让输出不变或者是变大
- 当输入的大小很大的时候,可以通过控制步幅来减少计算量
----end----