对于padding的理解分为两个方面,步长为1和步长大于或等于2。
一、当步长大于等于2时,比较容易理解,padding=="same"时,width和height向上取整, 缺少的部分用padding 0 来补足;padding=="valid"时,width和height向下取整, 多余的部分舍弃。以下列代码为例:
from keras.layers import Conv2D,Dense,Flatten
from keras.models import Sequential
model = Sequential()
model.add(Conv2D(filters = 32,kernel_size = [3,3],strides = [2,2],padding = 'valid',input_shape = [8,8,3]))
model.add(Flatten())
model.add(Dense(units = 10,activation = 'softmax'))
model.compile()
model.fit()
从model.add(Conv2D(filters = 32,kernel_size = [3,3],strides = [2,2],padding = 'valid',input_shape = [8,8,3]))可以看出,
卷积前,width=8, height=8, channel=3
卷积核为[3, 3], 步长为[2, 2],过滤器数为32
如果padding==“valid”,
width = math.floor((8-3)/2)+1, heigth = math.floor((8-3)/2+1, channel = 32
如果padding==“same”,
width = math.ceil((8-3)/2)+1, heigth = math.ceil((8-3)/2+1, channel = 32
二、当步长等于1时,padding=="valid"时,不作任何处理;当padding=="same"时,保持卷积后的width和height和卷积前一样,缺少的用padding0来补足,这样就可以防止由于卷积导致图像不断缩减。以下列代码为例:
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 = 'valid',input_shape = [8,8,3]))
model.add(Flatten())
model.add(Dense(units = 10,activation = 'softmax'))
model.compile()
model.fit()
从model.add(Conv2D(filters = 32,kernel_size = [3,3],strides = [1,1],padding = 'valid',input_shape = [8,8,3]))可以看出,
卷积前,width=8, height=8, channel=3
卷积核为[3, 3], 步长为[1, 1],过滤器数为32
如果padding==“valid”,
width = 8-3+1, heigth = 8-3+1, channel = 32
如果padding==“same”,
width = 8, heigth = 8, channel = 32