张量流的 tf.nn.max_pool 中的“SAME”和“VALID”填充有什么区别?

新手上路,请多包涵

tf.nn.max_pooltensorflow 中的“相同”和“有效”填充有什么区别?

在我看来,“有效”意味着当我们做最大池时,边缘之外不会有零填充。

根据 深度学习卷积算法指南,它说池运算符中不会有填充,即只使用 tensorflow 的“有效”。但是 tensorflow 中最大池的“相同”填充是什么?

原文由 karl_TUM 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 974
2 个回答

我将举一个例子使其更清楚:

  • x : 形状为 [2, 3] 的输入图像,1 通道
  • valid_pad :具有 2x2 内核、步幅 2 和 VALID 填充的最大池。
  • same_pad :具有 2x2 内核、步幅 2 和相同填充的最大池(这是 经典 的方法)

输出形状为:

  • valid_pad :这里没有填充,所以输出形状是 [1, 1]
  • same_pad :在这里,我们将图像填充到形状 [2, 4] (使用 -inf 然后应用最大池),所以输出形状是 [1, 2]

 x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.]])

x = tf.reshape(x, [1, 2, 3, 1])  # give a shape accepted by tf.nn.max_pool

valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')

valid_pad.get_shape() == [1, 1, 1, 1]  # valid_pad is [5.]
same_pad.get_shape() == [1, 1, 2, 1]   # same_pad is  [5., 6.]


原文由 Olivier Moindrot 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你喜欢 ascii 艺术:

  • "VALID" = 无填充:
      inputs:         1  2  3  4  5  6  7  8  9  10 11 (12 13)
                    |________________|                dropped
                                   |_________________|

  • "SAME" = 零填充:
                  pad|                                      |pad
     inputs:      0 |1  2  3  4  5  6  7  8  9  10 11 12 13|0  0
                 |________________|
                                |_________________|
                                               |________________|

在这个例子中:

  • 输入宽度 = 13
  • 过滤器宽度 = 6
  • 步幅 = 5

笔记:

  • "VALID" 只删除最右边的列(或最底部的行)。
  • "SAME" 尝试左右均匀填充,但如果要添加的列数是奇数,它将在右侧添加额外的列,如本例中的情况(相同的逻辑适用于垂直:底部可能有一行额外的零)。

编辑

关于名称:

  • 使用 "SAME" 填充,如果您使用步幅 1,则该层的输出将具有与其输入 相同 的空间维度。
  • 使用 "VALID" 填充,没有“虚构的”填充输入。该层仅使用 有效 的输入数据。

原文由 MiniQuark 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题