小样本学习

前几天接触小样本学习 Few-Shot Learning,感觉很是有意思。看到Shusen Wang老师的讲解,感觉很棒~持续学习~

学会学习 Lean to learn

小朋友去动物园,见到未知的动物,他虽然不知道类别,但是给他看一些卡片,让他比比看哪个长得像,他们很快的判断出所见动物的类别,这就是人类的学习。

如果机器也可以学习呢?给一张图片(Query),这张图训练集并没有出现啊,但是不要慌,有卡片(Support Set)来让模型做选择题,依次比较相似度。学会完成多选一的选择题就是元学习(Meta Learning)需要学到的模型,也就是让机器学会学习。

比较:大样本与小样本学习

传统监督学习

训练集样本大,机器根据训练集中的图片,并泛化到测试集,给出图片,识别出具体的类别。

小样本学习

小样本直接训练神经网络会产生过拟合。小样本学习是元学习(Meta Learning) 的一种,希望模型学会学习,并不是让模型区分训练集未出现的新样本,而是是让机器学会学习事物的异同,给定图片,判断是否为同一类别。

小样本学习基础

基本概念

(1)k-way n-shot Support Set

k-way: support set 中类别数n-shot: 每一类的样本数

很明显,way越大,选择变多,准确率会下降,shot越大,样本数增多,准确率会增加。

(2)余弦相似度

衡量两个向量之间的的相似度,两个向量分别为xw,他们的二范数(长度)为1,两向量的内积为余弦相似度,可以理解为xw上投影的长度

如果两个向量长度不一致,需要将两向量归一化,取内积:

(3)softmax

softmax函数是常见激活函数,将向量映射为概率分布,常作为网络最后一层,输出的每个概率值表示对每个类别的Confidence(置信度)。让大的值变大,小的值变小,也就平和一点的max。

softmax 分类器,输入为特征值(全连接层输出的),输出为k维(k是类别数)的概率,W和b维参数,反向传播会训练。

数据集

(1)Omniglot

  • 手写数据集,50种不同语言的1632个类别,每个类别有20个样本,样本尺寸为105*105
  • 训练集:964类,19280个样本
  • 测试集:659类,13180个样本

(2)Mini-ImageNet

  • Matching Networks for One Shot Learning(MAML)论文中提出,从ImageNet提取100类,每个类别600样本,样本尺寸为84*84
  • 训练集:64类,38400个样本
  • 验证集:16类,9600个样本
  • 测试集:20类,1200个样本

网上只有从ImagNet上的原图和CSV文件,我按照MAML的方法生成的数据集,并上传到网盘:

链接:https://pan.baidu.com/s/1nt2WTIXM-bx3s0s51_v_eg 提取码:obg7

基本思想

  1. 预训练:从大规模数据集中训练一个卷积神经网络f来提取图像特征。可以是分类网络去掉全连接层,也可以使用孪生网络(Siamese Network)。
  2. 小样本预测 :将query和support set 中每个样本映射到特征空间,得到特征,依次比较querysupport set中每个特征的相似度( Similarity),进行判定。但是更常用的方法是用support set训练一个分类器,再进行预测,称为Fine Tuning。

预训练:孪生网络

Siamese Network, Siamese意思是连体婴儿,也就是网络的头不一样,但是脚连在一起,Siamese Network为孪生网络/连体网络。该网络最主要目的:构建卷积神经网络来比较样本之间的异同,训练网络有两种方法:

成对相似度

Pairwise Similarity,数据集取两个样本

1.训练数据集

训练集来自很大样本数据集,训练数据分为正样本,同一类抽取两张不同图片,标签为1,两样本相同;负样本,不同类别抽取两张图片,标签为0,两样本不同。

2.孪生网络结构

(1)提取特征的CNN

输入是图片,输出是特征向量,有卷积池化层的卷积神经网络就是 f

(2)整体网络结构

训练集样本(两张图片)输入到CNN,分别提取出特征向量,两个特征向量相减的绝对值为Z,用来比较两个特征区别,再用全连接层处理 Z得到一个值,最后用sigmoid将其转换到[0,1]区间,这就是样本的sim

3.训练网络

(1)前向传播

前向传播就是计算损失,有了样本的sim,结合正负样本标签Target,就可以计算损失。

(2)反向传播

反向传播更新卷积神经网络f和全连接层 Dense Layer的参数

4.直接预测

querysupport set都是训练集中没出现的类别。querysupport set每一张作为样本,输入网络,分别得到sim,最大的为 query的类别。

三重损失

Triplet Loss,数据集取三个样本

1.训练数据集

在大规模数据集中,某一类别取一个样本为 Anchor,同一类别再取一个样本为Positive,不同类别取一个样本为Negative,这样构成了一组数据。

2.孪生网络结构

同样有一个卷积神经网络作为特征提取,Positive和Negative分别与Anchor的特征向量求差的二范数的平方,记作距离d

3.训练网络

(1)前向传播

距离表现在特征空间上,希望同一类离得近,不同类离得远。

所以,引入一个超参数,使得负样本距离远大于正样本距离加一个超参数,这样损失定义为

(2)反向传播

由于并没有加入全连接层,所以在反向传播时只需要更新卷积神经网络f的参数

4.直接预测

querysupport set都是训练集中没出现的类别。querysupport set每一张作为样本,输入网络得到向量特征,计算两样本的距离(差的二范数的平方),距离最小的为 query的类别。

分类器

希望用support set实现一个分类器,来预测query是哪一类别的概率。先看一下基本分类器(直接分类不训练)和使用Fine Tuning的分类器(需要用support set训练)

基本分类器

预训练生成的特征提取网络记为f,提取 support set每个样本特征,如果是few-shot 提取后每类取均值(这是最简单的方法),然后归一化为[0,1]区间。

同理,提取query 的特征,将所有向量映射到特征空间

support set三个特征记做M,构建softmax分类器 p = softmax(W*x + b),赋值W=M, b=0xquery的特征q。这样就可以做预测,显示query属于每一类的概率 p,概率最大为所属的类别。

Fine Tuning

基本分类器中的W,b是固定的,如果使用support set训练W,b进行微调(Fine Tuning),当然也可以训练特征提取的CNN。

前向传播

训练数据是来自support set中的有标签的样本,样本为x,标签为y

计算每一个样本的损失:预测值和和真实标签求交叉熵。累加 support set所有样本的损失

反向传播

反向传播更新softmax分类器中的Wb,也可以更新特征提取网络f

细节

(1)初始化

按照基本分类器赋值W=M, b=0,作为softmax分类器的初始化

(2)正则化

增加正则化可以使训练效果更好,在损失计算后面增加正则化(Regularization)

使用熵正则化

很明显,如果各个类别概率很相近,那么他们的熵会很大,我们希望各个概率差距大,熵小一点。

(3)引入余弦相似度

分类器原先公式为

把内积替换成余弦相似度 :

相关推荐

【程序喵读论文】分类网络进阶版

【程序喵读论文】图像分类网络

【程序喵笔记】Jupyter 实用篇

  扫码关注毛毛喵  

一只写程序的喵

科研&生活

weka分类器怎么设置样本类别_【程序喵笔记】小样本学习1.0相关推荐

  1. weka分类器怎么设置样本类别_自步对比学习: 充分挖掘无监督学习样本

    本文为香港中文大学MMLab实验室博士生葛艺潇投稿. 本文介绍一篇我们发表于NeurIPS-2020的论文<Self-paced Contrastive Learning with Hybrid ...

  2. weka分类器怎么设置样本类别_NeurIPS 2020 | 自步对比学习: 充分挖掘无监督学习样本...

    本文介绍一篇我们发表于NeurIPS-2020的论文<Self-paced Contrastive Learning with Hybrid Memory for Domain Adaptive ...

  3. weka分类器怎么设置样本类别_NeurIPS 2019 少样本学习研究亮点全解析

    少样本学习(Few-Shot Learning)是近两年来非常有研究潜力的一个子方向,由于深度学习在各学科交叉研究与商业场景都有比较普遍的应用,然而训练出高精度模型的情况大部分来源于充足的训练数据,这 ...

  4. weka分类器怎么设置样本类别_NeurIPS 2020 | 港中文MMLab自步对比学习: 充分挖掘无监督学习样本...

    本文介绍一篇港中文MMLab发表于NeurIPS 2020的论文<Self-paced Contrastive Learning with Hybrid Memory for Domain Ad ...

  5. 学了java有必要学c语言吗_程序员有必要学习C语言吗?这几点原因很现实

    原标题:程序员有必要学习C语言吗?这几点原因很现实 C语言是编程语言中的一种,有不少程序员会有这样的疑问?难道做程序员就必须要学习C语言吗?甚至有人觉得,我平时的工作中也用不到C语言我为什么要学习呢? ...

  6. weka分类器怎么设置类别_AI 迁移学习怎么玩?手把手教你实战迁移学习

    本文将说明如何使用迁移学习来解决图像分类问题,相关代码示例将使用 Python + Keras 进行实现. 深度学习在最近几年发展迅速,并且已经在人工只能领域占据了极其重要的一席之地(LeCun,20 ...

  7. el-date-picker设置默认日期_程序员必备:Java 日期处理的十个坑

    前言 整理了Java日期处理的十个坑,希望对大家有帮助. 一.用Calendar设置时间的坑 反例: Calendar c = Calendar.getInstance(); c.set(Calend ...

  8. oracle 会话数上不去_程序员笔记|全面解析Oracle等待事件的分类、发现及优化

    一.等待事件由来 大家可能有些奇怪,为什么说等待事件,先谈到了指标体系.其实,正是因为指标体系的发展,才导致等待事件的引入.总结一下,Oracle的指标体系,大致经历了下面三个阶段: 以命中率为主要参 ...

  9. go设置后端启动_为什么 Rubyists 应该考虑学习 Go

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 如今,越来越少的 Web 开发人员开始专注于 Ruby 之类的单一语言.我们针对不同的工作使用不同的工 ...

最新文章

  1. ASP .NET Core MVC 控制器中获取当前登录用户
  2. 皮一皮:浓浓的父爱...
  3. linux 进程内存解析
  4. 掌握房贷技巧可让你少奋斗十年(收藏)
  5. python按行求和_Python第一篇:对3个Excel文件进行整合
  6. asp.net mvc 使用bootstrap的模态框插件modal
  7. IPv6与IPv4比较
  8. 导航类查询词的收集方法
  9. 数据结构与算法系列——排序(10)_归并排序
  10. ArcGIS Engine开发之地图基本操作(3)
  11. 一些常用的WebServices 天气,IP,邮编,Email,火车时刻表,股票 等等
  12. 星岚技术 Win10 x64 装机版 V2021.5【带驱动包】
  13. ubuntu 22.04 安装网易云音乐
  14. 集成运算放大器及其应用
  15. MySQL 插入时,出现‘“Incorrect string value: ‘\\xF0\\x9F\\x98\\x85...‘ for column ‘commens‘ at row 3‘
  16. yii mysql gii_YII-快速用gii创建一个简单的yii项目!
  17. 【BZOJ】1135: [POI2009]Lyz
  18. 作为一个计算机专业的学生,除了教材,这些书籍你读过多少?
  19. 大数据小结(1-4)
  20. android 自动替换资源文件,简单高效的实现Android App全局字体替换

热门文章

  1. 确定Java等价性的新时代?
  2. Log4j Bug –减慢您的应用程序
  3. 重新开始Java的原始字符串文字讨论
  4. 从Java 10中删除的API
  5. 1.0jpa 2.0_在JPA 2.1中使用@Convert正确完成映射枚举
  6. jdk7默认gc算法_JDK 7的算法和数据结构
  7. 使用Docker堆栈部署的微服务-WildFly,Java EE和Couchbase
  8. idea资源包下创建资源包_资源包技巧和最佳实践
  9. Apache Camel 2.18 –即将推出的功能的亮点
  10. eclipselink_Java EE 7的高峰– EclipseLink的多租户示例