【问题标题】:Why torch.nn.Conv2d has different result between '(n, n)' and 'n' arguments?为什么 torch.nn.Conv2d 在 '(n, n)' 和 'n' 参数之间有不同的结果?
【发布时间】:2021-10-01 08:03:29
【问题描述】:
input = torch.randn(8, 3, 50, 100)

m = nn.Conv2d(3, 3, kernel_size=(3, 3), padding=(1, 1))
m2 = nn.Conv2d(3, 3, kernel_size=3, padding=1)

output = m(input)
output2 = m2(input)

torch.equal(output, output2) >> False

我想上面 m 和 m2 Conv2d 应该有完全相同的输出值,但实际上不是,这是什么原因?

【问题讨论】:

    标签: machine-learning deep-learning pytorch conv-neural-network


    【解决方案1】:

    您已经使用相同的设置初始化了两个nn.Conv2d,这是真的。然而,权重的初始化是随机完成的!这里有两个不同的层 mm2。即m.weightm2.weigth 具有不同的组件,m.biasm2.bias 也是如此。

    获得相同结果的一种方法是复制模型的基础参数:

    >>> m.weight = m2.weight
    >>> m.bias = m2.bias
    

    当然,这会导致 torch.equal(m(input), m2(input)) 成为 True

    【讨论】:

    • 谢谢,在m.weight = m2.weight之后,Conv2d的结果是一样的
    【解决方案2】:

    这里的“问题”与inttuple 无关。事实上,如果你打印 mm2 你会看到

    >>> m
    Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    >>> m2
    Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    

    整数按照文档的承诺得到扩展。

    实际不同的是初始权重,我认为这只是随机的。您可以通过m.weightsm2.weights 查看它们。每次创建新的 Conv2d 时,这些参数都会有所不同,即使您使用相同的参数也是如此。

    如果您想以可预测的方式玩弄这些对象,您可以初始化权重,请参阅 How to initialize weights in PyTorch? 例如

    m.weight.data.fill_(0.01)
    m2.weight.data.fill_(0.01)
    m.bias.data.fill_(0.1)
    m2.bias.data.fill_(0.1)
    

    它们现在应该是相同的。

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 2011-11-16
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      相关资源
      最近更新 更多