数据扩展 (mixup)

本文介绍一种新的数据扩展方法mixup

1. mixup原理

mixup是一种对图像进行混类增强的算法,它可以将不同类之间的图像以线性插值的方式进行混合,从而构建新的训练样本,扩充训练数据集。
在这里插入图片描述
其中,(xi,yi)(xj,yj)是从训练数据中随机抽取的两个样本,且λ∈[0,1]

  1. 对于输入的一个batch的待测图片images,我们将其和随机抽取的图片按照系数λ加权相加,λ∈[0,1],符合beta分布
  2. 将1中得到的混合张量inputs传递给模型得到输出张量outputs
  3. 计算损失函数时,针对两个图片的标签分别计算损失函数,然后按照比例λ进行损失函数的加权求和,即
for i,(images,target) in enumerate(train_loader):
    # 加载第一张图片和标签
    images = images.cuda(non_blocking=True)
    target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True)

    # 加载参数
    alpha = config.alpha
    lam = np.random.beta(alpha,alpha)

	# 用来融合的图片的序号
    index = torch.randperm(images.size(0)).cuda()

	# 将两张图片按照比例系数lam加权求和
    inputs = lam*images + (1-lam)*images[index,:]

	# 两张图片的标签
    targets_a, targets_b = target, target[index]

	# 将融合后的图片输入给网络
    outputs = model(inputs)

	# 损失函数按照比例系数lam加权求和
    loss = lam * criterion(outputs, targets_a) + (1 - lam) * criterion(outputs, targets_b)

    # 梯度更新
    optimizer.zero_grad()   # reset gradient
    loss.backward()
    optimizer.step()        # update parameters of net

我们可视化mixup这个过程,两张图片的mixup结果随着lam的变化而发生渐变:

for i in range(1,10):
    lam= i*0.1
    im_mixup = (im1*lam+im2*(1-lam)).astype(np.uint8)
    plt.subplot(3,3,i)
    plt.imshow(im_mixup)
plt.show()

在这里插入图片描述
实际代码中的lam由随机数生成器控制,lam符合参数为(alpha,alpha)beta分布,默认取alpha=1,这里的alpha是一个超参数,alpha的值越大,生成的lam偏向0.5的可能性更高。

2. 目标检测中应用mixup的例子

对于目标检测的话,步骤:

  1. 图1和图2按照比例lam进行线性融合
  2. 送入模型进行检测
  3. 分别按标签计算损失函数,按照lam加权相加得到最终的损失函数。

在这里插入图片描述

参考文献
知乎:目标检测中图像增强,mixup 如何操作?Pascal的回答

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Mixup是一种常用的数据增强方法,其基本思想是将两张不同的图片按照一定比例混合在一起,生成一张新的图片。这个过程中,我们需要同时对两张图片进行标签的混合,以保证模型在训练过程中对新生成的图片有足够的鲁棒性。 具体地,假设我们有两张图片$X_1$和$X_2$,对应的标签为$y_1$和$y_2$,mixup的过程如下: 1. 随机生成一个$\lambda$,满足$0 \leq \lambda \leq 1$。 2. 生成新的图片$X' = \lambda X_1 + (1 - \lambda)X_2$。 3. 生成新的标签$y' = \lambda y_1 + (1 - \lambda)y_2$。 在实际的代码实现中,我们可以将两张图片混合在一起,然后使用交叉熵损失函数计算模型的损失值。 下面是一个使用mixup进行数据增强的示例代码,其中我们使用了PyTorch深度学习框架: ``` import torch import random def mixup_data(x, y, alpha=1.0): """ 对输入的数据进行mixup操作 x: 输入的图片数据 y: 输入的图片标签 alpha: mixup操作的超参数,默认为1.0 """ # 随机生成一个比例参数 lam = torch.tensor(random.random(), dtype=torch.float32) # 将数据扩充为相同的形状 batch_size = x.size()[0] index = torch.randperm(batch_size) mixed_x = lam * x + (1 - lam) * x[index, :] # 将标签也进行混合 y_a, y_b = y, y[index] mixed_y = lam * y_a + (1 - lam) * y_b return mixed_x, mixed_y # 使用示例 img1 = torch.randn(1, 3, 224, 224) img2 = torch.randn(1, 3, 224, 224) label1 = torch.tensor([1]) label2 = torch.tensor([2]) mixed_img, mixed_label = mixup_data(torch.cat([img1, img2], dim=0), torch.cat([label1, label2], dim=0)) ``` 在这个示例代码中,我们首先随机生成了一个比例参数$\lambda$,然后将两张图片按照比例混合在一起,同时将标签也按照比例进行混合,最终得到了新的数据和标签。需要注意的是,这个过程中,我们需要将两张图片的大小扩充为相同的形状,以便进行混合操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值