数据增强,扩充了数据集,增加了模型的泛化能力
-
数据增强(Data Augmentation)是在不实质性的增加数据的情况下,从原始数据加工出更多的表示,提高原数据的数量及质量,以接近于更多数据量产生的价值。
-
其原理是,通过对原始数据融入先验知识,加工出更多数据的表示,有助于模型判别数据中统计噪声,加强本体特征的学习,减少模型过拟合,提升泛化能力。
-
机器学习或深度学习模型的训练的目标是成为“通用”模型。这就需要模型没有过度拟合训练数据集,或者换句话说,我们的模型对看不见的数据有很好的了解。数据增强也是避免过度拟合的众多方法之一。
-
如经典的机器学习例子–哈士奇误分类为狼:通过可解释性方法,可发现错误分类是由于图像上的雪造成的。通常狗对比狼的图像里面雪地背景比较少,分类器学会使用雪作为一个特征来将图像分类为狼还是狗,而忽略了动物本体的特征。此时,可以通过数据增强的方法,增加变换后的数据(如背景换色、加入噪声等方式)来训练模型,帮助模型学习到本体的特征,提高泛化能力。图像本身的变化将有助于模型对未见数据的泛化,从而不会对数据进行过拟合。
-
需要关注的是,数据增强样本也有可能是引入片面噪声,导致过拟合。此时需要考虑的是调整数据增强方法,或者通过算法(可借鉴Pu-Learning思路)选择增强数据的最佳子集,以提高模型的泛化能力。
-
PU Learning(Positive-unlabeled learning)是半监督学习的一个研究方向,指在只有正类和无标记数据的情况下,训练二分类器。
-
启发式地从未标注样本里找到可靠的负样本,以此训练二分类器,该方法问题是分类效果严重依赖先验知识。
-
将未标注样本作为负样本训练分类器,由于负样本中含有正样本,错误的标签指定导致分类错误。
-
-
-
单样本增强
-
单(图像)样本增强主要有几何操作、颜色变换、随机擦除、添加噪声等方法。在计算机视觉中,典型的数据增强方法有翻转(Flip),旋转(Rotat ),缩放(Scale),随机裁剪或补零(Random Crop or Pad),色彩抖动(Color jittering),加噪声(Noise)
-
imgaug是一款非常有用的python图像增强库,非常值得推荐应用于深度学习图像增强。其包含许多增强技术,支持图像分类,目标检测,语义分割,热图、关键点检测等一系列任务的图像增强。
-
-
多样本数据增强方法
- 多样本增强是通过先验知识组合及转换多个样本,主要有Smote、SamplePairing、Mixup等方法在特征空间内构造已知样本的邻域值。
-
Transforms 是常用的图像数据增强模块。可以使用 Compose 将它们链接在一起。
-
可视化数据增强:
-
import PIL.Image as Image import torch from torchvision import transforms import matplotlib.pyplot as plt import numpy as np import warnings plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文 plt.rcParams['axes.unicode_minus'] = False # 显示负号 def imshow(img_path, transform):"""Function to show data augmentationParam img_path: path of the imageParam transform: data augmentation technique to apply"""img = Image.open(img_path)fig, ax = plt.subplots(1, 2, figsize=(10, 4))ax[0].set_title(f'原图 {img.size}')ax[0].imshow(img)img = transform(img)ax[1].set_title(f'变换后 {img.size}')ax[1].imshow(img)plt.show() path = 'imgs/000000000049.jpg'-
Resize/Rescale:用于将图像的高度和宽度调整为我们想要的特定大小。
-
transform = transforms.Resize((640, 640)) imshow(path, transform) -

-
Cropping:将要选择的图像的一部分应用于新图像。例如,使用 CenterCrop 来返回一个中心裁剪的图像。
-
transform = transforms.CenterCrop((640, 640)) -

-
RandomResizedCrop:这种方法同时结合了裁剪和调整大小。
-
transform = transforms.RandomResizedCrop((640, 640)) -

-
Flipping:水平或垂直翻转图像
-
transform = transforms.RandomHorizontalFlip() -

-
Padding:填充包括在图像的所有边缘上按指定的数量填充。
-
transform = transforms.Pad((50,50,50,50)) -

-
Rotation:对图像随机施加旋转角度。
-
transform = transforms.RandomRotation(45) -

-
Random Affine:对图像进行仿射变换,仿射变换是 2 维的线性变换,由 5 种基本操作组成,分别是旋转、平移、缩放、错切和翻转。RandomAffine — Torchvision main documentation (pytorch.org)
-
transform = transforms.RandomAffine(1, translate=(0.5, 0.5), scale=(1, 1), shear=(1,1), fillcolor=(256,256,256)) -

-
Gaussian Blur:图像将使用高斯模糊进行模糊处理。
-
transform = transforms.GaussianBlur(7, 3) -

-
Grayscale:将彩色图像转换为灰度。
-
transform = transforms.Grayscale(num_output_channels=3) -

-
Brightness:改变图像的亮度当与原始图像对比时,生成的图像变暗或变亮。
-
transform = transforms.ColorJitter(brightness=2) -

-
Contrast:图像最暗和最亮部分之间的区别程度被称为对比度。图像的对比度也可以作为增强进行调整。
-
transform = transforms.ColorJitter(contrast=2) -

-
Saturation:图片中颜色的分离被定义为饱和度。
-
transform = transforms.ColorJitter(saturation=20) -

-
Hue:色调被定义为图片中颜色的深浅。
-
transform = transforms.ColorJitter(hue=0.4) #hue:[-0.5,0.5] -

-
-
图像本身的变化将有助于模型对未见数据的泛化,从而不会对数据进行过拟合。以上整理的都是我们常见的数据增强技术,torchvision中还包含了很多方法,可以在他的文档中找到:https://pytorch.org/vision/stable/transforms.html
-
tencorp:FiveCrop在图像的上下左右以及中心裁剪出尺寸为 size 的 5 张图片。Tencrop对这 5 张图片进行水平或者垂直镜像获得 10 张图片。
-
def transform_invert(img_, transform_train):"""将data 进行反transfrom操作:param img_: tensor:param transform_train: torchvision.transforms:return: PIL image"""# 如果有标准化操作if 'Normalize' in str(transform_train):# 取出标准化的 transformnorm_transform = list(filter(lambda x: isinstance(x, transforms.Normalize), transform_train.transforms))# 取出均值mean = torch.tensor(norm_transform[0].mean, dtype=img_.dtype, device=img_.device)# 取出标准差std = torch.tensor(norm_transform[0].std, dtype=img_.dtype, device=img_.device)# 乘以标准差,加上均值img_.mul_(std[:, None, None]).add_(mean[:, None, None])# 把 C*H*W 变为 H*W*Cimg_ = img_.transpose(0, 2).transpose(0, 1) # C*H*W --> H*W*C# 把 0~1 的值变为 0~255img_ = np.array(img_) * 255# 如果是 RGB 图if img_.shape[2] == 3:img_ = Image.fromarray(img_.astype('uint8')).convert('RGB')# 如果是灰度图elif img_.shape[2] == 1:img_ = Image.fromarray(img_.astype('uint8').squeeze())else:raise Exception("Invalid img shape, expected 1 or 3 in axis 2, but got {}!".format(img_.shape[2]) )return img_ img = Image.open(path) transform = Compose([TenCrop(224, vertical_flip=True), # this is a list of PIL ImagesLambda(lambda crops: torch.stack([ToTensor()(crop) for crop in crops])) # returns a 4D tensor ]) img_tensor = transform(img) b,c,h,w=img_tensor.shape plt.figure(figsize=(15,4)) for i in range(b):img = transform_invert(img_tensor[i], transform)plt.subplot(2, 5, i+1)plt.imshow(img) plt.show() -

-
RandomErasing:对图像进行随机遮挡。这个操作接收的输入是 tensor。
-
transform = Compose([transforms.ToTensor(),transforms.RandomErasing(p=1, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=(100/255, 0, 0)), ]) img_tensor = transform(img) convert_img=transform_invert(img_tensor, transform) plt.subplot(1, 2, 1) plt.imshow(img) plt.subplot(1, 2, 2) plt.imshow(convert_img) plt.show() -

-
-
transforms.RandomChoice:从一系列 transforms 方法中随机选择一个
-
torchvision.transforms.RandomChoice([transforms1, transforms2, transforms3])
-
-
transforms.RandomApply:根据概率执行一组 transforms 操作,要么全部执行,要么全部不执行。
-
torchvision.transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
-
-
transforms.RandomOrder:对一组 transforms 操作打乱顺序
-
transforms.RandomOrder([transforms1, transforms2, transforms3])
-
相关文章:
数据增强,扩充了数据集,增加了模型的泛化能力
数据增强(Data Augmentation)是在不实质性的增加数据的情况下,从原始数据加工出更多的表示,提高原数据的数量及质量,以接近于更多数据量产生的价值。 其原理是,通过对原始数据融入先验知识,加工…...
MySQL/Oracle获取当前时间几天/分钟前的时间
获取当前时间 要想获取当前时间几天/分钟前的时间,首先要知道怎么获取当前时间; 对于MySQL和Oracle获取当前时间的方法是不一样的; MySQL: select NOW(); 示例: Oracle: select sysdate from dual; 示…...
如何在Wordpress中使用wp_nav_menu()在<li>及a标记中添加Class
我正在使用wp_nav_menu($args),我想将my_own_classCSS类名添加到<li>元素中以获得以下结果:<li classmy_own_class><a href>Link</a>怎么做?wp_nav_menu()在<li>标记中添加Class方法一:只需使用其他参数并为nav_menu_css_…...
Chat Support Board WordPress聊天插件 v3.5.8
功能列表 支持和聊天功能 Slack聊天完全同步 - 直接从Slack发送和接收用户信息。 立即工作 - 只需插入短码,即可立即安装和使用。 丰富的信息 - Dialogflow机器人发送丰富的信息。 机器人--集成一个由API.AI驱动的多语言机器人。 电子邮件通知 - 当收到回复时&#…...
2022年网络安全竞赛——数字取证调查attack.pcapng
攻击日志分析:需求环境可私信博主获取 任务环境说明: 服务器场景:PYsystem0031服务器场景操作系统:未知服务器场景FTP用户名:anonymous 密码:空从靶机服务器的FTP上下载attack.pcapng数据包文件,通过分析数据包attack.pcapng,找出黑客的IP地址,并将黑客的IP地址作为FL…...
2023最新MongoDB规范
前言 MongoDB是非关系型数据库的典型代表,DB-Engines Ranking 数据显示,近年来,MongoDB在 NoSQL领域一直独占鳌头。MongoDB是为快速开发互联网应用 而设计的数据库系统,其数据模型和持 久化策略就是为了构建高读/写的性能&#x…...
gcc的使用,调试工具gdb的使用
gcc编译 gcc编译可以分为四个步骤,预处理、编译、汇编、链接。 预处理命令:gcc -E hello.c -o hello.i编译命令:gcc -S hello.i -o hello.s汇编命令: gcc -c hello.s -o hello.o链接命令:gcc hello.o -o hello gcc…...
Python变量的定义和使用
定义:变量就是计算机内存中存储某些数据的位置的名称 形象理解变量就是一个存放东西的容器,该容器的名字就叫做变量,容器存放的东西就是变量的值 变量的组成: 标识:标识对象所储存的内存地址,使用内置函数i…...
SSM框架-AOP概述、Spring事务
16 spring整合mybatis 16.1 前情代码 实体类 public class Account {private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void …...
一文搞定Android Vsync原理简析
屏幕渲染原理"现代计算机之父"冯诺依曼提出了计算机的体系结构: 计算机由运算器,存储器,控制器,输入设备和输出设备构成,每部分各司其职,它们之间通过控制信号进行交互。计算机发展到现在,已经出…...
第八届蓝桥杯省赛 C++ B组 - K 倍区间
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:蓝桥杯题解集合 📝原题地址:K 倍区间 📣专栏定位:为想参加蓝桥杯的小伙伴整理常考算法题解,祝大家…...
UDP与TCP协议
目录 UDP协议 协议报头 UDP协议特点: 应用场景: TCP TCP协议报头 确认应答机制 理解可靠性 超时重传机制 连接管理机制 三次握手: 四次挥手: 滑动窗口 如何理解缓冲区和滑动窗口? 倘若出现丢包…...
rosbag相关使用工具
文章目录一、 rosbag 导出指定话题生成新rosbag二、 rosbag 导出视频1. 脚本工具源码2. 操作2.1 安装 ffmpeg2.2 导出视频3. 视频截取4. 压缩视频附录:rosbag2video.py 源码一、 rosbag 导出指定话题生成新rosbag rosbag filter 2023-02-25-19-16-01.bag depth.bag…...
数据结构与算法—栈stack
目录 栈 栈的复杂度 空间复杂度O(1) 时间复杂度O(1) 栈的应用 1、栈在函数调用中的应用; 2、栈在求表达式的值的应用: 栈的实现 栈 后进先出,先进后出,只允许在一端插入和删除 从功能上,数组和链表可以代替栈…...
【学习笔记】[ARC150F] Constant Sum Subsequence
第一眼看上去,这道题一点都不套路 第二眼看上去,大概是要考dpdpdp优化,那没事了,除非前面333道题都做完了否则直接做这道题肯定很亏 首先我们要定义一个好的状态。废话 设fsf_{s}fs表示BBB序列的和为sss时,能达到…...
Node.js实现大文件断点续传—浅析
Node.js简介: 当谈论Node.js时,通常指的是一个基于Chrome V8 JavaScript引擎构建的开源、跨平台的JavaScript运行时环境。以下是一些Node.js的内容: 事件驱动编程:Node.js采用了事件驱动的编程范式,这意味着它可以异步…...
Spring Cloud Nacos源码讲解(九)- Nacos客户端本地缓存及故障转移
Nacos客户端本地缓存及故障转移 在Nacos本地缓存的时候有的时候必然会出现一些故障,这些故障就需要进行处理,涉及到的核心类为ServiceInfoHolder和FailoverReactor。 本地缓存有两方面,第一方面是从注册中心获得实例信息会缓存在内存当…...
MySQL知识点小结
事务 进行数据库提交操作时使用事务就是为了保证四大特性,原子性,一致性,隔离性,持久性Durability. 持久性:事务一旦提交,对数据库的改变是永久的. 事务的日志用于保存对数据的更新操作. 这个操作T1事务操作的会发生丢失,因为最后是T2提交的修改,而且T2先进行一次查询,按照A…...
MySQL关于NULL值,常见的几个坑
数据库版本MySQL8。 1.count 函数 觉得 NULL值 不算数 ,所以开发中要避免count的时候丢失数据。 如图所示,以下有7条记录,但是count(name)却只有6条。 为什么丢失数据?因为MySQL的count函数觉得 Null值不算数,就是说…...
OllyDbgqaqazazzAcxsaZ
本文通过吾爱破解论坛上提供的OllyDbg版本为例,讲解该软件的使用方法 F2对鼠标所处的位置打下断点,一般表现为鼠标所属地址位置背景变红F3加载一个可执行程序,进行调试分析,表现为弹出打开文件框F4执行程序到光标处F5缩小还原当前…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
