前言
在使用Keras的时候会遇到这样的代码x = Conv2D(filters, kernel_size=5, strides=2, padding='same')(x)
,与pytorch不同,keras和TensorFlow设置卷积层的过程中可以设置padding
参数,vaild和same。“valid”代表只进行有效的卷积,对边界数据不处理。“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。
分析
那vaild和same有什么区别,两者本质区别就是padding过程中采取的策略不同。
“valid”
valid即只对图像中像素点“恰好”与卷积层对齐的部分进行卷积。上图中一维演示中输入宽度为13,卷积宽度为6,每次前进5格,当进行到(12、13)的时候因为每次步伐为5,5>2,所以(12、13)就不进行卷积了,舍弃了最右边的这两个数。
“same”
same则不同,尽可能对原始的输入左右两边进行padding从而使卷积核刚好全部覆盖所有输入,当进行padding后如果输入的宽度为奇数则会在右边再padding一下(如上图15+1=16,右边两个pad,左边一个pad)。
上面是按照1D的形式来进行讲解的,2D的形式原理也相同。
valid:
same:
其中W为输入的宽度、F为卷积filter的size,S为步长(Stride)。
下面是TensorFlow中相关的源码:
If padding == "SAME": output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i]) If padding == "VALID": output_spatial_shape[i] = ceil((input_spatial_shape[i] - (spatial_filter_shape[i]-1) * dilation_rate[i]) / strides[i]). Raises: ValueError: If input/output depth does not match `filter` shape, if padding is other than "VALID" or "SAME", or if data_format is invalid.
参考链接:
https://stackoverflow.com/questions/37674306/what-is-the-difference-between-same-and-valid-padding-in-tf-nn-max-pool-of-t
http://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/
https://blog.csdn.net/wuzqchom/article/details/74785643