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

2024-04-26 09:17:05 发布

您现在位置:Python中文网/ 问答频道 /正文

tensorflowtf.nn.max_pool中,“相同”和“有效”填充有什么区别?

在我看来,'VALID'意味着当我们做max pool时,不会有零填充。

根据A guide to convolution arithmetic for deep learning,它表示pool运算符中不会有填充,即只使用tensorflow的“VALID”。 但是tensorflow中最大池的“相同”填充是什么?


Tags: tofortftensorflow运算符nnarithmeticmax
3条回答

stride为1时(对于卷积比池更典型),我们可以考虑以下区别:

  • "SAME":输出大小与输入大小相同。这需要过滤器窗口滑出输入映射,因此需要填充。
  • "VALID":过滤窗口保持在输入映射内的有效位置,因此输出大小缩小filter_size - 1。不出现填充。

我举一个例子来说明:

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

输出形状为:

  • valid_pad:这里没有填充,所以输出形状是[1,1]
  • same_pad:这里,我们将图像填充到形状[2,4]上(使用-inf),然后应用max pool),因此输出形状为[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.]

如果您喜欢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"填充,就没有“组合”填充输入。该层仅使用有效的输入数据。

相关问题 更多 >