You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:28:35