点击小眼睛开启蜘蛛网特效

深度学习-TF、keras两种padding方式:vaild和same

前言

在使用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过程中采取的策略不同。

《深度学习-TF、keras两种padding方式:vaild和same》

“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:

    \[ Output\_height = Output\_width =\lceil \frac{ (W - F + 1)} { S} \rceil \]

same:

    \[ Output\_height = Output\_width =\lceil \frac{ W } { S}\rceil \]

其中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

  点赞
本篇文章采用 署名-非商业性使用-禁止演绎 4.0 国际 进行许可
转载请务必注明来源: https://oldpan.me/archives/tf-keras-padding-vaild-same

   关注Oldpan博客微信公众号,你最需要的及时推送给你。