在torchvsion库中,transforms下边有个Normalize变换方法,用于图像数据的归一化:
class torchvision.transforms.Normalize(mean, std)
给定均值:(R,G,B)
方差:(R,G,B)
,将会把Tensor
正则化。即:Normalized_image=(image-mean)/std
。
normalize变换主要用于Imagenet数据集的训练中作为数据输入的归一化。
这就导致在预测图像后,进行预测标签和图像的检查时,图像不能正常显示。需要进行反归一化变换才可以。
但是torchvision没有给Unormalize方法,下面的代码实现了UnNormalize变换:
class UnNormalize: #restore from T.Normalize #反归一化 def __init__(self,mean=(0.485, 0.456, 0.406),std= (0.229, 0.224, 0.225)): self.mean=tc.tensor(mean).view((1,-1,1,1)) self.std=tc.tensor(std).view((1,-1,1,1)) def __call__(self,x): x=(x*self.std)+self.mean return tc.clip(x,0,None)
用法和normalize相同,二者是正反变换,使用方法如下:
import torch as tc from torchvision import transforms as T t=tc.rand((1,3,24,24)) t1=T.Normalize((1,2,3),(3,2,1))(t) #归一化 tt=UnNormalize((1,2,3),(3,2,1))(t1) #反归一化 (t-tt).abs().sum() #结果比较
输出是:tensor(5.3823e-05)
可见反变换后的结果与原结果机乎相同,方法正确。