个人导航网站如何赚钱,谁有网站推荐一个,网站高端定制,wordpress 嵌入pdf之——泛化性提升 杂谈 深度学习的数据增强#xff08;Data Augmentation#xff09;是一种技术#xff0c;用于通过对原始数据进行多样性的变换和扩充#xff0c;以增加训练数据的多样性#xff0c;提高模型的泛化能力。这有助于减轻过拟合问题#xff0c;提高深度学习模…之——泛化性提升 杂谈 深度学习的数据增强Data Augmentation是一种技术用于通过对原始数据进行多样性的变换和扩充以增加训练数据的多样性提高模型的泛化能力。这有助于减轻过拟合问题提高深度学习模型的性能。以下是深度学习数据增强的一些方法以及一些成功的案例 数据增强方法 图像数据增强 镜像翻转对图像进行水平或垂直翻转增加图像的多样性。旋转以不同的角度旋转图像。平移平移图像的位置以模拟不同拍摄角度。放缩对图像进行缩小或放大。亮度、对比度、色彩调整改变图像的亮度、对比度或颜色。 文本数据增强 同义词替换将一些词替换为其同义词以增加文本的多样性。词序变换随机改变文本中词语的顺序。插入、删除、替换字符对文本进行字符级别的操作以增加噪音和多样性。 声音数据增强 增加噪声向声音数据中添加噪声以增加多样性。时间伸缩对声音数据进行时间尺度的变化。频域变换在声音数据的频域上进行操作。 成功案例 图像分类 ImageNet竞赛在ImageNet图像分类竞赛中数据增强被广泛使用。训练集中的图像进行了多种变换包括翻转、旋转、缩放等。这些技术帮助了深度卷积神经网络CNN在图像分类任务上取得巨大成功。 目标检测 Faster R-CNNFaster R-CNN是一种流行的目标检测算法使用了数据增强来改进检测性能。通过对训练图像进行多样性的变换模型在不同环境下能更好地识别目标。 自然语言处理 BERTBERT是一种预训练的语言模型通过对文本进行多种数据增强操作如遮蔽、替换、乱序等来学习文本的上下文信息。BERT的成功影响了自然语言处理领域的各种任务如情感分析、问答等。 语音识别 SpecAugmentSpecAugment是一种用于语音识别的数据增强方法通过在声谱图上进行时间和频域的变换来改进语音识别模型的性能。 这些案例表明数据增强是深度学习中的一种重要技术可以显著提高模型的性能和泛化能力。不同领域的数据增强方法可能有所不同但它们都通过增加数据多样性来帮助模型更好地理解和泛化数据。 正文
1.数据增广 数据增广顾名思义就是在现有数据基础上去做增强、扩充、调整。 理想情况下训练出来的model在实际部署上完全不一样。 所以希望在训练时候就能够考虑尽可能多的干扰与数据变化情况以免出现泛化性能差的现象 一般来说是随机在线生成的可以理解为随机正则项 2.方法
2.1 翻转 数据增广要考虑到本身的应用场景要是一些完全不可能上下颠倒的物体翻转增广是没有意义的。 2.2 切割 随机方式切割图片并变回固定形状 2.3 颜色 色调、饱和度、亮度 2.4 其他数字图像处理 旋转跳跃、瑞锐化、虚化、消除、噪声 3.实现 导包导图
import torch
import torchvision
from torch import nn
from d2l import torch as d2l# d2l.set_figsize()
d2l.set_figsize()
img d2l.Image.open(rD:\apycharmblackhorse\project\_04_pytorch\basic_class\data/pikaqiu.jpg)
d2l.plt.imshow(img); 列举函数
#一个列举函数传入图片和方法
def apply(img, aug, num_rows2, num_cols4, scale1.5):Y [aug(img) for _ in range(num_rows * num_cols)]d2l.show_images(Y, num_rows, num_cols, scalescale)随机水平翻转随机垂直翻转
print(随机水平翻转)
apply(img, torchvision.transforms.RandomHorizontalFlip())print(随机垂直翻转)
apply(img, torchvision.transforms.RandomVerticalFlip()) 随机裁剪
print(随机裁剪) #裁剪图像大小与原始图像比例随机范围高宽比随机范围
cut_augtorchvision.transforms.RandomResizedCrop(200,(0.1,1),(0.5,2))
apply(img, cut_aug) 颜色变化
print(颜色变化) #亮度、对比度、饱和度和色调上下幅值
color_augtorchvision.transforms.ColorJitter(brightness0.5,contrast0.5,saturation0.5,hue0.5)
apply(img, color_aug) 多种增广方法合并
print(多种增广方法)
augstorchvision.transforms.Compose([torchvision.transforms.RandomVerticalFlip(),cut_aug,color_aug])
apply(img, augs)训练应用主要是跑不动之后回过头来再整理
%matplotlib inline
import torch
import torchvision
from torch import nn
from d2l import torch as d2lall_images torchvision.datasets.CIFAR10(trainTrue, root../data,downloadTrue)
d2l.show_images([all_images[i][0] for i in range(32)], 4, 8, scale0.8);train_augs torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(),torchvision.transforms.ToTensor()])test_augs torchvision.transforms.Compose([torchvision.transforms.ToTensor()])def load_cifar10(is_train, augs, batch_size):dataset torchvision.datasets.CIFAR10(root../data, trainis_train,transformaugs, downloadTrue)dataloader torch.utils.data.DataLoader(dataset, batch_sizebatch_size,shuffleis_train, num_workersd2l.get_dataloader_workers())return dataloaderdef train_batch_ch13(net, X, y, loss, trainer, devices):用多GPU进行小批量训练if isinstance(X, list):# 微调BERT中所需X [x.to(devices[0]) for x in X]else:X X.to(devices[0])y y.to(devices[0])net.train()trainer.zero_grad()pred net(X)l loss(pred, y)l.sum().backward()trainer.step()train_loss_sum l.sum()train_acc_sum d2l.accuracy(pred, y)return train_loss_sum, train_acc_sumdef train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,devicesd2l.try_all_gpus()):用多GPU进行模型训练timer, num_batches d2l.Timer(), len(train_iter)animator d2l.Animator(xlabelepoch, xlim[1, num_epochs], ylim[0, 1],legend[train loss, train acc, test acc])net nn.DataParallel(net, device_idsdevices).to(devices[0])for epoch in range(num_epochs):# 4个维度储存训练损失训练准确度实例数特点数metric d2l.Accumulator(4)for i, (features, labels) in enumerate(train_iter):timer.start()l, acc train_batch_ch13(net, features, labels, loss, trainer, devices)metric.add(l, acc, labels.shape[0], labels.numel())timer.stop()if (i 1) % (num_batches // 5) 0 or i num_batches - 1:animator.add(epoch (i 1) / num_batches,(metric[0] / metric[2], metric[1] / metric[3],None))test_acc d2l.evaluate_accuracy_gpu(net, test_iter)animator.add(epoch 1, (None, None, test_acc))print(floss {metric[0] / metric[2]:.3f}, train acc f{metric[1] / metric[3]:.3f}, test acc {test_acc:.3f})print(f{metric[2] * num_epochs / timer.sum():.1f} examples/sec on f{str(devices)})batch_size, devices, net 256, d2l.try_all_gpus(), d2l.resnet18(10, 3)def init_weights(m):if type(m) in [nn.Linear, nn.Conv2d]:nn.init.xavier_uniform_(m.weight)net.apply(init_weights)def train_with_data_aug(train_augs, test_augs, net, lr0.001):train_iter load_cifar10(True, train_augs, batch_size)test_iter load_cifar10(False, test_augs, batch_size)loss nn.CrossEntropyLoss(reductionnone)trainer torch.optim.Adam(net.parameters(), lrlr)train_ch13(net, train_iter, test_iter, loss, trainer, 10, devices)train_with_data_aug(train_augs, test_augs, net) 结果 小结 图像增广基于现有的训练数据生成随机图像来提高模型的泛化能力。 为了在预测过程中得到确切的结果我们通常对训练样本只进行图像增广而在预测过程中不使用带随机操作的图像增广。 深度学习框架提供了许多不同的图像增广方法这些方法可以被同时应用。