Pytorch圖像預處理時,通常使用transforms.Normalize(mean, std)對圖像按通道進行標准化,即減去均值,再除以方差。這樣做可以加快模型的收斂速度。其中參數mean和std分別表示圖像每個通道的均值和方差序列。
Imagenet數據集的均值和方差為:mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225),因為這是在百萬張圖像上計算而得的,所以我們通常見到在訓練過程中使用它們做標准化。而對於特定的數據集,選擇這個值的結果可能並不理想。接下來給出計算特定數據集的均值和方差的方法。
def getStat(train_data): ''' Compute mean and variance for training data :param train_data: 自定義類Dataset(或ImageFolder即可) :return: (mean, std) ''' print('Compute mean and variance for training data.') print(len(train_data)) train_loader = torch.utils.data.DataLoader( train_data, batch_size=1, shuffle=False, num_workers=0, pin_memory=True) mean = torch.zeros(3) std = torch.zeros(3) for X, _ in train_loader: for d in range(3): mean[d] += X[:, d, :, :].mean() std[d] += X[:, d, :, :].std() mean.div_(len(train_data)) std.div_(len(train_data)) return list(mean.numpy()), list(std.numpy()) if __name__ == '__main__': train_dataset = ImageFolder(root=r'D:\cifar10_images\test', transform=None) print(getStat(train_dataset))
getState()方法接收一個Dataset類(ImageFolder),然后累加所有圖像三個通道的均值和方差,最后除以圖像總數並返回。
這里用cifar10做的測試,測試集返回的結果如下所示:
Compute mean and variance for training data. 10000 ([0.4940607, 0.4850613, 0.45037037], [0.20085774, 0.19870903, 0.20153421])
————————————————
版權聲明:本文為CSDN博主「潛行隱耀」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/PanYHHH/article/details/107896526
_____________________________
注:這里涉及到兩種算法
1. 計算每張圖片的像素平均灰度值,再求和並除以總圖片數
2. 計算總灰度值,將每張圖像像素數求和,除以這個和
方法一更好,適用於圖片大小不一樣的情況