Pytorch中Unormalize变换的实现

在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)   

可见反变换后的结果与原结果机乎相同,方法正确。

 

posted on 2022-01-24 11:10  看看完了  阅读(1596)  评论(0编辑  收藏  举报

导航