在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)
可見反變換后的結果與原結果機乎相同,方法正確。