秃姐学AI系列之:数据增广 + 代码实现

目录

数据增广

常见的图像增广方法

翻转

切割

颜色

总结

 代码实现

 左右翻转图像 RandomHorizontalFlip()

 上下翻转图像 RandomVerticalFlip()

随机裁剪 RandomResizedCrop()

随机更改图像的亮度 ColorJitter()

改变色调 ColorJitter()

一起改!

结合多种图像增广方法


数据增广

 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。 此外,应用图像增广的原因是,随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。

例如,我们可以以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖。 我们还可以调整亮度、颜色等因素来降低模型对颜色的敏感度。 

数据增广就是——在一个已有的数据集上面通过对数据进行变化,使其拥有更多多样性,比如:

  • 在语言里面加入各种不同的背景噪音
  • 改变图片的颜色和形状

一般是在线生成增强的数据。即还是从原始数据集读取图片,一般做法是随机做增强,会生成一堆不同的数据,然后再送入模型做训练。

当然这是训练的时候!测试的时候就不需要对数据做增强了!(可以理解成一个正则项)

常见的图像增广方法

翻转

上下翻转:如果是建筑物这种具有强方向性的数据,就不一定效果会好;但是比如树叶啊这种无强方向性的数据就会有一定效果

切割

从图片中切割一块,然后变形到固定形状

  • 随机高宽比(在 3/4 和 4/3 之间随机取一个数字,即为我们切下来的图片的大小)
  • 随即大小(8% ~ 100%之间随机选一个数,即为切下来的图片占原图片的多少)
  • 随机位置 

颜色

另一种增广方法是改变颜色。 我们可以改变图像颜色的四个方面:亮度、对比度、饱和度和色调。

在下面的示例中,我们随机更改图像的亮度,随机值为原始图像的50%(1−0.5)到150%(1+0.5)之间。

同样,我们可以随机更改图像的色调

总结

  • 图像增广基于现有的训练数据生成随机图像,来提高模型的泛化能力。

  • 为了在预测过程中得到确切的结果,我们通常对训练样本只进行图像增广,而在预测过程中不使用带随机操作的图像增广。

  • 深度学习框架提供了许多不同的图像增广方法,这些方法可以被同时应用。

  • 常见的图片增广包括反转、切割、变色

 代码实现

%matplotlib inline
import torch
import torchvision
from torch import nn
from d2l import torch as d2l

d2l.set_figsize()
img = d2l.Image.open('../img/cat1.jpg')
d2l.plt.imshow(img);

我们将使用下面这个尺寸为400×500的图像作为示例。

大多数图像增广方法都具有一定的随机性。为了便于观察图像增广的效果,我们下面定义辅助函数apply。 此函数在输入图像 img上多次运行图像增广方法 aug并显示所有结果。

# img:图片 aug:图像增广 num_rows、num_cols:对它重复作用多少次(两行四列 = 8次) scale:画的图片有多大(这个可忽略,就是为了画大一些)
def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):
    Y = [aug(img) for _ in range(num_rows * num_cols)]    # 把所有图片存到 Y 里面
    d2l.show_images(Y, num_rows, num_cols, scale=scale)    # 把它投影出来

 左右翻转图像 RandomHorizontalFlip()

在水平方向随机的进行翻转

apply(img, torchvision.transforms.RandomHorizontalFlip())

结果: 

 上下翻转图像 RandomVerticalFlip()

apply(img, torchvision.transforms.RandomVerticalFlip())

结果:

随机裁剪 RandomResizedCrop()

下面的代码将随机裁剪一个面积为原始面积10%到100%的区域,该区域的宽高比从0.5~2之间随机取值。 然后,区域的宽度和高度都被缩放到200像素。

# RandomResizedCrop(最终输出大小(无论你裁剪多大区域,最终都resize成这个大小),随机裁剪的区域范围(比如下面代码:在0.1到1之间随机选一个数),高宽比(要么1/2,要么2/1))
shape_aug = torchvision.transforms.RandomResizedCrop(
    (200, 200), scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)

 结果:

随机更改图像的亮度 ColorJitter()

ColorJitter(亮度(0.5是指上下浮动50%),对比度(0即不改变),饱和度,颜色)

apply(img, torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0, saturation=0, hue=0))

 结果:

改变色调 ColorJitter()

apply(img, torchvision.transforms.ColorJitter(
    brightness=0, contrast=0, saturation=0, hue=0.5))

 结果:

一起改!

同时随机更改图像的亮度(brightness)、对比度(contrast)、饱和度(saturation)和色调(hue)。

color_aug = torchvision.transforms.ColorJitter(
    brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)

 结果:

结合多种图像增广方法

在实践中,我们通常结合多种图像增广方法。比如,我们可以通过使用一个 Compose 实例来综合上面定义的不同的图像增广方法,并将它们应用到每个图像。 

augs = torchvision.transforms.Compose([
    # color_aug 和 shape_aug 是上面存下来的颜色增广和形状增广
    torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)

结果: 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是PyTorch实现扩散概率模型对振动故障信号进行数据增广代码示例: ``` python import torch import torch.nn as nn import numpy as np class DiffusionProbModel(nn.Module): def __init__(self, num_features, num_layers, hidden_size): super(DiffusionProbModel, self).__init__() self.num_features = num_features self.num_layers = num_layers self.hidden_size = hidden_size self.fc1 = nn.Linear(num_features, hidden_size) self.relu = nn.ReLU() self.fc_layers = nn.ModuleList([nn.Linear(hidden_size, hidden_size) for i in range(num_layers - 1)]) self.fc_out = nn.Linear(hidden_size, num_features) def forward(self, x): out = self.fc1(x) out = self.relu(out) for i in range(self.num_layers - 1): out = self.fc_layers[i](out) out = self.relu(out) out = self.fc_out(out) return out def data_augmentation(data, diffusion_prob_model, sigma): with torch.no_grad(): augmented_data = data.clone() for i in range(data.size(0)): noise = torch.randn(data.size(1), data.size(2)) * sigma noise = noise.to(device) for j in range(data.size(1)): x = augmented_data[i, j, :].clone() x = x.to(device) for k in range(data.size(2)): diff_prob = diffusion_prob_model(x) diff_prob = diff_prob.squeeze() diff_prob = diff_prob.cpu().numpy() diff_prob = np.exp(diff_prob) diff_prob /= np.sum(diff_prob) idx = np.random.choice(data.size(2), p=diff_prob) x[k] = x[idx] + noise[j, k] augmented_data[i, j, :] = x.cpu() return augmented_data ``` 上述代码中,我们定义了一个扩散概率模型类 `DiffusionProbModel`,它由多层全连接神经网络组成。我们还定义了一个数据增广函数 `data_augmentation`,它利用扩散概率模型对输入数据进行增广。具体实现过程如下: 对于输入的数据 `data`,我们首先对每个样本生成一个相同大小的随机噪声 `noise`。接着,我们对每个样本的每个时间步 `j`,对每个特征 `k`,分别进行如下的增广过程: - 首先,我们利用扩散概率模型 `diffusion_prob_model` 计算当前时间步的特征 `x[k]` 在时间步 `j` 时的扩散概率分布 `diff_prob`。 - 接着,我们根据扩散概率分布 `diff_prob`,从时间步 `j` 的所有特征中随机选择一个特征 `idx`,作为当前时间步的新特征值 `x[k]`。 - 最后,我们将当前时间步的新特征值 `x[k]` 加上对应的随机噪声 `noise[j, k]`,得到增广后的特征
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值