task3--数据增强,模型能力upup!# Datawhale AI 夏令营多模态

数据增强

数据增强是一种有效的手段,可以提高模型的性能、泛化能力和鲁棒性,在数据驱动的机器学习和深度学习领域中具有重要的作用。
增加数据量:在数据有限的情况下,通过对现有数据进行变换和扩充,有效地增加数据的数量,为模型训练提供更多的样本。对少样本有所改善
缓解过拟合:当模型过度拟合训练数据时,它在新的、未见过的数据上表现不佳。数据增强引入的随机性和多样性可以使模型更具泛化能力,减少对特定数据模式的依赖。对于易学习样本不会过拟合
增强模型的鲁棒性:使得模型对数据中的噪声、变化和干扰具有更强的适应能力。能够识别较差的数据
平衡数据分布:当数据集中某些类别或特征的样本数量较少时,对一些长尾分布的数据,或其他不均衡数据,模型有更好的均衡学习。

包括图像的翻转、旋转、裁剪、缩放、颜色变换、添加噪声等
直接使用 torchvision.transforms

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(), #水平反转
    transforms.RandomRotation(15), # 随机旋转一定角度(这里是 15 度)
    transforms.RandomCrop(224),# 随机裁剪
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
    transforms.ToTensor()
])

图像增强

可以有几何变化,颜色变化,自动增强,混合mixup
几何变化

  1. 仿射变换 仿射变换是一种线性变换,它保持了图像的“平直性”(直线在变换后仍然是直线)和“平行性”(平行线在变换后仍然是平行线)。常见的仿射变换包括平移、旋转、缩放、剪切等操作的组合。
  2. 投影变换 也称为透视变换,是一种更一般的非线性变换,它可以将矩形图像变换为任意四边形。这种变换会改变直线的平行性。
  3. 中心裁剪 从图像的中心位置裁剪出指定大小的区域。
  4. 随机裁剪 在图像中随机选择一个位置,然后裁剪出指定大小的区域。
  5. 调整大小 改变图像的尺寸,可以按照指定的比例或者直接指定新的宽度和高度。
  6. 翻转将图像沿水平或垂直轴进行对称翻转。
  7. 旋转 围绕一个指定的点将图像旋转一定的角度。
transform = transforms.Compose([
    transforms.Resize((256, 256)),  # 调整大小为 256x256
    transforms.RandomRotation(degrees=45),  # 随机旋转 45 度
    transforms.RandomHorizontalFlip(),  # 随机水平翻转
    transforms.CenterCrop((224, 224)),  # 中心裁剪为 224x224
    transforms.RandomCrop((128, 128))  # 随机裁剪为 128x128
])

颜色变化

color_aug = transforms.ColorJitter(brightness=0.5, 
                contrast=0.5, saturation=0.5, hue=0.2) 

brightness=0.5 表示亮度的偏移幅度为 0.5,即亮度会随机变化为原图亮度的 50%(1 - 0.5)∼ 150%(1 + 0.5);contrast=0.5 表示对比度的偏移幅度为 0.5;saturation=0.5 表示饱和度的偏移幅度为 0.5;hue=0.2 表示色相的偏移幅度为 0.2,hue_factor 会从 (-0.2, 0.2) 中随机采样产生。

mixup
mixup 是一种数据增强方法,其核心思想是从每个训练批次中随机选择两张图像,并以一定比例混合生成新的图像。

import torch
import numpy as np

alpha = 1.0  # 默认设置为 1
criterion = nn.CrossEntropyLoss()  # 定义损失函数

for inputs, labels in train_loader:
    lam = np.random.beta(alpha, alpha)  # 从 beta 分布采样 lambda
    index = torch.randperm(inputs.size(0))  # 随机打乱输入的索引
    images_a, images_b = inputs, inputs[index]  # 得到原始图像和打乱后的图像
    labels_a, labels_b = labels, labels[index]  # 对应的原始标签和打乱后的标签

    mixed_images = lam * images_a + (1 - lam) * images_b  # 生成混合图像

    outputs = model(mixed_images)  # 模型对混合图像进行预测
    _, preds = torch.max(outputs, 1) 

    loss = lam * criterion(outputs, labels_a) + (1 - lam) * criterion(outputs, labels_b)  # 计算混合后的损失
    # 后续进行反向传播和参数更新等操作

音频增强

在这里插入图片描述
时域主要还是在时间维度上进行处理,频域就是声音震动频率上进行一定处理
时间拉伸和压缩:改变音频的时间尺度,模拟不同的说话速度或音乐播放速度
音调变换:改变音频的音调,模拟不同的说话人或乐器。
添加噪声:向音频中添加不同类型的噪声,如白噪声、粉红噪声等,以提高模型对噪声的抗干扰能力。
频率掩码和时间掩码:在频谱图上随机掩盖一些频率或时间区域,迫使模型学习到更加鲁棒的特征表示4.
混响:模拟不同的房间环境,增加音频的丰富性。
声道分离:将多声道音频中的某些声道分离出来,训练模型对不同声道特征的学习
音量调整:调整音频的音量,模拟不同的音量大小。

import librosa
import numpy as np
import soundfile as sf

# 时间拉伸和压缩
def time_stretch_and_compress(audio, rate):
    stretched_audio = librosa.effects.time_stretch(audio, rate)
    return stretched_audio

# 音调变换
def pitch_shift(audio, n_steps):
    shifted_audio = librosa.effects.pitch_shift(audio, sr=librosa.get_samplerate(audio), n_steps=n_steps)
    return shifted_audio

# 添加噪声
def add_noise(audio, noise_type='white'):
    if noise_type == 'white':
        noise = np.random.randn(len(audio))
    elif noise_type == 'pink':
        noise = librosa.util.pink_noise(len(audio))
    augmented_audio = audio + noise
    return augmented_audio

# 频率掩码
def frequency_masking(audio, mask_ratio=0.1):
    stft = librosa.stft(audio)
    num_freq_bins = stft.shape[0]
    num_masked_freq_bins = int(num_freq_bins * mask_ratio)
    mask_start = np.random.randint(0, num_freq_bins - num_masked_freq_bins)
    stft[mask_start:mask_start + num_masked_freq_bins, :] = 0
    masked_audio = librosa.istft(stft)
    return masked_audio

# 时间掩码
def time_masking(audio, mask_ratio=0.1):
    stft = librosa.stft(audio)
    num_time_frames = stft.shape[1]
    num_masked_time_frames = int(num_time_frames * mask_ratio)
    mask_start = np.random.randint(0, num_time_frames - num_masked_time_frames)
    stft[:, mask_start:mask_start + num_masked_time_frames] = 0
    masked_audio = librosa.istft(stft)
    return masked_audio

# 混响
def add_reverb(audio, room_size=0.5):
    reverberated_audio = librosa.effects.reverb(audio, room_size=room_size)
    return reverberated_audio

# 声道分离
def channel_separation(audio, channel_index):
    separated_audio = audio[:, channel_index]
    return separated_audio

# 音量调整
def volume_adjustment(audio, gain):
    adjusted_audio = audio * gain
    return adjusted_audio

# 示例用法
audio, sr = librosa.load('audio_file.wav')  # 替换为您的音频文件路径

# 时间拉伸和压缩
stretched_audio = time_stretch_and_compress(audio, 1.5)  # 拉伸为 1.5 倍
sf.write('stretched_audio.wav', stretched_audio, sr)

# 音调变换
pitched_audio = pitch_shift(audio, 2)  # 升高 2 个半音
sf.write('pitched_audio.wav', pitched_audio, sr)

# 添加噪声
noisy_audio = add_noise(audio, 'white')
sf.write('noisy_audio.wav', noisy_audio, sr)

# 频率掩码
frequency_masked_audio = frequency_masking(audio)
sf.write('frequency_masked_audio.wav', frequency_masked_audio, sr)

# 时间掩码
time_masked_audio = time_masking(audio)
sf.write('time_masked_audio.wav', time_masked_audio, sr)

# 混响
reverberated_audio = add_reverb(audio)
sf.write('reverberated_audio.wav', reverberated_audio, sr)

# 声道分离(假设为双通道音频,分离第一个声道)
separated_audio = channel_separation(audio, 0)
sf.write('separated_audio.wav', separated_audio, sr)

# 音量调整
adjusted_audio = volume_adjustment(audio, 0.5)  # 音量减半
sf.write('adjusted_audio.wav', adjusted_audio, sr)
  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值