我正在尝试编写一个简单的代码来在 ImageNet 数据集上教授 resnet50。我不太明白为什么标准化不起作用。当我使用此转换作为数据增强时:
train_transforms = transforms.Compose([
transforms.Resize((224, 224), antialias=True),
transforms.RandomCrop(180),
transforms.Resize((224, 224), antialias=True),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.15),
transforms.RandomApply([transforms.GaussianBlur(3, sigma=(0.1, 2.0))], p=0.5),
transforms.ToTensor()
])
我检查了结果,似乎没问题。这是一种光增强。例如这个华夫饼熨斗:
看起来像这样:
但是,如果我做完全相同的事情,但添加标准化,如下所示:
train_transforms = transforms.Compose([
transforms.Resize((224, 224), antialias=True),
transforms.RandomCrop(180),
transforms.Resize((224, 224), antialias=True),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.15),
transforms.RandomApply([transforms.GaussianBlur(3, sigma=(0.1, 2.0))], p=0.5),
transforms.ToTensor(),
transforms.Normalize(mean, std)
])
华夫饼熨斗看起来像这样:
我尝试将规范化放在 Transforms.Compose 的不同部分中,但它以其他方式不起作用。在某些星座中会抛出错误(因为它是在张量上定义的),或者它只是以其他方式破坏图片,例如:
当我尝试此订单时会发生这种情况:
train_transforms = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean, std),
transforms.Resize((224, 224), antialias=True),
transforms.RandomCrop(180),
transforms.Resize((224, 224), antialias=True),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.15),
transforms.RandomApply([transforms.GaussianBlur(3, sigma=(0.1, 2.0))], p=0.5),
])
我怎样才能让它工作,这里有什么问题?其余代码只是标准的 PyTorch 学习过程,没什么花哨的。
假设您为
mean
和 std
使用了合理的值,那么您的代码没有任何问题。标准化不会保留图像的视觉外观。