卷积神经网络之填充和步幅 学习笔记
github代码地址:https://github.com/taichuai/d2l_zh_tensorflow2.0
API讲解:Conv2D(filter, padding, kernel_size=None,strides=None, name=None),具体细节建议查看源码
注意这里是两侧分别填充1行或列,所以在两侧一共填充2行或列
inputs: 在tensorflow中,X 的输入形状, 需要 4 维,batch * h * w * 通道数,其他框架有所不同
filters:卷积核个数
kernel_size: 核尺寸 h * w
padding: ‘SAME’ or ‘VALID’ 'VALID’表示0填充。注意:'SAME’并不是表示输入输出尺寸大小一样,只是考虑边界,如果不够用0填充
strides:步长 可以输入一个元组,也可以是一个整数,整数表示长宽方向步长相同
def comp_conv2d(conv2d, X):
# 将 X 转换成 [1,h,w, 1],即 batch * h * w * 通道数的个数
X = tf.reshape(X,(1,) + X.shape + (1,))
# X = tf.reshape(X,X.shape)
Y = conv2d(X)
#input_shape = (samples, rows, cols, channels)
return tf.reshape(Y,Y.shape[1:3])
# 注意这里是两侧分别填充1行或列,所以在两侧一共填充2行或列
# Conv2D(filter, padding, kernel_size=None,strides=None, name=None)
# filters:卷积核个数
# kernel_size: 核尺寸 h * w
# padding: 'SAME' or 'VALID' 'VALID'表示0填充。注意:'SAME'并不是表示输入输出尺寸大小一样,只是考虑边界,如果不够用0填充
# strides:步长 可以输入一个元组,也可以是一个整数,整数表示长宽方向步长相同
conv2d = tf.keras.layers.Conv2D(1, kernel_size=3, padding='same',strides=(2,2))
X = tf.random.uniform(shape=(8,8))
# 注意函数中 X 的输入形状, 需要 4 维,batch * h * w * 通道数
comp_conv2d(conv2d,X).shape
conv2d = tf.keras.layers.Conv2D(1, kernel_size=3, padding='same',strides=2)
comp_conv2d(conv2d, X).shape
接下来是一个稍微复杂点儿的例子。
conv2d = tf.keras.layers.Conv2D(1, kernel_size=(3,5), padding='valid', strides=(3,4))
comp_conv2d(conv2d, X).shape
关于padding,再补充一点,参考自:https://oldpan.me/archives/tf-keras-padding-vaild-same
tensorflow中有两种padding方式:vaild和same,两种方式有所区别
有时候会遇到这样的代码
x = Conv2D(filters, kernel_size=5, strides=2, padding='same')(x)
,与pytorch不同,tensorflow
和TensorFlow
设置卷积层的过程中可以设置padding参数,vaild
和same
。“valid”代表只进行有效的卷积,对边界数据不处理。“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。
那vaild和same有什么区别,两者本质区别就是padding过程中采取的策略不同。