如何提高Pytorch模型的数值精度?

2024-06-16 10:59:16 发布

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

使用以下行:

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>)

Tags: selfdevicerealcudafntensorprintgrad
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位浮点数,这将提高计算的数值精度(通常是这样定义的),但不太可能有助于不确定性(这是您实际抱怨的)

model.eval() 这只对某些模块有任何影响。参见 培训/评估中行为细节的特殊模块 模式,例如:class:Dropout,:class:BatchNorm, 等等

相关问题 更多 >