keras 中padding 的 same,valid 的两种方式以及验证
输入数据
input_shape = (批量,高,宽,通道)
import numpy as np
import tensorflow as tf
input_shape = (1, 4, 4, 1)
x = np.arange(np.prod(input_shape)).reshape(input_shape).astype(np.float64)
(1)构建 padding= “same” 的卷积层并计算
initializer = tf.keras.initializers.Constant(2.)
y = tf.keras.layers.Conv2D(1, 4, strides=(3,3),input_shape=input_shape[1:], kernel_initializer=initializer, padding= "same")(x)
输出y 和 x
y
Out[16]:
<tf.Tensor: shape=(1, 2, 2, 1), dtype=float32, numpy=
array([[[[ 90.],
[ 78.]],
[[132.],
[100.]]]], dtype=float32)>
x
Out[17]:
array([[[[ 0.],
[ 1.],
[ 2.],
[ 3.]],
[[ 4.],
[ 5.],
[ 6.],
[ 7.]],
[[ 8.],
[ 9.],
[10.],
[11.]],
[[12.],
[13.],
[14.],
[15.]]]])
总结:
一共需要填充三行三列的0
计算y[1][0][0][1]:(0+1+2+4+5+6+8+9+10)*2 = 90; 左上侧填充一行一列
计算y[1][1][1][1]:(10+11+14+15)*2 = 100; 右下侧填充两行两列
(2)构建 padding= “valid” 的卷积层并计算,改变步长 strides=(3,3)
y = tf.keras.layers.Conv2D(1, 2, strides=(3,3),input_shape=input_shape[1:], kernel_initializer=initializer, padding= "valid")(x)
输出 y
y
Out[21]: <tf.Tensor: shape=(1, 1, 1, 1), dtype=float32, numpy=array([[[[20.]]]], dtype=float32)>
总结:
padding= “valid” 的时候剔除边界像素在右下方