PyTorch神经网络批量与单独前向传播的输出差异原因问询
问题:批量与单独输入同一样本输出存在微小差异的原因
以下是复现问题的代码:
import torch import numpy as np import torch import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self, input_size, output_size): super(Net, self).__init__() self.net = nn.Sequential() self.fc1 = nn.Linear(input_size, 32) self.fc2 = nn.Linear(32, 32) self.fc3 = nn.Linear(32, output_size) def forward(self, x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net(input_size=10, output_size=1) x = torch.from_numpy(np.random.rand(2,10)).type(torch.FloatTensor) y = net(x) x0 = x[0,] y0 = net(x0) print(y[0,],y0) assert y0.item() == y[0,].item(), "Outputs not equal"
在这段代码中,向神经网络输入同一个样本,一次作为批量输入的一部分,一次单独输入,却得到了存在微小差异的输出。原本认为所有计算都是确定性的,想请教为何会出现这种情况?
解答
这种差异来自浮点数计算的精度误差,具体原因如下:
- 32位浮点数(
FloatTensor)的存储和计算本身存在精度限制,无法完全精确表示所有实数,运算过程中会产生舍入误差。 - 批量计算与单样本计算时,底层的运算顺序、内存对齐方式可能存在细微差别,导致误差的累积路径不同,最终输出出现极小的数值差异。
- 若将张量类型改为
DoubleTensor(64位浮点数),这种差异会显著缩小,但无法完全消除——只要是浮点数运算,精度误差就无法避免。
另外,代码中存在冗余的import torch语句,可清理以优化代码结构。
内容的提问来源于stack exchange,提问作者A J
相关产品推荐
相关产品推荐

