为特征向量数据(1D数组)叠加噪声实现数据增强

为特征向量数据(1D数组)叠加噪声实现数据增强

日期作者版本备注
2023.09.11Dog TaoV1.0完成文档的初始版本。

文章目录

  • 为特征向量数据(1D数组)叠加噪声实现数据增强
    • 背景介绍
    • 叠加噪声的主要方法
      • 高斯噪声(Gaussian Noise)
      • 均匀噪声(Uniform Noise)
      • 盐与胡椒噪声(Salt and Pepper Noise)
      • 随机遮挡噪声(Random Occlusion Noise)
      • 数据裁剪
    • 函数封装

背景介绍

数据增强(Data Augmentation)是一种在训练机器学习和深度学习模型时使用的技术,旨在通过对原始数据进行小的、随机的修改,来增加训练集的大小和多样性。这种增强的方法可以帮助模型学到更多的数据变化,从而增强模型的泛化能力,并减少过拟合。
在这里插入图片描述
根据数据的类型和特点,存在各种不同的数据增强技术。以下是针对不同类型数据的一些常见的数据增强方法:

  1. 图像数据:

    • 旋转、缩放、剪切
    • 色彩抖动(亮度、对比度、饱和度、色调变化)
    • 噪声注入(盐与胡椒噪声、高斯噪声)
    • 水平和垂直翻转
    • 仿射变换
    • 随机遮挡或模糊
  2. 时序数据/1D信号:

    • 噪声注入
    • 时间拉伸或压缩
    • 随机遮挡
    • 滑动窗口平均
    • 高频和低频滤波
  3. 文本数据:

    • 同义词替换
    • 随机删除、插入或交换单词
    • 句子重组
    • 回译(将文本翻译成另一种语言,然后再翻译回原语言)
  4. 音频数据:

    • 噪声注入(背景噪声、白噪声)
    • 变速不变调
    • 音高调整
    • 时间拉伸或压缩
    • 混响或其他音效添加
  5. 表格数据:

    • 抖动(对值进行轻微调整)
    • 特征交叉(组合两个或更多的特征)
    • 数据插补(使用统计方法或模型预测缺失值)
  6. 视频数据:

    • 与图像数据增强相似的技术,但在时间维度上应用
    • 帧间隔调整
    • 视频裁剪或切片

当考虑数据增强技术时,重要的是确保增强方法不会破坏数据的原始语义或特征。此外,应始终在一个验证集上评估模型,该验证集没有应用相同的增强方法,以确保模型的泛化能力。

叠加噪声的主要方法

一般情况下,在机器学习中一个特征数据的表示形式为一个高维向量(例如时序数据、传感器数据或任何非结构化的一维数据)。为一个高维向量增加噪声以实现数据增强,可以考虑以下几种方法:

高斯噪声(Gaussian Noise)

高斯噪声是最常用的噪声类型,它的值是根据正态分布(高斯分布)来生成的。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as npdef add_gaussian_noise_np(np_array, mean=0, std=1):"""向numpy数组添加高斯噪声。参数:np_array (np.Array): 输入数组。mean (float): 高斯噪声的平均值。std (float): 高斯噪声的标准差。返回:np.Array: 添加了噪声的数组。"""noise = np.random.normal(mean, std, np_array.shape)return np_array + noise
  • 基于torch.tensor类型
import torchdef add_gaussian_noise_torch(tensor, mean=0, std=1):"""向torch.tensor添加高斯噪声。参数:tensor (torch.Tensor): 输入张量。mean (float): 高斯噪声的平均值。std (float): 高斯噪声的标准差。返回:torch.Tensor: 添加了噪声的张量。"""noise = torch.normal(mean, std, size=tensor.shape)return tensor + noise

均匀噪声(Uniform Noise)

与高斯噪声不同,均匀噪声的值是从一个均匀分布中随机选取的。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as npdef add_uniform_noise_np(array, low=-1, high=1):"""向numpy数组添加均匀噪声。参数:array (np.Array): 输入数组。low (float): 均匀噪声的最小值。high (float): 均匀噪声的最大值。返回:np.Array: 添加了噪声的数组。"""noise = np.random.uniform(low, high, array.shape)return array + noise
  • 基于torch.tensor类型
import torchdef add_uniform_noise_torch(tensor, low=-1, high=1):"""向torch.tensor添加均匀噪声。参数:tensor (torch.Tensor): 输入张量。low (float): 均匀噪声的最小值。high (float): 均匀噪声的最大值。返回:torch.Tensor: 添加了噪声的张量。"""noise = torch.FloatTensor(tensor.size()).uniform_(low, high)return tensor + noise

盐与胡椒噪声(Salt and Pepper Noise)

这种噪声会将向量中的某些元素设置为最大值(例如1)或最小值(例如0),模拟真实世界中的“损坏”数据。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as npdef add_salt_pepper_noise_np(array, salt_prob=0.05, pepper_prob=0.05):"""向numpy数组添加盐和胡椒噪声。参数:array (np.Array): 输入数组。salt_prob (float): 盐噪声的概率。pepper_prob (float): 胡椒噪声的概率。返回:np.Array: 添加了噪声的数组。"""noise = np.random.choice([0, 1, 2], size=array.shape, p=[pepper_prob, salt_prob, 1 - salt_prob - pepper_prob])array[noise == 0] = 0array[noise == 1] = 1return array
  • 基于torch.tensor类型
import torchdef add_salt_pepper_noise_torch(tensor, salt_prob=0.05, pepper_prob=0.05):"""向torch.tensor添加盐和胡椒噪声。参数:tensor (torch.Tensor): 输入张量。salt_prob (float): 盐噪声的概率。pepper_prob (float): 胡椒噪声的概率。返回:torch.Tensor: 添加了噪声的张量。"""noise = torch.multinomial(torch.tensor([pepper_prob, salt_prob, 1 - salt_prob - pepper_prob]), num_samples=tensor.numel(), replacement=True)tensor[noise == 0] = 0tensor[noise == 1] = 1return tensor

随机遮挡噪声(Random Occlusion Noise)

随机遮挡噪声模拟真实情况中可能出现的部分损坏或遮挡的数据,以提高模型的泛化能力。以下提供基于numpy.Array类型与torch.tensor类型的实现示例:

  • 基于numpy.Array类型
import numpy as npdef add_random_block_noise_np(array, block_size=5):"""向numpy数组添加随机遮挡噪声。参数:array (np.Array): 输入数组。block_size (int): 遮挡区域的长度。返回:np.Array: 添加了噪声的数组。"""# 确定开始点,确保有足够的空间添加遮挡start_idx = np.random.randint(0, array.shape[0] - block_size)# 将遮挡区域设置为0array[start_idx:start_idx+block_size] = 0return array
  • 基于torch.tensor类型
import torchdef add_random_block_noise_torch(tensor, block_size=5):"""向torch.tensor添加随机遮挡噪声。参数:tensor (torch.Tensor): 输入张量。block_size (int): 遮挡区域的长度。返回:torch.Tensor: 添加了噪声的张量。"""# 确定开始点,确保有足够的空间添加遮挡start_idx = torch.randint(0, tensor.size(0) - block_size, (1,)).item()# 将遮挡区域设置为0tensor[start_idx:start_idx+block_size] = 0return tensor

在这些函数中,我们选择了一个随机的开始点,并从该点开始将一维数组或张量中的连续数据设置为0,直到达到指定的block_size。

数据裁剪

当我们向向量添加噪声后,可能需要考虑是否需要对结果进行裁剪或归一化,以确保它们仍然在一个合理的范围内。例如,如果向量值的范围是[0, 1],那么在添加噪声后,可能需要执行以下操作来确保噪声后的向量仍然在这个范围内:

noisy_vector = np.clip(noisy_vector, 0, 1)

函数封装

我们设计一个函数来为特征数据叠加噪声,实现数据增强。将设计的函数命名为data_augmentation,该函数会接受以下参数:

  • xy:分别对应样本数据和标签数据。
  • augment_factor:增强数量,例如你想为每一组样本和标签生成10组样本和标签,那么这个值应设为10。
  • sigma:高斯噪声的标准偏差。
  • noise_range:均匀噪声的范围。
  • prob:盐与胡椒噪声的概率。

函数会为每一组输入样本生成augment_factor个增强样本,并返回增强后的样本和标签集。例如令augment_factor=10,对于每个输入样本和标签,我们将获得30倍(3种噪声类型 ✖ augment_factor)的增强样本和标签。我们可以根据需要调整增强的数量和程度。

import torchdef add_gaussian_noise(tensor, sigma):"""为给定的tensor添加高斯噪声。参数:tensor: torch.Tensor - 输入的张量。sigma: float - 高斯噪声的标准偏差。返回:torch.Tensor - 添加了高斯噪声的张量。"""noise = torch.normal(mean=0., std=sigma, size=tensor.size())return tensor + noisedef add_uniform_noise(tensor, noise_range):"""为给定的tensor添加均匀噪声。参数:tensor: torch.Tensor - 输入的张量。noise_range: float - 均匀噪声的范围,噪声值将从[-noise_range, noise_range]选择。返回:torch.Tensor - 添加了均匀噪声的张量。"""noise = torch.FloatTensor(tensor.size()).uniform_(-noise_range, noise_range)return tensor + noisedef add_salt_and_pepper_noise(tensor, prob):"""为给定的tensor添加盐与胡椒噪声。参数:tensor: torch.Tensor - 输入的张量。prob: float - 添加盐或胡椒的概率。返回:torch.Tensor - 添加了盐与胡椒噪声的张量。"""noise = torch.FloatTensor(tensor.size()).uniform_(0, 1)salt_and_pepper = torch.where(noise < prob/2, torch.ones_like(tensor), torch.where(noise < prob, torch.zeros_like(tensor)-1, torch.zeros_like(tensor)))return tensor + salt_and_pepperdef data_augmentation(x, y, augment_factor=10, sigma=0.1, noise_range=0.05, prob=0.01):"""对给定的样本和标签进行数据增强。参数:x: torch.Tensor - 输入样本张量。y: torch.Tensor - 标签张量。augment_factor: int - 每种噪声类型的增强数量。sigma: float - 高斯噪声的标准偏差。noise_range: float - 均匀噪声的范围。prob: float - 盐与胡椒噪声的概率。返回:torch.Tensor, torch.Tensor - 增强后的样本和标签张量。"""augmented_x, augmented_y = [], []# 为每个输入样本添加高斯噪声for _ in range(augment_factor):augmented_x.append(add_gaussian_noise(x, sigma))augmented_y.append(y)  # 噪声仅影响输入数据,不影响标签# 为每个输入样本添加均匀噪声for _ in range(augment_factor):augmented_x.append(add_uniform_noise(x, noise_range))augmented_y.append(y)# 为每个输入样本添加盐与胡椒噪声for _ in range(augment_factor):augmented_x.append(add_salt_and_pepper_noise(x, prob))augmented_y.append(y)# 返回堆叠后的增强样本和标签return torch.stack(augmented_x), torch.stack(augmented_y)if __name__ == "__main__":# 使用示例x = torch.rand((1024,))y = torch.tensor([1])  # 假设这是一个标签augmented_x, augmented_y = data_augmentation(x, y, augment_factor=10, sigma=0.1, noise_range=0.05, prob=0.01)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/129276.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务05-Docker基本操作

Docker的定义 1.什么是Docker Docker是一个快速交付应用、运行应用的技术&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通过一行命令完…

超详细-Vivado配置Sublime+Sublime实现VHDL语法实时检查

目录 一、前言 二、准备工作 三、Vivado配置Sublime 3.1 Vivado配置Sublime 3.2 环境变量添加 3.3 环境变量验证 3.4 Vivado设置 3.5 配置验证 3.6 解决Vivado配置失败问题 四、Sublime配置 4.1 Sublime安装Package Control 4.2 Sublime安装VHDL插件 4.3 语法检查…

STM32F4X DMA

STM32F4X DMA 什么是DMASTM32F4X DMADMA框图DMA通道DMA仲裁器DMA FIFO DMA传输模式DMA传输方向存储器到存储器存储器到外设外设到存储器 DMA循环模式和普通模式循环模式&#xff08;Circular&#xff09;普通模式&#xff08;Normal&#xff09; DMA源、目标寄存器增量模式DMA例…

React【组件生命周期 、组件生命周期_挂载、 组件生命周期_更新 、组件生命周期_卸载、表单_受控组件、表单_受控组件处理多个输入】(三)

文章目录 组件生命周期 组件生命周期_挂载 组件生命周期_更新 组件生命周期_卸载 表单_受控组件 表单_受控组件处理多个输入 组件生命周期 每个组件都有自己的生命周期&#xff0c;从“生”到”死“。 在这个过程当中&#xff0c;它会有不同的状态&#xff0c;针对不同的状态…

大型语言模型的幻觉研究|减轻及避免大模型LLM幻觉(二)

“ 本文及上一篇综述了最近关于语言模型中幻觉问题的研究进展&#xff0c;主要集中在ChatGPT发布后的研究。文章讨论了如何评估、追踪和消除幻觉&#xff0c;并探讨了现有挑战和未来方向。希望本文能为对LLM幻觉问题感兴趣的朋友提供有价值的资源&#xff0c;促进LLM的实际应用…

【数学建模竞赛】超详细Matlab二维三维图形绘制

二维图像绘制 绘制曲线图 g 是表示绿色 b--o是表示蓝色/虚线/o标记 c*是表示蓝绿色(cyan)/*标记 ‘MakerIndices,1:5:length(y) 每五个点取点&#xff08;设置标记密度&#xff09; 特殊符号的输入 序号 需求 函数字符结构 示例 1 上角标 ^{ } title( $ a…

Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私

1. 引言 Aztec的架构&#xff0c;不同于当前“通过EVM兼容执行环境”所实现的区块链水平扩容趋势。Aztec内部笑称其构建的为首个非zkEVM协议。 Aztec专注于实现&#xff1a; 成为理解和需要智能合约隐私的开发者的终极解决方案。 Aztec为开发者提供构建隐私优先app所需的网…

Java 复习笔记 - 面向对象进阶篇

文章目录 一&#xff0c;Static&#xff08;一&#xff09;Static的概述&#xff08;二&#xff09;静态变量&#xff08;三&#xff09;静态方法&#xff08;四&#xff09;工具类&#xff08;五&#xff09;static的注意事项 二&#xff0c;继承&#xff08;一&#xff09;继…

TortoiseSVN 详细操作指南

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 热爱技术的小郑 1、引言 考虑以下几种情况&#xff1a; 你是否在一个…

Nginx详解 五:反向代理

文章目录 1. 正向代理和反向代理1.1 正向代理概述1.1.1 什么是正向代理1.1.2 正向代理的作用1.1.3 正向代理的基本格式 1.2 反向代理概述1.2.1 什么是反向代理1.2.2 反向代理可实现的功能1.2.3 反向代理的可用模块 2. 配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其…

华为云云耀云服务器L实例评测|老用户回归的初印象

华为云云耀云服务器L实例评测&#xff5c;老用户回归的初印象 前言一、新面孔1. 云耀云服务器2. 服务器特色 二、上手感官体验1. 性价比感受2. 推荐宝塔面板3. CloudShell登录4. 安全性 总结 前言 其实笔者接触华为云已经很久了&#xff0c;第一次使用的云服务器就是华为云。当…

C# 反射机制

图片来自&#xff1a;https://www.cnblogs.com/tangge/p/3440605.html

探索多态的本质【C++】

文章目录 多态的构成条件虚函数虚函数的重写&#xff08;覆盖&#xff09; 虚函数重写的两个例外C11 override和final区分重载、覆盖(重写)、隐藏(重定义)抽象类接口继承和实现继承多态的原理虚函数表 动态绑定和静态绑定动态绑定静态绑定 单继承中的虚函数表多继承中的虚函数表…

视频监控平台EasyCVR分组批量绑定/取消通道功能的后端代码设计逻辑介绍

视频监控平台/视频存储/视频分析平台EasyCVR基于云边端一体化管理&#xff0c;可支持视频实时监控、云端录像、云存储、磁盘阵列存储、回放与检索、智能告警、平台级联等功能。安防监控平台在线下场景中应用广泛&#xff0c;包括智慧工地、智慧工厂、智慧校园、智慧社区等等。 …

Ubuntu20.04同时安装ROS1和ROS2

Ubuntu20.04同时安装ROS1和ROS2 Excerpt 每版的Ubuntu系统版本都有与之对应ROS版本的&#xff0c;每一版ROS都有其对应版本的Ubuntu版本&#xff0c;不可随便装&#xff0c;ubuntu20.04对应ROS1 noetic和ROS2 foxy版本。_ros1和ros2共存 Ubuntu20.04同时安装ROS1和ROS2共存 文…

Vue+NodeJS+MongoDB实现邮箱验证注册、登录

一.主要内容 邮件发送用户注册用户信息存储到数据库用户登录密码加密JWT生成tokenCookie实现快速登录 在用户注册时,先发送邮件得到验证码.后端将验证进行缓存比对,如果验证码到期,比对不正确,拒绝登录;如果比对正确,将用户的信息进行加密存储到数据库. 用户登录时,先通过用…

[H5动画制作系列] Sprite及Text Demo

参考代码: sprite.js: var canvas, stage, container; canvas document.getElementById("mainView"); function init() {stage new createjs.Stage(canvas);createjs.Touch.enable(stage);var loader new createjs.LoadQueue(false);loader.addEventListener(&q…

Docker的开源容器镜像仓库Harbor安装

概述 Docker Hub是Docker官方提供的在线Docker镜像注册中心&#xff0c;其支持Docker镜像的查询&#xff08;search&#xff09;、提交&#xff08;push&#xff09;以及获取&#xff08;pull&#xff09;。目前&#xff0c;在云原生领域中&#xff0c;CNCF提供Harbor开源版本…

创建开机自启的脚本

在启动许多ros节点时有多种方式&#xff0c;我推荐使用launch来启动所有的节点&#xff0c;这也是一种规范的方式。以后会慢慢向这个方向靠。 除此之外还可以通过创建的脚本来启动&#xff1a; 脚本位置不限&#xff0c;只需要&#xff1a; sudo gedit xxx.sh在里面添加相应的…

UI设计师的发展前景是否超越了平面设计?

这是一个现代经济学的典型话题&#xff1a;应该跟随趋势追逐风口&#xff0c;还是坚守成熟的“夕阳产业” UI 设计行业发展短短不过 20 多年&#xff0c;但平面设计这个“夕阳产业”最早可以追溯到上世纪的二三十年代。显而易见的答案是&#xff0c;更新兴的 UI 设计师得到的好…