1. 程式人生 > >pytorch torchvision.transforms.Normalize()中的mean和std引數---解惑

pytorch torchvision.transforms.Normalize()中的mean和std引數---解惑

torchvision.transforms.Normalize()中的mean和std引數做什麼用呢?
疑問1:
按照我的理解,歸一化就是要把圖片3個通道中的資料整理到[-1, 1]區間。
x = (x - mean(x))/stddev(x)
只要輸入資料集x確定了,mean(x)和stddev(x)也就是確定的數值了,為什麼Normalize()函式還需要輸入mean和std的數值呢?

疑問2:
RGB單個通道的值不是[0, 255]嗎?所以一個通道的均值應該在127附近才對。
如果Normalize()函式按照下面的版式去計算 x = (x - mean)/std 因為RGB是[0, 255],算出來的x就不可能落在[-1, 1]區間了。

疑問3:
可我看很多程式碼裡面是這樣的:
torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
這一組值是怎麼來的? 為什麼這三個通道的均值都是小於1的值呢?

1、
mean 和 std 肯定要在normalize之前自己先算好再傳進去的,不然每次normalize程式就得把所有的圖片都讀取一遍算這兩個數…

2、有兩種情況:
a)如果是imagenet資料集,那麼ImageNet的資料在載入的時候就已經轉換成了[0, 1].
b)應用了torchvision.transforms.ToTensor,其作用是
( Converts a PIL Image or numpy.ndarray (H x W x C) in the range [0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0]

3、[0.485, 0.456, 0.406]這一組平均值是從imagenet訓練集中抽樣算出來的。