使用以下行:
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>)
在处理浮点值时,某些实值运算的associativity不会保留。例如,这意味着不能保证
(a + b) + c == a + (b + c)
在您每天处理的大多数代码中,操作的顺序是固定的,因此您只能观察
(a + b) + c
或a + (b + c)
(取决于编写它的程序员),但是在PyTorch中,在CUDA后端,有一系列这样的操作是不确定顺序的(由于并行性)。这意味着在你的self.netG(self.real_A)
的一次跑步中,你可以观察(a + b) + c
,在另一次a + (b + c)
。如果没有看到你的代码,你就不知道了,但这很可能是你惊喜的来源。在PyTorch docs中给出了更多信息编辑:显然,您也可以将计算转换为64位浮点数,这将提高计算的数值精度(通常是这样定义的),但不太可能有助于不确定性(这是您实际抱怨的)
model.eval() 这只对某些模块有任何影响。参见 培训/评估中行为细节的特殊模块 模式,例如:class:
Dropout
,:class:BatchNorm
, 等等相关问题 更多 >
编程相关推荐