mixup、cutout、cutmix

《mixup:BEYOND EMPIRICAL RISK MINIMIZATION》

  • 2017(ICLR2018),Hongyi Zhang et al. Mixup ,MIT和FAIR

Q: 为什么data augmentation是理解为控制模型复杂度?

A: 准确地说,我觉得data augmentation既不能简单地理解为增加training data,也不能简单地理解为控制模型复杂度,而是两种效果兼而有之。考虑图像识别里常用的改变aspect ratio做data augmentation的方法,生成的图像虽然和真实图像相似,但是并不是来自于data distribution,更不是它的i.i.d.抽样。而经典的supervised learning以及统计学习理论的基本假设就是训练集和测试集都是data distribution的i.i.d.抽样,所以这并不是经典意义上的增加training data。这些合成的training data的作用,流行的解释是“增强模型对某种变换的invariance”。这句话反过来说,就是机器学习里经常提到的“减少模型估计的variance”,也就是控制了模型的复杂度。需要注意的是,L2正则化、dropout等等也都是在控制模型复杂度,只不过它们没有考虑数据本身的分布,而data augmentation属于更加机智的控制模型复杂度的方法。

其实反过来看,L2正则化和dropout也各自等价于某种data augmentation。参考Vicinal Risk Minimization 和 [1506.08700] Dropout as data augmentation

Q: label线性加权后,不是得到了这两个样本中间的类别了吗?

A: label用的是one-hot vector编码,可以理解为对k个类别的每个类给出样本属于该类的概率。加权以后就变成了"two-hot",也就是认为样本同时属于混合前的两个类别。

另一种视角是不混合label,而是用加权的输入在两个label上分别计算cross-entropy loss,最后把两个loss加权作为最终的loss。由于cross-entropy loss的性质,这种做法和把label线性加权是等价的,大家可以自行思考一下。

 

import numpy as np
import torch

def mixup_data(x, y, alpha=1.0, use_cuda=True):
 
    '''Compute the mixup data. Return mixed inputs, pairs of targets, and lambda'''
    if alpha > 0.:
        lam = np.random.beta(alpha, alpha)
    else:
        lam = 1.
    batch_size = x.size()[0]
    if use_cuda:
        index = torch.randperm(batch_size).cuda()
    else:
        index = torch.randperm(batch_size)
 
    mixed_x = lam * x + (1 - lam) * x[index,:] # 自己和打乱的自己进行叠加
    y_a, y_b = y, y[index]
    return mixed_x, y_a, y_b, lam
 
def mixup_criterion(y_a, y_b, lam):
    return lambda criterion, pred: lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)
 

cutout:随机裁剪区域,填充0像素

cutmix:随机裁剪区域,填充其他图像到相应区域,代码可根据mixup来改写

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像mixup是一种用于数据增强的技术,可以增加训练数据的多样性并提高模型的泛化能力。该技术主要通过将两个不同的图像进行混合来创建一个新的训练样本。 在使用Python实现图像mixup时,我们需要使用一些图像处理库和深度学习框架,比如OpenCV和Tensorflow或PyTorch。以下是一个简单的实现过程: 1. 导入必要的库和模块: ``` import cv2 import numpy as np import tensorflow as tf ``` 2. 定义一个函数来加载和处理图像: ``` def load_image(image_path): # 使用opencv加载图像 image = cv2.imread(image_path) # 将图像像素值归一化到0到1之间 image = image / 255.0 return image ``` 3. 定义一个函数来进行图像mixup: ``` def mixup(image1, image2, label1, label2, alpha=0.2): # 生成一个随机的mixup系数 lam = np.random.beta(alpha, alpha) # 使用mixup系数对图像和标签进行混合 mix_image = lam * image1 + (1 - lam) * image2 mix_label = lam * label1 + (1 - lam) * label2 return mix_image, mix_label ``` 4. 在训练过程中,使用mixup函数生成新的训练样本: ``` # 加载图像和标签 image1 = load_image("image1.jpg") image2 = load_image("image2.jpg") label1 = tf.one_hot(0, num_classes) label2 = tf.one_hot(1, num_classes) # 进行图像mixup mix_image, mix_label = mixup(image1, image2, label1, label2) # 将mixup生成的新样本用于训练 # ... ``` 通过实现图像mixup,我们可以扩充训练数据集,以增强模型对新图像的泛化能力,从而提高模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值