tf.nn.convolution中关于padding的"VALID" or "SAME"操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hzhj2007/article/details/81504993
tf.nn.convolution(input, filter, padding, strides=None, dilation_rate=None, name=None, data_format=None)

函数参数的解释详见该地址。本文仅对关注的padding和dilation_rate进行说明。

padding:填充算法,仅支持"VALID" or "SAME";

dilation_rate:可选参数,指定滤波器上采样或输入下采样的速率。论文中也叫input stride or dilation,有效滤波器的大小为spatial_filter_shape + (spatial_filter_shape - 1) * (rate - 1),是通过在任一维度上原始滤波器的连续元素间填充(dilation_rate[i]-1) 个0来获得。 若其任一维度的数值大于1时,则参数strides的值均为1.

data_format:指定输入或输出的通道维度在最后一维还是在第二维,对于1维数据,即N=1时,该参数的默认值为'NWC',也可指定为'NCW';当N=2时,默认为'NHWC',也可指定为'NCHW'‘;当N=3时,有效值为'NDHWC'。

特别的,当数据格式以'NC'开头时,输出数据的大小取决于padding的方法:

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]).

其中,ceil为向上取整,即ceil(0.1)=1。

此处关于1维数据的padding可以帮助更好的理解两个参数的处理过程。

  • "VALID" = without padding:

       inputs:         1  2  3  4  5  6  7  8  9  10 11 (12 13)
                      |________________|                dropped
                                     |_________________|
  • "SAME" = with zero padding:

                   pad|                                      |pad
       inputs:      0 |1  2  3  4  5  6  7  8  9  10 11 12 13|0  0
                   |________________|
                                  |_________________|
                                                 |________________|
  • 输入数据宽度= 13
  • 滤波器宽度 = 6
  • 步长 = 5

ps:

  • "VALID" 仅舍弃最后列,或最后行的数据
  • "SAME" 尝试在数据左右均匀的填充0,若填充个数为奇数时,则将多余的填充值放数据右侧,如本例中所示。垂直方向也是类似的处理逻辑。

参考文献:

  1. https://www.tensorflow.org/versions/r1.0/api_docs/python/tf/nn/convolution
  2. https://stackoverflow.com/questions/37674306/what-is-the-difference-between-same-and-valid-padding-in-tf-nn-max-pool-of-t

猜你喜欢

转载自blog.csdn.net/hzhj2007/article/details/81504993