首先看一下以下代码吧!
from keras.layers import Conv2D,Dense,Flatten
from keras.models import Sequential
model = 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×8
8
×
8
,卷积核的大小为
3×3
3
×
3
,步长为1,经过卷积操作之后得到的feature map的尺寸是
(8−3+1)×(8−3+1)=6×6
(
8
−
3
+
1
)
×
(
8
−
3
+
1
)
=
6
×
6
,feature map的尺寸和原始输入图像的尺寸是一样的。这样就解决了feature map尺寸越来越小的问题。同时从图中可以看出,卷积核对边缘信息的处理不止处理了一次,对边缘信息的提取更加充分了。