[计算机毕业设计]元学习方法的小样本图像分类算法_为什么小样本图像分类使用余弦相似度-程序员宅基地

技术标签: 卷积神经网络  深度学习  人工智能  神经网络  

前言

    大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

对毕设有任何疑问都可以问学长哦!

本次分享的课题是

元学习方法的小样本图像分类算法

课题背景与意义

1980年,Kunihiko Fukushima提出了第一个卷积神经网络。从那时起,随着计算能力的增强和机器学习圈的持续探索,深度学习算法在计算机视觉任务上不断显示出其强大性能。

2015年,在微软的何恺明及其团队宣布,在ImageNet的图像分类任务上,他们的模型甚至超越了人的表现!在当时,有人可能会说,这有啥了不起的,计算机只是在学习了针对特定任务的数十亿张图像后,才在该任务下表现得比我们更好

但是,除了像Google、Facebook这样的大公司,大部分人无法建立如此庞大的数据集。很多时候,当你从事计算机视觉的分类任务时,可能每个分类标签仅包含一个或两个示例。如果仅用这些少量数据训练Resnet50,结果将会很糟糕。像这样仅从几个样本中进行学习的问题被称为小样本学习(Few-shot Learning)。

几年来,小样本学习问题引起了研究圈越来越广泛的关注,并且已经提出了一些不错的解决方法。目前最流行的方法是使用元学习。

课题实现技术思路

小样本图像分类任务

首先,我们对问题进行定义:

  • 支持集(Support Set):类似训练集,包含N个分类标签,每个标签有K张图片

  • 查询集(Query Set):类似测试集,包含Q张未分类图片

我们的任务是在已有支持集的基础上,如何对查询集中的图像进行准确分类。

我们将上述任务称为N-way K-shot图像分类任务

当K值很小时(一般K<10),该任务就是小样本图像分类任务了。当K=1时,该任务即为单样本图像分类任务。

图 1 小样本图像分类任务示例

如上图所示,给定支持集中N = 3,K = 2,我们希望将查询集中的Q = 4条狗依次标记为圣伯纳德犬、拉布拉多、哈巴狗、哈巴狗。即使你从未见过任何哈巴狗,圣伯纳德犬或是拉布拉多,这项任务对你来说也不难。但是要令AI解决此问题,就需要使用元学习。

   什么是元学习?

1998年,Thrun和Pratt指出,给定一个待解决的任务,若算法“在该任务上的性能随着经验的增加得到提高”,我们认为它在学习;而当给定一系列待解决的任务,我们则认为当一个算法“在每个任务上的性能随着经验的增加和任务数量的增加而提高”时,它能够学会如何学习(Learning to learn),我们将这样的算法称为元学习算法。

元学习并不是学着如何去解决一个特定的任务,而是通过先后学习多个任务逐步提高性能。每次学习新任务时,它就越有能力解决新任务:它在学会如何学习。

一般来说,如果我们要用元学习算法解决任务 ,那么我们将需要在一系列任务 {Tᵢ} 上进行训练。元学习算法在尝试解决这些任务的过程中获得经验,从而最终解决任务 

我们拿图1中的分类任务来举例,它通过 3 x 2 = 6 张标记图像中的信息来将图片分类为圣伯纳德犬、拉布拉多和哈巴狗。一个训练任务 Tᵢ 可以使用 3 x 2 = 6 张标记图像进行拳狮犬,拉拉布拉多贵宾犬和罗特威尔犬的分类。元训练过程是依次学习任务 Tᵢ 的过程,每次都会有不同品种的狗。我们希望“随着经验和任务数量的增加”,元学习模型将变得更好。最后,我们在任务 T 上评估模型性能。

图 2 元学习举例

如图2所示,我们仅在圣伯纳德犬、拉布拉多和哈巴狗分类任务上评估了元学习模型,但我们在其他所有品种上进行了训练。

那么我们该怎么做呢?

如果我们要解决任务 T(拉布拉多,圣贝纳德和哈巴狗的分类任务),我们需要一个包含不同品种狗的图片的元训练数据集。例如,我们可以使用斯坦福Dogs Dataset,其中包含了从ImageNet提取的2万多张狗的图片。我们将这个数据集称为 。请注意,中不需要包含任何拉布拉多,圣伯纳德犬或哈巴狗的图片。

我们从 中采样,组成一系列episodes。一个episode就是一次选择support set和query set的过程,即选择某几个类别的数据训练一次模型,下一个episode,再选择其他几个类训练模型。一个epoch中存在多个episode。每个episode对应着一个N-way K-shot图像分类任务分类任务 Tᵢ  Tᵢ 通常与任务 有相同的 和 。模型每完成一个episode,模型参数就会更新一次。一般通过反向传播来完成参数更新。

通过这种方式,模型可以从各任务中学习经验,以解决新的小样本分类任务。在传统的分类任务中,模型将学习“图像→标签”的映射关系,而元学习算法通常学习“ 支持集 → c(.) ”的映射,其中 c(.) 是“ 查询集 → 标签 ”的映射。

   元学习算法

现在呢,我们已经知道了什么是元学习,但是还有一个问题:元学习模型如何解决小样本分类任务呢?当然了,解决方法有很多种,我们在这里介绍几种最常用的。

度量学习(Metric Learning)

度量学习的基本思想是学习单个数据(如图像)之间的距离函数。它已被证明对于解决小样本分类任务非常有效:度量学习算法通过将查询集图像与已标记的支持集图像进行比较来进行分类。

图 3 右侧图片来自查询集,将它与支持集的每个图像进行比较,查询集图片的类别标签将取决于支持集中哪个图像与其最接近。

当然了,我们不能对图像进行逐像素的比较,因此我们通过特征来比较图片。为了让大家更好地理解,下面我们来看看如何通过度量学习来解决小样本分类任务:

1. 我们从支持集和查询集的所有图像中提取embeddings(通常使用卷积神经网络)。从而,数据集中的每张图像都转变成了对应的一维向量。

2. 查询集中的每张图像都根据它与支持集图像的距离来进行分类。有多种距离函数和分类方法可以选择,比如欧几里德距离和KNN算法。

3. 在元训练过程中,在每个episode结束后,CNN的参数通过损失函数(通常是交叉熵损失)的反向传播进行更新。

注:正如我们之前定义的那样,分类任务包含一个支持集和一个查询集,支持集由已标记图片组成,查询集由待分类图片组成。

在实践中,针对小样本分类任务,度量学习算法可以达到非常好的效果。通过改进特征提取算法和匹配算法,每年都会产生许多新的度量学习方法。

图 4 一种匹配网络。对于支持集图像(左侧)和查询集图像(底部),网络采取了不同的特征提取算法,使用余弦相似度来比较相似性,最后用softmax进行分类

上图所示的匹配网络是由Oriol Vinyals等人提出的第一个使用元学习的度量学习模型[1]。在这种算法中,对于支持集图像和查询集图像,我们采取不同的特征提取算法。Oriol Vinyals团队来自Google DeepMind,他们使用LSTM提取图像特征,将各个类别的样本作为序列输入到LSTM中,从而令模型纵观所有的样本去自动选择合适的特征去度量,他们将其称为全上下文嵌入(Full Context Embedding)。这使得该模型比令所有图像都通过一个简单的CNN时表现得更好,但它对训练时间和GPU资源的需求也更大。

而现在,我们不会将查询集图像与支持集中的每个图像进行比较。多伦多大学的研究人员提出了原型网络(Prototypical Networks)。它从图像中提取特征后,为每个类别计算一个原型。为此,他们分别对每个类计算图像嵌入的平均值。得到原型后,仅需通过计算图像嵌入到原型的欧式距离即可进行分类(如下图所示)。

图 5 在原型网络中,我们将查询集图像X标记为距离最近的原型的标签。

尽管很简单,原型网络仍然能产生SOTA结果(state-of-the-art )。此后,研究人员提出了许多更复杂的度量学习网络,比如表示距离函数(而不是欧式距离)的神经网络,准确率得到了少许提升。但我相信,到目前为止,原型这一想法是在度量学习领域中对小样本图像分类任务最有价值的想法(如果你不赞同,可以在评论中赐教)。

与模型无关的元学习(MAML)

最后,我们来聊一聊与模型无关的元学习(Model-Agnostic Meta-Learning , MAML)模型[2]。MAML是目前最elegant 和最有研究前景的元学习算法之一。它采取了最纯粹的元学习形式,并通过神经网络进行两级反向传播。

MAML的核心思想是训练一个神经网络,使其在少量训练样本的情况下,能够快速地适应一个新的分类任务。接下来我们来看看,MAML是如何在元训练的一个episode中运作的:

假设你有一个神经网络M,其参数为Θ,训练过程如下图所示,

图 6  MAML在元学习中的训练过程

分为4步:

1. 创建 的副本(此处命名为 )并用 Θ 初始化(图中Θ0)。

2. 在支持集上快速fine-tune网络 f(仅需几次梯度下降)。

3. 在查询集上应用经过fine-tune网络 f

4. 通过损失函数对网络 进行反向传播,并更新参数 Θ 

然后,在下一个episode中,我们创建一个更新后的模型 的副本,在一个新的小样本分类任务上重复上述训练过程。

在元训练过程中,MAML的初始化参数使模型能够快速有效地适应新的小样本分类任务。

说实话,在主流小样本图像分类的评价标准上,MAML目前性能不如度量学习。由于它的两级训练过程,在实践中训练难度很大,因此超参搜索要比普通模型复杂得多。另外,元反向传播需要计算梯度的梯度,所以目前只能通过计算其近似值才能在标准GPU上进行训练。出于这些原因,大家在实际应用中可能更愿意使用度量学习算法。

但之所以MAML模型受到那么多关注,是因为它是模型不可知的。这意味着它实际上可以应用于任何神经网络,任何任务。掌握MAML意味着能够训练任何一个神经网络,使其快速适应新的任务,而且只需要很少的训练样本。MAML的作者Chelsea Finn和Sergey Levine,将其应用于有监督的小样本分类、有监督的回归和强化学习。但只要多努努力,你就可以用它把任何一个神经网络转换成一些高效的神经网络!

海浪学长的作品示例:

大数据算法项目

机器视觉算法项目

 

微信小程序项目

Unity3D游戏项目

最后

为帮助大家节省时间,如果对开题选题,或者相关的技术有不理解,不知道毕设如何下手,都可以随时来问学长,我将根据你的具体情况,提供帮助。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37340229/article/details/127922449

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签