PyTorch循环保存归一化张量为PNG图像异常问题咨询
问题原因
两个问题会导致保存的PNG图像异常:
- 你使用的预处理中
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])会将原本[0,1]范围的图像张量像素值映射到[-1,1]区间,这是GAN训练适配tanh输出层的标准操作,本身没有错误,但torchvision.utils.save_image默认要求输入张量像素值在[0,1]范围内,直接传入[-1,1]范围的张量会出现色彩错乱、画面异常的问题。 next(iter(train_loader))返回的是(图像批次, 标签批次)形式的元组,直接赋值给real_samples后做索引,取到的不是合法的图像张量格式,也会导致输出错误。
正确保存实现
前置准备
提前创建图像保存目录,避免路径不存在报错:
import os os.makedirs("Real_Images", exist_ok=True)
方法1:手动反归一化后保存
手动将[-1,1]范围的张量还原到[0,1]的合法像素区间再保存,逻辑可控,适合需要额外做张量处理的场景:
# 正确读取dataloader返回值,第一个元素为图像批次,第二个为对应标签 real_images, _ = next(iter(train_loader)) for i in range(4): img = real_images[i] # 反归一化公式:原像素 = 归一化后像素 * 标准差 + 均值,此处标准差、均值均为0.5 img = img * 0.5 + 0.5 torchvision.utils.save_image(img, f'Real_Images/real_image{i}.png')
方法2:调用save_image自带归一化参数
torchvision.utils.save_image内置了像素值归一化逻辑,开启normalize=True后会自动将输入张量的像素值线性映射到[0,1]区间,不需要手动计算反归一化,GAN生成器输出的[-1,1]范围张量可以直接用该方法保存:
real_images, _ = next(iter(train_loader)) for i in range(4): torchvision.utils.save_image( real_images[i], f'Real_Images/real_image{i}.png', normalize=True )
针对GAN生成器输出的张量,只要最后一层激活为
tanh(输出范围[-1,1]),直接套用上述两种保存方法即可,不需要修改原有训练用的预处理transform逻辑。
内容的提问来源于stack exchange,提问作者Sterik
相关产品推荐
相关产品推荐

