卷积神经网络中的padding理解
首先看一下以下代码吧!from keras.layers import Conv2D,Dense,Flattenfrom keras.models import Sequentialmodel = Sequential()model.add(Conv2D(filters = 32,kernel_size = [3,3],strides = [1,1],padding = 'same',input_shape = [6,6,3]))model.add(Flatten())model.add(Dense(units = 10,activation = 'softmax'))model.compile()model.fit()问题的来源是这样的,卷积层的基本实现原理不难,但是当看到代码中的参数padding的时候感觉不是很明白,这里简单写一下自己的理解。
上图是简单的卷积处理方式,假设原始图片的尺寸是6x6,卷积核的大小是3x3,滑动步长为1,那么按照卷积核的滑动方式,我们可以得到feature map的尺寸为 (6−3+1)×(6−3+1)(6−3+1)×(6−3+1),但是这样的处理方式会有两个缺点:1.卷积后的矩阵越变越小(如果卷积层100层,每一层都缩小最终得到的将是很小的图片)2.输入矩阵(左)边缘像素(绿阴影)只被计算过一次,而中间像素(红阴影)被卷积计算多次,意味着丢失图像角落信息。为了解决这两个问题,就对输入图像进行padding,即填充像素
可以看到上图在原始图像的边缘用了像素填充,像素填充后的尺寸变为8×88×8,卷积核的大小为3×33×3,步长为1,经过卷积操作之后得到的feature map的尺寸是 (8−3+1)×(8−3+1)=6×6(8−3+1)×(8−3+1)=6×6,feature map的尺寸和原始输入图像的尺寸是一样的。这样就解决了feature map尺寸越来越小的问题。同时从图中可以看出,卷积核对边缘信息的处理不止处理了一次,对边缘信息的提取更加充分了。padding有三种参数可以设定:参数介绍valid不填充,只删除最右边的列(或者最低端的行)same填充输入以使输出具有与原始输入相同的长度。尽可能两边添加同样数目的零列,如果要添加的列数为奇数个。那么让右边列的个数多一个即可。(竖直方向采用同样的方法)causal表示因果(膨胀)卷积