keras中padding详细介绍
背景
conv2d和conv2dTranspose属于最常用的层,但在keras的实现中关于padding的部分有点模糊,周末趁着空闲做了一些尝试,来实验padding的valid和same参数在实际过程中如何操作的.
详细介绍
conv2D演示代码
conv2D部分
v_input = np.ones([1,5,5,1])
kernel = np.ones([3,3])
stride = 1
model = Sequential()
model.add(Conv2D(1, kernel_size=(3, 3),
activation='relu',
padding="valid" , # "same"
strides = 1,
# dilation_rate = 1,
kernel_initializer = keras.initializers.Ones(),
input_shape=v_input.shape[1:]))
其中stride可以尝试多组测试
padding在valid 和 same 间切换测试
Conv2d演示结论
padding 为valid则不进行填充, 根据stride的滑动大小来做平移, 则:
output_shape = ceil( (input_shape - (kernel_size - 1)) / stride )
如果是same模式则 会进行左右上下的补齐, 其中左,上依次补齐 flood (kernel_size -1 ) / 2 , 右下补齐ceil (( kernel_size - 1) /2 ) ,补齐后进行的操作就是类似valid下的滑动卷积
output_shape = ceil (input_shape / stride)
ceil表示上取整 flood表示下取整
CONV2Dtranspose演示代码
v_input = np.ones([1,5,5,1])
kernel = np.ones([3,3])
stride = 1
model = Sequential()
model.add(Conv2DTranspose(1, kernel_size=(3, 3),
activation='relu',
padding="valid" , # "same"
strides = 1,
# dilation_rate = 1,
kernel_initializer = keras.initializers.Ones(),
input_shape=v_input.shape[1:]))
如果padding的设置为valid则,保持最小相交的原则上下左右均填充kernel_size大小,如果stride设置为非1,起实际的作用和dilation_rate一样均是在矩阵中进行填充(实际滑动是永远都是1) 具体填充出来的矩阵大小是 (input_size -1) * stride + 1 + 2 * (kernel_size - 1)
之后就是按照这个矩阵做着类似conv2d valid的卷积 则:
output_shape = (input_size -1) * stride + 1 + 2 * (kernel_size - 1) - (kernel_size -1) = (input_size - 1) * stride + kernel_size
如果padding为same的话则output_shape = input_shape * stride
其中原始矩阵左上padding = ceil (( kernel_size ) /2 ) 右下补齐 flood (( kernel_size ) /2 ) 这里conv2d