【问题标题】:How to increase numerical accuracy of Pytorch model?如何提高 Pytorch 模型的数值精度?
【发布时间】:2020-01-29 00:03:13
【问题描述】:

使用以下行:

print(self.netG(self.real_A)-self.netG(self.real_A))

我想我可以得到一个全零张量,但是没有。

tensor([[ [[-0.0032,  0.0089, -0.0085,  ..., -0.0027,  0.0004, -0.0022],
          [-0.0019, -0.0022,  0.0775,  ...,  0.0236, -0.0277, -0.0125],
          [ 0.0049,  0.0159,  0.0203,  ..., -0.0212,  0.0010, -0.0069],
          ...,
          [ 0.0042,  0.0081, -0.0127,  ..., -0.0097,  0.0136, -0.0002],
          [-0.0010,  0.0020, -0.0066,  ...,  0.0260,  0.0433,  0.0088],
          [-0.0023,  0.0095,  0.0125,  ...,  0.0005,  0.0090,  0.0029]]]],
       device='cuda:0', grad_fn=<SubBackward0>)

【问题讨论】:

标签: python pytorch


【解决方案1】:

model.eval() 这仅对某些模块有任何影响。参见文档 特定模块,了解他们在培训/评估中的行为细节 模式,如果他们受到影响,例如:class:Dropout, :class:BatchNorm, 等等

【讨论】:

    【解决方案2】:

    使用浮点值时,associativity 的某些实值运算不会被保留。例如,这意味着不能保证(a + b) + c == a + (b + c)

    在您每天处理的大多数代码中,操作顺序是固定的,因此您只能观察到 (a + b) + ca + (b + c)(取决于编写它的程序员),但在 PyTorch 中,在 CUDA 后端,有一系列这样的操作,这些操作不是确定性的(由于并行性)。这意味着在您的self.netG(self.real_A) 的一次运行中,您可以观察(a + b) + c 和另一个a + (b + c)。如果没有看到您的代码,就无法分辨,但这可能是您惊喜的来源。 PyTorch docs 中提供了更多信息。

    编辑:显然,您也可以将计算转换为 64 位浮点数,这将提高计算的数值准确性(如通常定义的那样),但不太可能有助于解决不确定性(这就是您的实际上是在抱怨)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-10
      • 2019-08-11
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2020-08-06
      • 2016-10-30
      相关资源
      最近更新 更多