复现模型时发现,和原始代码的结果始终不同。
排查后发现时transforms.ToPILImage()与torchvision.utils.save_imag()结果不同导致的
transforms.ToPILImage()的转换如下:
def save_img_from_tensor(tensor, path):
tens = tensor.squeeze()
trans = transforms.Compose([
transforms.ToPILImage()
])
img = trans(tens)
img.save(path)
torchvision.utils.save_imag()的转换如下
def save_img_from_tensor(tensor,path):
torchvision.utils.save_image(tensor.cpu(), path)
结果差异很明显
具体原因
torchvision.utils.save_imag()使用的方式是
darr = grid.mul(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).to('cpu', torch.uint8).numpy()
transforms.ToPILImage()使用的方式时
if pic.is_floating_point() and mode != 'F':
pic = pic.mul(255).byte()
npimg = np.transpose(pic.cpu().numpy(), (1, 2, 0))
缺少了add_(0.5).clamp_(0, 255)
经过测试吗,如果在源码中加入,则两者生成完全一致
官方解释是:
Add 0.5 after unnormalizing to [0, 255] to round to nearest integer