在 tensorflow 的范围内本地指定一个参数是否会覆盖所有相同类型的后续参数?

Does locally specifying an argument in a scope in tensorflow overwrite all following arguments of the same type?

我目前正在尝试了解 inception-v3 架构并仔细研究模型层的定义:

with scopes.arg_scope([ops.conv2d, ops.max_pool, ops.avg_pool],stride=1, padding=’VALID’):
    # 299 x 299 x 3
    end_points[’conv0’] = ops.conv2d(inputs, 32, [3, 3], stride=2,scope=’conv0’)
    # 149 x 149 x 32
    end_points[’conv1’] = ops.conv2d(end_points[’conv0’], 32, [3, 3], scope=’conv1’)
    # 147 x 147 x 32
    end_points[’conv2’] = ops.conv2d(end_points[’conv1’], 64, [3, 3], padding=’SAME’, scope=’conv2’)
    # 147 x 147 x 64
    end_points[’pool1’] = ops.max_pool(end_points[’conv2’], [3, 3], stride=2, scope=’pool1’)
    # 73 x 73 x 64
    end_points[’conv3’] = ops.conv2d(end_points[’pool1’], 80, [1, 1], scope=’conv3’)
    # 73 x 73 x 80.
    end_points[’conv4’] = ops.conv2d(end_points[’conv3’], 192, [3, 3], scope=’conv4’)
    # 71 x 71 x 192.
    end_points[’pool2’] = ops.max_pool(end_points[’conv4’], [3, 3], stride=2, scope=’pool2’)
    # 35 x 35 x 192.
    net = end_points[’pool2’]

检查每一层的尺寸,我首先要看一下不同的填充样式:VALIDSAMEVALID 将丢弃边缘,而 SAME 实际上会在两侧均等填充,因此卷积仍然适用于边缘。 例如,这适用于具有 299x299 像素到 149x149 的第一层,步长为 2,因此我们只考虑所有奇数像素 [过滤器大小:[3,3]] 并最终得到 149x149 的尺寸,而不是 150x150,因为填充是VALID(边缘被丢弃)。再次卷积这一层,使用相同的过滤器大小,但现在步幅为 1,由于边缘 "suffering" 被丢弃,我们得到 147x147。然后这一层再次卷积,但现在有了扭曲,填充被设置为 SAME,这导致与之前的层相同的尺寸 147x147。

现在让我困惑的地方来了: 假设 SAME 填充仅对 conv2 层有效并且全局仍设置为 VALIDpool1 的维度由于丢弃边缘而正确显示为 73x73。当现在进入下一个卷积层 conv3 时,我希望它变成 71x71,将 VALID 填充设为活动状态。但是,conv3 的输出仍为 73x73,这意味着使用了 SAME 填充。但是在 conv4 中,填充现在似乎是 VALID,将尺寸减小到 71x71 完全让我感到困惑。

在 slim 的 github 的自述文件中 arg_scope 我发现,在本地设置参数之一会覆盖给定的全局参数:

with slim.arg_scope([slim.ops.conv2d], padding='SAME', stddev=0.01, weight_decay=0.0005):
    net = slim.ops.conv2d(inputs, 64, [11, 11], scope='conv1')
    net = slim.ops.conv2d(net, 128, [11, 11], padding='VALID', scope='conv2')
    net = slim.ops.conv2d(net, 256, [11, 11], scope='conv3')

As the example illustrates, the use of arg_scope makes the code cleaner, simpler and easier to maintain. Notice that while argument values are specifed in the arg_scope, they can be overwritten locally. In particular, while the padding argument has been set to 'SAME', the second convolution overrides it with the value of 'VALID'.

然而,这意味着 conv4 也应该具有 73x73 的维度,因为填充将是 SAME,因此保留边缘和最终池化层 pool2甚至是 37x37.

我错过了什么?我的错误在哪里? 谢谢你的帮助,我希望我已经把这个令人困惑的问题弄清楚了。

我没有看到 pool1 层的过滤器大小实际上是 [1,1] 所以它没有减少维度并且与 arg_scope 无关,因为它保持不变究竟应该如何。