小样本学习

2023-05-16

机器学习就是从数据中学习,从而使完成任务的表现越来越好。小样本学习是具有有限监督数据的机器学习。类似的,其他的机器学习定义也都是在机器学习定义的基础上加上不同的限制条件衍生出来。例如,弱监督学习是强调在不完整、不准确、有噪声、数据少的数据上学习,半监督学习是强调在少量标注数据和大量非标注数据上学习,迁移学习是把充足数据上学习的知识迁移到数据匮乏的任务上。

所谓小样本是训练数据较少,小样本学习的先验知识来自三方面:数据、模型、算法,小样本学习的研究也都是从这三方面着手。因此,小样本学习方法大致可分为基于数据增强的方法、基于模型改进的方法、基于算法优化的方法。当把few-shot learning运用到分类问题上时,就可以称之为few-shot classification,当运用于回归问题上时,就可以称之为few-shot regression。

1、基于数据增强的方法

主要思路就是数据增强,通俗地讲就是扩充样本。小样本学习所使用的数据增强方法主要有三个思路:

1)只有小样本数据集:可以训练一个transformer学习样本之间的变化,然后使用该transformer对小样本数据集进行扩充;

2)有小样本数据集+弱标注数据集:可以训练transformer从弱标注数据集中“挑选”样本来扩充小样本数据集;

3)有小样本数据集+相似的数据集:可以训练一个GAN网络,通过学习给小样本数据集加上扰动来生成新样本。

2、分类任务的小样本学习

总结:https://blog.csdn.net/qq_24178985/article/details/119900076

举例:小敏生日,在动物园游玩。小敏走进极地馆,发现了一毛茸茸的可爱小动物,她非常喜欢,但是小敏之前只认识其它动物,没有见过这种动物。小敏拿出入园时领取的动物学识卡,逐一翻阅卡片,确定图一中的小动物是狐狸。

2.1、Support Set 和 Query

在小样本学习中,动物学识卡这种数据集被称为Support Set,种需要判断其类别的图片被成为Query。根据Support Set中类别数量和样本数量的不同,Support Set 可被称为 k-way、 n-shot Support Set。小样本分类问题一般被定义为 K-way N-shot 问题。

k-way:Support Set中存在 k 个类别

n-shot:每个类别中存在 n 个样本

在上述小敏学会辨认狐狸的例子中,小敏入园时领取的动物学识卡构成的Support Set中有狐狸、松鼠、兔子、仓鼠、水獭和海狸6种不同的小动物,因此 k 等于6。每种小动物卡片只有一张,所有 n 等于1。这个Support Set是6-way 1-shot Support Set。

小样本分类准确率会受到Support Set中类别数量和样本数量的影响,随着类别数量增加,分类准确率会降低。随着每个类别样本数增加,分类会更准确。

Support Set与训练集的区别:

训练集是一个非常大的数据集,每一类均包含非常多张图片。训练集足够大,可以用来训练一个深度神经网络。Support Set非常小,每一类只包含一张或几张图片,不足以训练一个深度神经网络。Support Set用于在预测时提供额外信息,使得模型能够断出所属类别不在训练集中的Query图片的类别。

即:先通过大的数据集训练一个能够区分与本类别相似的分类网络,之后在 Support Set 上微调。查询测试则在 Query 上进行。

2.2、基本思路

在小样本学习问题中,Support Set中每一类往往只有少数几个样本,单单依靠这些样本,不可能训练出一个深度神经网络,甚至无法采用迁移学习中的Pretraining+Fine Tuning方法。即对于小样本学习问题,不能采用传统的监督学习方法来进行分类。

小样本学习的最基本想法是学习一个 sim 函数来判断相似度。给定两张图片 a 和 b,如果两张图片越相似,则 sim (a, b) 的值越大。在理想情况下,若 a 和 b 属于同一类,则 sim (a, b) = 1 ,若a 和 b 属于不同类,则 sim (a, b) = 0。具体可以按照如下思路解决小样本学习问题:

step1、在一个大数据集中学习一个判断两张图片相似程度的相似度函数;

step2、给定一个Query图片,将其和Support Set中各图片逐一对比,计算相似度;

step3、在Support Set中找到与Queryt图片相似度最高的图片,将其类别作为预测结果。

3、孪生网络

训练孪生网络需要用到一个大的分类数据集,数据集中每张图片均有标注,每一类均包含许多张图片。训练的第一种方法是每次从数据集中随机抽取两个样本,比较他们的相似度,并根据相似度函数损失更新网络参数。

首先须使用数据集来构造正样本和负样本,其中正样本用于告诉神经网络什么东西是同一类,负样本用于告诉神经网络事物之间的区别。构造正样本首先须从数据集中随机抽取一张图片 a,然后从同一类中随机抽取另一张图片 b,形成三元组( a, b, 1)。构造负样本每次先随机抽取一张图片 c,然后排除 c 的类别,从随机集中随机抽取另一张图片d,形成三元组(c , d,0)。重复上述构造正样本和负样本的过程,即可生成用于训练孪生网络的训练集。

搭建卷积神经网络用于提取图片中的特征,网络输入是一张图片 x ,输出是提取的特征向量 f(x)。将生成的训练集中一个样本的两张图片 x1和 x2 分别输入搭建的卷积神经网络,得到特征向量 h1 和 h2。将向量 h1 和 h2 结合形成特征向量 z (如令 z = concat(h1, h2)或 z=|h1-h2| 等等),然后用一些全连接层处理 z 向量,输出一个标量,并将该标量经过 Sigmoid 激活函数,得到一个介于0 ∼ 1之间的实数。

该实数可以衡量输入的两张图片 x1和 x2 之间的相似度,如果 x1和 x2 属于同一个类别,则输出实数应该接近于1,否则应该接近于0。使用网络输出与真实标签之间的交叉熵(CrossEntropy)作为损失函数,通过反向传播计算模型参数的梯度,并使用梯度下降法来更新模型参数。

训练孪生网络需要准备数量大致相当的正样本和负样本,负样本是不同类别的两张图片,其标签为0,通过训练使孪生网络输出接近于0。训练好孪生网络之后,可以用来做小样本分类。逐一对比Query图片与Support Set中的图片,返回Support Set中相似度最高的图片类别作为预测结果。

4、Triplet Loss

上述训练孪生网络方法从理论上看起来很完美,但是在深度学习实践中,上述方法效果并不是特别好。在深度学习领域,理论上看起来很完美,但是实际效果却一塌糊涂的例子数见不鲜,比上述方法更好的训练孪生网络的方法是使用Triplet Loss。

使用Triplet Loss,在构建训练集时,需每次从数据集中选取3张图片。首先从数据集中随机选取一张图片作为锚点(Anchor),再从锚点图片所在类别中随机抽取另一张图片作为正样本(Positive),然后排除锚点图片所在类别,从数据集中随机选取一张图片作为负样本(Negative)。

将锚点图片、正样本图片和负样本图片分别输入搭建好的用于提取图片特征的卷积神经网络,得到三个特征向量,计算类内、类间距离。训练时希望类内距离越小、类间距离越大。

训练孪生网络的损失函数首先应该鼓励正样本在特征空间上接近锚点,即使d+尽量小。其次应该鼓励负样本在特征空间上远离锚点,即使d-尽量大。因此,可分为如下两种情况:

确定损失函数之后,可以求损失函数关于模型参数的梯度,并使用随机梯度下降法更新模型参数。训练好孪生网络之后,可以通过如下方法来做小样本分类。

将Query图片和Support Set中所有图片全部转化为特征向量,然后依次计算Query图片对应的特征向量和Support Set中各图片对应特征向量之间的距离,返回Support Set中距离最小的图片类别作为预测结果。

参考文献:

1、Generalizing from a Few Examples: A Survey on Few-Shot Learning

https://arxiv.org/pdf/1904.05046.pdf

2、距离你解决小样本/少数据难题,只差这篇文章

https://mp.weixin.qq.com/s/WsQWRbtkylDC81EXOI6NxA

3、小样本学习(Few-Shot Learning)

https://blog.csdn.net/qq_24178985/article/details/119900076

4、【机器学习】Few-shot learning(少样本学习)

https://blog.csdn.net/weixin_44211968/article/details/121314757

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小样本学习 的相关文章

随机推荐

  • 虚拟主机ip和服务器ip一样,虚拟主机独立ip和服务器的独立ip区别-

    虚拟从机独立ip和办事器的独立ip区别是什么 xff1f 从IP利用上来看 xff0c 虚拟从机分派的独立IP和办事器的独立IP并没无什么区别 xff0c 都是一样的拜候感化 虽然虚拟从机是从办事器上划分出来的一部门空间 xff0c 不外度
  • TX2系统镜像制作及烧写

    可以通过制作镜像的方法来快速复制板子的环境 xff0c 达到快速部署的目的 tx2系列资源总目录地址 xff1a https blog csdn net weixin 34910922 article details 106933180 P
  • tx2刷机-安装环境

    tx2系列资源总目录地址 xff1a https blog csdn net weixin 34910922 article details 106933180 1 解压 Linux Driver Package xff0c 生成文件夹目录
  • TX2下查看CPU GPU 内存使用率

    声明 xff1a 文章仅作知识整理 分享 xff0c 如有侵权请联系作者删除博文 xff0c 谢谢 xff01 tx2系列资源总目录地址 xff1a https blog csdn net weixin 34910922 article d
  • onnxsim-让导出的onnx模型更精简

    用torch导出的模型有时候参数过多 xff0c 不利于查看 查找资料onnxsim可以简化模型 xff0c 让显示更加自然 如 xff0c reshap层的导出 xff0c 红框中细节参数被显示出现 默认导出 xff1a 使用onnxsi
  • conda国内源-持续更新

    清华源 中科大源大部分时间能用 xff0c 但没事也会被封 最近发现的北外源挺好用 推荐使用 xff1a 北外镜像 xff08 推荐 xff09 xff1a conda config add channels https mirrors b
  • (三)PX4在gazebo中仿真障碍物检查与路径规划【完全SIL】

    首先完成 ROS PX4 firmware gazebo的环境配置 可以参考上一篇博客 二 PX4编译与gazebo仿真环境的搭建 ubuntu14 amp ubuntu16 安装 障碍物检测与路径规划的一些依赖库 span class h
  • python使用tcp传输图像

    使用tcp进行图像网络收发 主要分为两个部分 xff1a 1 服务端 step1 启动服务 xff0c 等待客户端连接 xff1b step2 等待并接受客户端数据 xff1b step3 接收的二进制流解码 xff0c 显示 xff1b
  • apt-get install 报错:无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

    sudo apt get install安装软件时 xff0c 出现错误 无法修正错误 xff0c 因为您要求某些软件包保持现状 xff0c 就是它们破坏了软件包间的依赖关系 提示已经很明显了 xff0c 依赖关系问题 百度后 xff0c
  • 数据增强(Data Augmentation)常用方法汇总

    1 数据增强的作用 1 xff09 避免过拟合 当数据集具有某种明显的特征 xff0c 例如数据集中图片基本在同一个场景中拍摄 xff0c 使用Cutout方法和风格迁移变化等相关方法可避免模型学到跟目标无关的信息 2 xff09 提升模型
  • uint8_t和char的相互转换

    uint8 t 和char 的相互转换以及uint8 t 和int16 t 的相互转换 实际应用需要 xff0c 实现uint8 int16 t int32 t的按字节传输 xff0c 实现发送和接收功能 如int16 t xff0c 需要
  • c++ sleep函数头文件

    c 43 43 11标准 xff0c 提供线程休眠函数 xff1a using namespace std chrono literals std this thread sleep for 5 线程休眠5ms 1 windows下支持 x
  • shell指令自带sudo密码

    希望在sh脚本文件中的shell指令中使用sudo命令 xff0c 需要自动输入密码以确保顺序执行 有两种方式可以实现 xff1a 1 将密码以参数形式追加到脚本 使用管道 xff1a echo 密码 sudo S shell命令 如 xf
  • qt 线程同步-互斥量(Qmutex)

    在多线程应用程序中 xff0c 由于多个线程的存在 xff0c 线程之间可能需要访问同一个变量 xff0c 或一个线程需要等待另外一个线程完成某个操作后才产生相应的动作 xff0c 这时候就需要做线程同步 所以 xff0c 需要线程同步情况
  • qt下使用opencv读取视频

    测试环境 xff1a ubuntu18 04 43 opencv4 2 43 Qt 一个基础的opencv读取视频并显示demo video pro文件 xff1a SOURCES 43 61 main cpp INCLUDEPATH 43
  • KITTI数据集下载链接

    1 简介 KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办 xff0c 是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集 该数据集用于评测立体图像 stereo xff0c 光流 optical flow xf
  • python ftp下载上传文件或文件夹

    目录 1 包引用 2 函数说明 2 1 连接登录 2 2 常规操作指令 xff08 对标linux指令 xff09 2 3 上传文件 2 4 下载文件 2 5 退出 实际需要 xff0c 编写一个脚本 xff0c 通过ftp下载文件或这文件
  • C++ fstream/ifstream/ofstream文件读写操作

    文章目录 写在前面1 fstream类的成员函数 open xff0c close open读写操作 2 fstream子类 ofstream ifstreamofstream 向文件中写数据ifstream 从文件中读数据 写在前面 在C
  • yolov3 完整讲解-从数据编码角度介绍

    对yolo系列文章的发展做个总结 神经网络训练模型的根本就是真值与预测值比较 xff0c 落实到不同任务最根本的区别的就是对真值的编码 理解深度学习的关键是明白真实值如何编码 xff0c 下面从这个角度介绍 1 问题的引入 深度学习最早用来
  • 小样本学习

    机器学习就是从数据中学习 xff0c 从而使完成任务的表现越来越好 小样本学习 是具有有限监督数据的机器学习 类似的 xff0c 其他的机器学习定义也都是在机器学习定义的基础上加上不同的限制条件衍生出来 例如 xff0c 弱监督学习 是强调