画像分類の実験では、transforms.Normalize() などのデータ強調操作がデータセットに対して実行されることがよくあります。この関数は次のように定義されます。
torchvision.transforms.Normalize(mean、std、inplace=False)
機能:RGB3チャンネルごとに画像を正規化
出力 = (入力 - 平均) / 標準
- 平均値: 各チャネルの平均値
- std: 各チャンネルの標準偏差
- inplace: その場で操作するかどうか
通常、ImageNet には画像の平均と分散をサンプリングすることによって取得される独自の標準化されたパラメータがあります。では、特定のローカル データセットに適したパラメータを取得するにはどうすればよいでしょうか? PyTorchのデータ正規化処理:transforms.Normalizeと画像データセットの平均と分散の計算_Zizhiのブログ-CSDNブログ_pytorchデータ正規化を参照しました。
元のコードにエラーがあります。transform を None ではなく、transforms.ToTensor() に設定する必要があります。そうしないと、正しく実行されません。修正されたコードは次のとおりです。
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'/data1/sharedata/leafseg/', transform=transforms.ToTensor())
print(getStat(train_dataset))
トレーニング データの平均と分散を計算します。
3257
([0.059938803, 0.08676067, 0.041085023], [0.10522498, 0.1488454, 0.07508467])
結果を変換リストに書き込むだけです。
data_transforms = { 'train':transforms.Compose([ transforms.Resize(640)、 transforms.RandomhorizontalFlip()、 transforms.ToTensor()、 transforms.Normalize([0.0599, 0.0868, 0.0411], [0.1052, 0.1488, 0.0751] ) ]), 'val':transforms.Compose([ transforms.Resize(640), transforms.ToTensor(), transforms.Normalize([0.0599, 0.0868, 0.0411], [0.1052, 0.1488, 0.0751]) ]) , }