如何防止 PyTorch 对我分配的值进行微小更改

问题描述

PyTorch 对我指定的值几乎没有改变,这会导致我的神经网络产生非常不同的结果。例如:

a = [234678.5462495405945]
b = torch.tensor(a)
print(b.item())

输出为:

234678.546875

PyTorch 对我的变量 a 所做的微小改变在我的神经网络中导致了完全不同的结果。我的神经网络是一个非常敏感的网络。如何防止 PyTorch 对分配的值进行微小更改?

解决方法

你的问题很广泛;你还没有向我们展示你的网络。这意味着我们没有人能够解决真正的问题。但是你展示的代码示例范围更有限:为什么 PyTorch 改变我的浮动?

PyTorch 默认使用单精度浮点数(现在称为 binary32)。 Python 默认使用双精度浮点数(现在称为 binary64)。当您从 Python 浮点数转换为 PyTorch FloatTensor 时,您会失去精度。 (这称为舍入。)

如果需要,您可以指定数据类型,但是您的整个网络必须转换为 binary64。

举个例子:

import torch
a = 234678.5462495405945
b = torch.tensor(a,dtype=torch.float64)
print(b.item())
# 234678.54624954058

如果您的网络如此敏感,您可能会遇到更大的问题。您可能过度拟合,或者您过于专注于一个训练示例。在量化网络和显示使用低精度数字时的性能曲线方面已经做了大量工作。