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

PIL转Torch Tensor与转Numpy数组求和结果不同的原因及解决方法

问题原因

  • 核心差异来自torchvision.transforms.ToTensor()的默认归一化操作:当输入是PIL图像或者uint8类型的Numpy数组时,ToTensor()会自动将原始0255范围的像素值*除以255*,映射到0.01.0的浮点区间,只会改变数据量级,不会改变相对统计关系。
  • 你的输出结果完全符合这个比例换算:14513196 / 255 ≈ 56914.494,和你得到的torch_img.sum()的56914.496几乎一致,微小的差值来自PyTorch和Numpy的浮点计算精度差异,属于正常情况。
  • 额外说明:ToTensor()还会自动调整维度顺序,把PIL/Numpy默认的(H, W, C)格式转换为PyTorch常用的(C, H, W)格式,该操作仅调整像素存储顺序,不会影响求和结果。

让两个求和结果相等的操作

方法1:将Numpy数组和ToTensor逻辑对齐,做0~1归一化

对Numpy浮点数组手动除以255即可:

numpy_img_float = np.asarray(img).astype(np.float32) / 255.0
print(torch_img.sum(), numpy_img_float.sum())
# 此时两者输出基本一致

方法2:让PyTorch Tensor保留原始0~255的像素范围

有两种实现方式可选:

# 方式1:对ToTensor输出结果乘以255还原原始值
torch_img = T.ToTensor()(img) * 255
# 方式2:手动做格式转换,跳过自动归一化逻辑
import torch
torch_img = torch.from_numpy(np.asarray(img)).permute(2, 0, 1).float()

print(torch_img.sum(), numpy_img_float.sum())
# 此时两者输出基本一致

内容的提问来源于stack exchange,提问作者Milos Bijanic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:06:03