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
相关产品推荐
相关产品推荐

