在卷积神经网络中,由于卷积核在输入的数据上滑动时,输出的总是一个尺寸更小的数据,假如神经网络有很多层,那么最后输出的图片不仅尺寸会跟初始数据不一样,还会有很多特征丢失。为了防止这种情况,同时尽可能地保留初始特征,也就是尽可能地让边缘的数据参与激活函数的运算,我们会在滑动前,对数据做零填充,即在数据外多一层填充了0的数据,从而让输出的数据保持原来的尺寸。假设输入的数据是7×7,卷积核是3×3,步幅为1的话,这样输出的就是5×5的尺寸,而在外围包了一层后,原来的尺寸就变成了9×9,输出也就变为了7×7,而由于我们使用的0填充,做了点积运算后,结果还是0,不影响实际的运算。
当然,在实际使用中,图片的数据是有深度的,比如32×32×3,这里的3指的就是图像数据的3个通道,比如红,绿,蓝,所以我们的输出的数据理所当然的也会有深度,但并不是对齐输入数据的深度,输出数据的深度取决于我们所用的卷积核的数量,这是因为不管输入数据的深度是多少,卷积核的深度与其保持一致,做了点积后输出的是尺寸×尺寸×1,然后再乘以卷积核的数量,也就是输出的数据叠在一起(有多少个卷积核就有多少个数据叠在一起)。注意,最终输出的数据的参数总数,等于输出数据的长乘宽后要加1再乘以深度,这里的1指的是偏置项,适用于调整权重矩阵的。
总的来说,卷积改变的是输入数据的深度,可以想象一下假如用的卷积核是1×1的尺寸,那么你选用的个数,就是你输出的数据的深度,即通过卷积改变了输入数据的深度,同时提取到了一部分特征(比较边缘化)。
而池化层部分,改变的则是数据的宽度,即尺寸的长和宽,这么做的意义是,减少输出数据的参数量,让训练不会过于复杂(且池化层部分是没有超参数的,计算复杂度更小),从而能让模型更好地学习到特征,对后续图片的分类有更大的帮助。一般我们用最大池化法,也就是选定每个区域内最显著的那个参数作为输出,而步幅我们会选择在滑动时尽量没有重叠的大小,比如输入的尺寸是4×4,池化器的大小是2×2,那么步幅就设置为2,滑动3次就将输入的数据的区域都覆盖过了。这部分也不需要做0填充,因为池化本质就是在减少数据的宽度,不需要担心有边缘数据因为大小限制没被纳入。
学习来自于斯坦福教程:Stanford University CS231n: Deep Learning for Computer Vision