首页 > 其他分享 >对比学习

对比学习

时间:2023-04-04 10:01:41浏览次数:21  
标签:眼底 信息 学习 图像 病灶 对比

我们完全搞懂对比学习了吗?

在实验室做了一年多的眼底图像课题,主要是研究如何无监督的进行疾病分级。无监督的图像分类(分级)其实在自然图像已经研究了很长时间,但是医学图像和自然图像不同,往往尺寸超级大而且大小不一,然后图像的特征都很相似,比如一张疾病的眼底图像和健康的眼底图像,其实结构和大体特征是一样的,病灶区域通常很小。

image-20230403202735936 9272_left

一般来说通常做法是统一大小,然后让分类模型自己学习病灶特征,显然其中有很多问题,这不是今天要讨论的。

今天想总结的是当无监督式对比学习应用到其他领域,诸如眼底图像时,所引起我对对比学习的思考。

首先一个大问题就是:怎样的视角对于对比学习来说是好的视角,或者说如何设计对比学习才是有益的?

​ 好与坏,这是一个定性问题,当我想把这个问题定量化时,出现了很大的问题。对比学习是一种无监督的方法,最终模型获得的是特征representation,本来我打算通过做一个下游任务量化这种特征表达能力。但是上游特征提取的好,下游病灶分级就一定有提升吗?或者说下游病灶分级有提升,就能反过来证明特征表达能力有提高吗?对于自然图像或许是,但是对于眼底,其实并不。

​ 我们可以简单将眼底特征理解为结构特征+域特征+病灶特征。域特征或者叫域差异其实可以不考虑,因为对于同一张眼底来说,用两份数据增强做出两个视角,其实就相当于是人为制造两个差异域了,对比学习不正擅长从这两个差异域中学到核心不变特征吗?

​ 但是结构特征就是一个令人头疼的问题,如何让对比学习少学甚至不学结构特征,更关注于小区域的病灶呢?目前我做的方法是完全打破眼底结构,让对比学习无法轻易学结构信息,大体上就是分patch。那么如何让对比学习学病灶信息呢?就是相近位置的眼底patch,健康和病灶patch对比。这样一来可以学病灶信息,二来不学结构信息,第三还可以免去整张图像输入模型对比学习batchsize小的烦恼。
​ 因此,我们寻求具有足够不变性的表示,以对无关紧要的变化具有鲁棒性,但而不是丢弃下游任务所需的信息。而视角的选择控制了特征表示中包含的信息,在对比学习中,我们通常关注于视角之间的相同信息。视图通常是不同的感觉信号,如照片和声音,或不同的图像通道或时间中的切片,但也可能是相同的数据张量的不同的“增强”版本。如果共享的信息很小,那么学习到的表示可以丢弃更多关于输入的信息,并对有害的变量实现更大程度的不变性。我们如何才能找到正确的观点平衡,只分享我们需要的信息,不多也不少?

​ 一组良好的视图是那些共享在下游任务中执行良好所需的最小信息的视图。这一想法与最小充分统计量和信息瓶颈理论的思想有关,这已经在表示学习文献中阐明。这一原则也补充了已经流行的“InfoMax原则”,该原则指出,表征学习的目标是要尽可能多地获取关于刺激的信息。我们认为,最大化信息只有在信息与任务相关的情况下才有用。除此之外,学习抛出关于讨厌变量信息的表示是更好的,因为它可以提高泛化效果,并降低下游任务的样本复杂性

标签:眼底,信息,学习,图像,病灶,对比
From: https://www.cnblogs.com/cs-markdown10086/p/17284425.html

相关文章

  • React Native学习笔记(三)—— 组件
    一、ReactNative项目1.1、创建ReactNative项目ReactNative有一个内置的命令行界面,你可以用它来生成一个新项目。您可以使用Node.js附带的访问它,而无需全局安装任何内容。让我们创建一个名为“AwesomeProject”的新ReactNative项目:npxnpxreact-native@latestinitAw......
  • 学习C语言第五天
    一.指针1.1认识它1.2指针==地址inta=10; 变量名能访问,通过地址也能访问&取地址运算符*将地址内的值读出运算符1.3指针变量==存放地址的变量*的标识作用只产生在指针变量定义或声明的时候*的运算作用变量访问的两种方式直接访......
  • android下拉菜单 spinner 学习
    首先看一下继承关系:publicclassSpinnerextendsAbsSpinnerimplementsDialogInterface.OnClickListenerClassOverview视图在同一时间只能显示一个子项,用户通过下拉的方式可以选择其中的一种项。该子项在Spinner来自来Adpater视图适配器。首先看一下效果图:Spinner控件的使......
  • Flask学习笔记(2)--最简单的小应用
    Flask学习笔记(2)--最简单的小应用 新建一个flask项目,第一个小程序,我们来看一下fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'HelloWorld!'if__name__=='__main__':app.run() 1、引入flask类2、将Flask对象......
  • Flask 学习笔记(1)--环境安装
    Flask学习笔记(1)--环境安装Flask官网:http://flask.pocoo.org/Flask文档:http://docs.jinkan.org/docs/flask/0x01安装方式A、第一种安装步骤很简单,就是这个样子安装python安装flaskpipinstallflaskB、第二种:虚拟环境D:\test>pipinstallvirtualenv#安装vir......
  • Webgoat学习笔记
    Webgoat学习笔记Webgoat分为简单版和开发版,具体版本及安装方法详见:https://github.com/WebGoat/WebGoat本机环境为:Windows+Tomcat,故下载war包,自动解压缩进行部署。war下载地址:https://github.com/WebGoat/WebGoat/releases/    参考链接:Webgoat学习笔记:http://www.tui......
  • java学习日记20230404-String类
    String类String对象用于保存字符串,也就是一组字符序列;字符串常量对象使用双引号包括起来的字符序列字符串的字符使用unicode字符编码,一个字符(不区分字母还是汉字)占用两个字节String常用的构造器:newString();newString(Stringoriginal);newString(char[]a);newString(char[]......
  • python+playwright 学习-45 drag_to 拖拽操作
    前言按住元素从页面的一个位置拖动到另外一个位置,可以用drag_to()方法实现拖拽操作场景目标元素拖动到指定位置drag_to拖拽操作您可以使用locator.drag_to()执行拖放操作。此方法将:将鼠标悬停在要拖动的元素上。按鼠标左键。将鼠标移动到将接收放置的元素。松开鼠......
  • 学习python第二天
    流程控制一.顺序流程自上而下的顺序一条一条的执行代码。二.选择流程/分支流程1.1单分支ifif表达式:要执行的操作2.2双分支ifelseif表达式:要执行的操作else:否则要执行的操作2.3多分支ifelifelifelse条件表达式:三:循环流程while条件表达式: lie=9whileli......
  • C语言再学习 -- 详解C++/C 面试题 2
    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题。参看:嵌入式程序员面试问题集锦1、用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #defineSENCONDS_PER_YEAR(60*60*24*365)UL解答:#define声明一个常量,使用计算常量表达式的值来表明一年中有多少......