这次笔记是对夏令营的第三个任务——数据增强原理及其方法的学习而记录的。
关于task2:深度学习和deepfake攻防模型的改进,我没有特地记录该任务的笔记,是因为深度学习之前已经学过了,并且网上有太多质量非常高的笔记;并且模型改进在我学习task1的时候就已经尝试改进过了,虽然在task2期间有尝试换模型、增加学习轮数等操作,但是由于第一次接触kaggle,还不太熟练,导致我直到ddl截止的时候仍有一次修改没跑完,还浪费了很多GPU的使用时间o(╥﹏╥)o,外加我上班没有太多时间做笔记(也懒),因此就不补task2的笔记了(嘿嘿)。
辩不多狡,开始这次的学习:
目录
数据增强
数据增强其实就是处理现有的数据,将数据进行针对性优化,使其能更好地被模型学习,从而学习到更好的参数,提升模型的泛化性。
以我们这次的任务举例,我们的数据就是图片,增强的方法有:
- 旋转(Rotation):随机旋转图像一定角度。
- 平移(Translation):随机平移图像。
- 缩放(Scaling):随机缩放图像。
- 剪切(Shearing):对图像进行剪切变换。
- 翻转(Flipping):水平或垂直翻转图像。
- 裁剪(Cropping):随机裁剪图像的一部分。
- 颜色变换(Color Jittering):随机改变图像的亮度、对比度、饱和度等。
- 噪声(Noise):在图像中添加随机噪声。
- 模糊(Blurring):对图像进行模糊处理。
通过这些操作可以提高图像分类、目标检测、图像分割等任务的模型性能。通过对训练数据进行各种变换,可以增加数据的多样性,减少过拟合,提高模型的泛化能力【鲁棒性】。例如,
- 在训练一个手写数字识别模型(如MNIST数据集)时,可以对每个手写数字图像进行随机旋转(例如在-15度到15度之间)。这样可以使模型更好地识别不同角度的手写数字。
- 在训练一个人脸识别模型时,可以对人脸图像进行随机平移(例如在水平和垂直方向上各平移5%到10%)。这可以帮助模型更好地识别不同位置的人脸。
- 在训练一个物体检测模型(如COCO数据集)时,可以对图像进行随机缩放(例如在0.8到1.2倍之间)。这可以帮助模型更好地检测不同大小的物体。
- 在训练一个图像分类模型(如CIFAR-10数据集)时,可以对图像进行颜色变换(例如随机调整亮度、对比度和饱和度)。这可以帮助模型更好地适应不同光照条件下的图像。
Deepfake比赛:
在比赛中,老师用以下数据增强的方法对训练数据和测试数据进行数据增强:
train_loader = torch.utils.data.DataLoader(
FFDIDataset(train_label['path'].head(1000), train_label['target'].head(1000),
transforms.Compose([
transforms.Resize((256, 256)),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
), batch_size=40, shuffle=True, num_workers=4, pin_memory=True
)
val_loader = torch.utils.data.DataLoader(
FFDIDataset(val_label['path'].head(1000), val_label['target'].head(1000),
transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
), batch_size=40, shuffle=False, num_workers=4, pin_memory=True
)
-
图像大小调整:使用
transforms.Resize((256, 256))
将所有图像调整到256x256像素的尺寸,这有助于确保输入数据的一致性。 -
随机水平翻转:
transforms.RandomHorizontalFlip()
随机地水平翻转图像,这种变换可以模拟物体在不同方向上的观察,从而增强模型的泛化能力。 -
随机垂直翻转:
transforms.RandomVerticalFlip()
随机地垂直翻转图像,这同样是为了增加数据多样性,让模型能够学习到不同视角下的特征。 -
转换为张量:
transforms.ToTensor()
将图像数据转换为PyTorch的Tensor格式,这是在深度学习中处理图像数据的常用格式。 -
归一化:
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
对图像进行归一化处理,这里的均值和标准差是根据ImageNet数据集计算得出的,用于将图像像素值标准化,这有助于模型的训练稳定性和收敛速度。
此外,在学习的时候,我也向代码中再插入其他的训练技术:
transforms.RandomResizedCrop(224),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2),
transforms.RandomResizedCrop(size = 224)用于随机裁剪图像并调整其大小。
- size = 224表示裁剪后图像的目标大小为 224x224。
transforms.ColorJitter通过四个参数,调节改变图像的亮度、对比度、饱和度和色调。
- brightness=0.2:即亮度因子从
[0.8, 1.2]
中随机选择。意味着图像的亮度会在原始亮度的 80% 到 120% 之间随机变化。 - contrast=0.2:即对比度因子从
[0.8, 1.2]
中随机选择。意味着图像的对比度会在原始对比度的 80% 到 120% 之间随机变化。 - saturation=0.2:即饱和度因子从
[0.8, 1.2]
中随机选择。意味着图像的饱和度会在原始饱和度的 80% 到 120% 之间随机变化。 - hue=0.2:即色调因子从
[-0.2, 0.2]
中随机选择。意味着图像的色调会在原始色调的[-0.5, 0.5]
上进行一定范围内的随机变化。
但是实际训练结果却不理想,实验了几次,效果甚至有的时候得到的拟合效果还下降了,所以也说明了一点:数据增强不能滥用。
适度增强的原因
由于实际训练的结果不理想,我去翻阅资料,总结了以下几点不能滥用的原因:
1. 过度增强
过度使用数据增强方法可能会导致生成的训练数据与实际数据分布差异过大,从而影响模型的学习效果,就可能导致模型可能会学习到不真实的特征,导致在真实数据上的表现变差。例如:
- 过度旋转图像:如果图像被旋转了过大的角度(例如90度或更多),可能会导致图像失真,尤其是在某些特定任务中(如手写数字识别)。
- 过度裁剪:如果裁剪区域过小,可能会丢失重要的上下文信息,影响模型的识别能力。
2. 不适当的增强
使用不适合特定任务的数据增强方法可能会引入噪声或不相关的变异,影响模型的性能。 可能导致模型可能会对不相关的特征过拟合,导致泛化能力下降。例如:
- 在人脸识别任务中使用过度的颜色变换:人脸识别主要依赖于面部特征,过度的颜色变换可能会干扰这些特征。
- 在文本分类任务中使用随机删除:如果删除了关键的词语,可能会导致句子失去原意,影响分类效果。
3. 增强方法不一致
在训练和测试阶段使用不一致的数据增强方法可能会导致模型在测试数据上的表现不佳,可能导致模型在训练数据上表现良好,但在测试数据上表现不佳,导致过拟合。例如:
- 在训练阶段使用大量的数据增强方法,但在测试阶段不使用任何增强方法。这样模型在测试数据上的表现可能会显著下降。
4. 增强比例不合理
数据增强方法的应用比例不合理,可能会导致某些增强方法的效果被放大或被忽略,可能导致模型可能会对某些特定的增强方法过拟合,而忽略其他重要的特征。例如:
- 过度使用某一种增强方法(如水平翻转),而忽略其他方法(如亮度调整、对比度调整等),可能会导致模型对某些特定变换过拟合。
因此,要合理利用数据增强带给我们的提高模型性能和泛化能力的效果。在不知道自己的模型需要哪种方法去增强准确性和鲁棒性的时候,可以通过小样本量去分别测试不同方法的拟合效果,比较其性能指标来选择。
数据增强的进阶方法
Mixup
Mixup 是一种数据增强技术,最早由 Harvard 和 Google 的研究人员在 2017 年提出。它通过在训练过程中将两张图像及其对应的标签进行线性混合,从而生成新的训练样本。这种方法可以有效地提高模型的泛化能力,减少过拟合,并增强模型对对抗样本的鲁棒性。
Mixup 的核心思想是将两张图像及其标签进行线性混合,生成新的训练样本。具体来说,给定两张图像 ( ) 和 (
) 及其对应的标签 (
) 和 (
),Mixup 生成的新样本 (
) 和 (
) ,通过以下公式计算:
举个例子:
图片 A 是一只猫,标签是 [1, 0](表示这是猫,不是狗),图片 B 是一只狗,标签是 [0, 1](表示这是狗,不是猫),令,则
- 新图片 = 0.7 · 图片A + 0.3 · 图片B
- 新标签 = 0.7 · [1, 0] + 0.3 · [0, 1] = [0.7, 0.3]
【图片来源于课程文件】
这意味着新图片是 60% 的猫和 40% 的狗,而新标签表示这张图片有 60% 的概率是猫,40% 的概率是狗。
或者更直观的理解:可以把 Mixup 想象成在调色板上混合两种颜色:
- 如果你有红色和蓝色,你可以混合它们,得到紫色。
- 你可以控制混合的比例,得到不同深浅的紫色。
Mixup的优点有:
- 提高泛化能力:通过生成新的训练样本,Mixup 可以增加数据的多样性,从而提高模型的泛化能力。
- 减少过拟合:Mixup 通过在训练过程中引入噪声,可以有效地减少模型的过拟合。
- 增强对对抗样本的鲁棒性:Mixup 生成的样本具有更高的多样性,使得模型在面对对抗样本时更加鲁棒。
Cutmix
CutMix 是一种类似于 Mixup的数据增强技术,它通过将两张图像的部分区域进行混合,并相应地混合它们的标签,从而生成新的训练样本。CutMix 的目标是提高模型的泛化能力和鲁棒性,但它采用了一种不同的混合方式。
CutMix 的核心思想是将一张图像的一个矩形区域替换为另一张图像的对应区域,同时混合它们的标签。具体来说,给定两张图像 ( ) 和 (
) 及其对应的标签 (
) 和 (
),CutMix 生成的新样本 (
) 和 (
) 通过以下步骤计算:
- 随机选择一个矩形区域,并确定其位置和大小。
- 将图像 (
) 的该矩形区域替换为图像 (
) 的对应区域,生成新的图像 (
)。
- 根据替换区域的面积比例,混合标签 (
) 和 (
),生成新的标签 (
)。
举个例子:
图片 A 是一只猫,标签是 [1, 0](表示这是猫,不是狗),图片 B 是一只狗,标签是 [0, 1](表示这是狗,不是猫),现在选取一个占图片A总面积30%的矩形区域,则
- 新图片 = 图片 A 的 30% + 图片 B 的 70%
- 新标签 = 0.3 · [1, 0] + 0.7 · [0, 1] = [0.3, 0.7]
【图片来源于课程文件】
这意味着新图片是 30% 的猫和 70% 的狗,而新标签表示这张图片有 30% 的概率是猫,70% 的概率是狗。
或者更直观的理解,你有两张不同的图片,你从其中一张图片上切下一个小块,然后把这个小块贴到另一张图片上。这样,你就得到了一个新的拼图,它包含了两张图片的一部分。
CutMix的优点有:
- 提高泛化能力:通过生成新的训练样本,CutMix 可以增加数据的多样性,从而提高模型的泛化能力。
- 减少过拟合:CutMix 通过在训练过程中引入噪声,可以有效地减少模型的过拟合。
- 增强对对抗样本的鲁棒性:CutMix 生成的样本具有更高的多样性,使得模型在面对对抗样本时更加鲁棒。
其他方法
除了课程提到的两种方法以外,我还接触到一些其他数据增强的方法。篇幅太长,就只简单介绍一下原理:
AutoAugment
AutoAugment 的核心思想是通过搜索算法自动找到一组最优的数据增强策略。这些策略由一系列数据增强操作及其参数组成:
- 定义搜索空间:定义一组可能的数据增强操作及其参数范围。例如,旋转、平移、剪切、颜色变换等。
- 搜索算法:使用强化学习或进化算法在搜索空间中寻找最优的数据增强策略。
- 评估策略:在验证集上评估每个策略的性能,并根据性能反馈更新搜索算法。
- 选择最优策略:最终选择性能最优的数据增强策略,并在训练集上应用这些策略进行模型训练。
GridMask
GridMask 的核心思想是通过在图像上应用规则的网格遮挡,生成新的训练样本。具体来说,GridMask 通过以下步骤生成新的图像:
- 生成网格遮挡:在图像上生成一个规则的网格遮挡,每个遮挡区域的大小和间距可以通过参数控制。
- 应用遮挡:将生成的网格遮挡应用到图像上,遮挡部分图像区域,生成新的图像。
Adversarial Training
对抗训练(Adversarial Training)是一种通过生成对抗样本来增强模型鲁棒性的方法。对抗样本是指在原始样本上添加微小扰动,使得模型在这些样本上的预测结果发生显著变化,从而在训练过程中不仅学习到原始样本的特征,还能应对对抗样本的干扰:
- 生成对抗样本:在原始样本上添加微小扰动,生成对抗样本。常用的方法包括 FGSM(Fast Gradient Sign Method)和 PGD(Projected Gradient Descent)。
- 训练模型:将对抗样本和原始样本一起用于训练模型,使模型在面对对抗样本时表现更好。
结语
这个笔记现在就告一段落了,非常感谢Datawhale AI 夏令营,Datawhale AI 提供给了我一个了解新鲜事物的机会,让我了解到一些前沿科技。这次夏令营恰逢在上班,所以没能抽出很多时间学习。这次task2里面还稍微学习了预训练模型ResNet-18,也了解了一些其他模型,诸如VGG、ViT等可用于图像分类、特征提取、迁移学习的模型,未来要是有时间便把学习一下这些模型,再去做个笔记,但是现在不行,因为现在要紧急下班。