验证中的数据扩充
Data augmentation in validation
我对数据扩充有点困惑。如果我在训练数据集中执行数据扩充,验证数据集应该有相同的操作吗?
例如
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),}
为什么我们在 'val' 数据集中进行 'resize' 和 'CenterCrop' 操作?
由于验证数据用于衡量经过训练的模型的好坏,因此不应在不同的经过训练的模型之间进行更改。也就是说,我们应该用一个固定的衡量标准来衡量事物。这就是为什么验证数据的扩充不包含训练数据扩充中存在的任何随机性的原因。
旁注:
与测试数据不同,验证数据用于调整超参数。
我非常不同意@Yashio Yamauchi 的回答。是的,当数据集较小时,数据增强通常用于训练数据集以增加数据集样本的数量。 但是,有些情况下您的验证数据集也很小,因此您无法实际评估您的模型。
例如,假设您的任务是识别 T 恤上的徽标(例如阿迪达斯徽标),无论它们在图像上如何旋转(例如 90 度)。然后,您将不得不使用数据增强来确保您的模型使用旋转的 T 恤。但是,如果您想测量模型在旋转 90 度时识别“阿迪达斯”的效果如何,那么您的验证数据集中还需要包含旋转 T 恤的图像。
在这种情况下,数据增强可以在训练发生之前在验证数据集中使用一次!
我对数据扩充有点困惑。如果我在训练数据集中执行数据扩充,验证数据集应该有相同的操作吗? 例如
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),}
为什么我们在 'val' 数据集中进行 'resize' 和 'CenterCrop' 操作?
由于验证数据用于衡量经过训练的模型的好坏,因此不应在不同的经过训练的模型之间进行更改。也就是说,我们应该用一个固定的衡量标准来衡量事物。这就是为什么验证数据的扩充不包含训练数据扩充中存在的任何随机性的原因。
旁注:
与测试数据不同,验证数据用于调整超参数。
我非常不同意@Yashio Yamauchi 的回答。是的,当数据集较小时,数据增强通常用于训练数据集以增加数据集样本的数量。 但是,有些情况下您的验证数据集也很小,因此您无法实际评估您的模型。
例如,假设您的任务是识别 T 恤上的徽标(例如阿迪达斯徽标),无论它们在图像上如何旋转(例如 90 度)。然后,您将不得不使用数据增强来确保您的模型使用旋转的 T 恤。但是,如果您想测量模型在旋转 90 度时识别“阿迪达斯”的效果如何,那么您的验证数据集中还需要包含旋转 T 恤的图像。
在这种情况下,数据增强可以在训练发生之前在验证数据集中使用一次!