论文解读之Attention-based Deep Multiple Instance Learning

前言

多实例学习是由监督学习演变而来的,我们都知道,监督学习在训练的时候是一个实例(或者说一个样本、一条训练数据)对应一个确定的标签。而多实例的特点就是,我们在训练的时候的输入是多个实例对应一个确定的标签,我们把这多个实例看做一个包,每个包有一个确定的标签,包是有标签的而包里面的实例是没有标签的,多实例的目的就是希望从这种粗粒度的带有标签的包中学习到细粒度的表示,进而进行一系列的任务,比如说分类等。

多个实例只对应一个标签的这种情况,我们也称为弱标签情况,弱标签的问题在医学成像中尤其明显(例如,计算病理学、乳房x光检查或CT肺筛查),其中图像通常由单一标签(良性/恶性)或感兴趣区域(ROI)大致给出。
举个栗子:

  • 把一张X检查图像分成多个部分,从这多个部分中我们判断是否包含病灶(往往只有一小部分包含病灶),进一步判断患者是否患病,这也可以看做一个多实例,每个部分是一个实例,整张图片包含多个实例可以看做一个包
  • CT序列很明显是弱标签的,每个患者有一系列CT切片,从这些切片中判断患者是否患病,那这一套CT序列就是一个包,每张CT切片就是一个实例

所以,多实例的一个挑战是发现关键实例,即触发包标签的实例。

Attention-based Deep Multiple Instance Learning

要解决的问题

在这篇文章里作者主要以图片的二分类为例,每个包对应一个标签label y={0,1},包里包含多个多个实例(即有多张图片),并且实例的数量是可变的(每个包里面的实例数是不一样的),实例与实例之间具有排列不变性,即没有顺序也没有依赖性。

eg:下述是论文所有数据集中一个包的里面的图片实例,这个包的标签是9,我们通过注意力进行可视化之后,发现数字为9的图片占比更大
在这里插入图片描述

之前的方法:
(1)实例级别的方法:通过实例级别的分类器,返回每个实例的分数,然后通过MIL pooling来聚合单个分数得到最好的那个实例结果
缺点:由于单个标签是未知的,因此实例级分类器可能被训练不足,这可能会给最终的预测带来额外的错误
优点:实例级方法提供了一个分数,可用于查找关键实例,即触发包标签的实例,可解释性较好
在这里插入图片描述

(2)嵌入级别的方法:将实例映射到一个低维的嵌入,再通过MIL池获得与包中的实例数无关的包表示。最后把这个包表示放到分类器中得到进一步结果
缺点:可解释性不太好
优点:嵌入级方法确定了袋子的联合表示,因此它不会给袋级分类器引入额外的偏差。
在这里插入图片描述

论文方法

①一个由神经网络参数化的MIL模型来获取输入实例的低维嵌入
②通过注意力机制来对实例进行加权平均,代替之前的平均实例池化和最大实例池化。作者认为,基于注意力的MIL pooling是一个灵活和自适应的MIL池,可以通过适应任务和数据来获得更好的结果。理想情况下,这种MIL池也应该是可解释的。
在这里插入图片描述

源码解析

class Attention(nn.Module):def __init__(self):super(Attention, self).__init__()self.M = 500self.L = 128self.ATTENTION_BRANCHES = 1# 二维特征提取self.feature_extractor_part1 = nn.Sequential(nn.Conv2d(1, 20, kernel_size=5),nn.ReLU(),nn.MaxPool2d(2, stride=2),nn.Conv2d(20, 50, kernel_size=5),nn.ReLU(),nn.MaxPool2d(2, stride=2))# 对之前提取的特征进行降维和非线性变换self.feature_extractor_part2 = nn.Sequential(nn.Linear(50 * 4 * 4, self.M),nn.ReLU(),)# 通过注意力机制来计算每个实例的得分self.attention = nn.Sequential(nn.Linear(self.M, self.L), # matrix Vnn.Tanh(),nn.Linear(self.L, self.ATTENTION_BRANCHES) # matrix w (or vector w if self.ATTENTION_BRANCHES==1))# 分类器进行分类self.classifier = nn.Sequential(nn.Linear(self.M*self.ATTENTION_BRANCHES, 1),nn.Sigmoid())def forward(self, x):"""x:输入的包,维度为[batch, MLI_nums, channel, height, width],第一个是batch,第二个是包里的实例数,这里是变化的,第三个是图片通道数,最后两个维度是高和宽"""x = x.squeeze(0) # 第一个维度压缩,[MLI_nums, channel, height, width]H = self.feature_extractor_part1(x) # 提取特征之后的维度为[MLI_nums, 50, 4, 4]H = H.view(-1, 50 * 4 * 4) # 改变形状[MLI_nums,800],适应下一次输入H = self.feature_extractor_part2(H)  # 这里对特征进行了降维[MLI_nums,500]# 使用注意力机制自适应的计算每个实例的分数A = self.attention(H)  # [MLI_nums,1]A = torch.transpose(A, 1, 0)  # 转换维度,[1,,MLI_nums]A = F.softmax(A, dim=1)  # 对实例分数进行归一化Z = torch.mm(A, H)  # 将归一化后的实例分数与提取的实例特征进行矩阵乘法运算,最后得到一个最终的包表示[1,500]Y_prob = self.classifier(Z)  # 分类器进行分类Y_hat = torch.ge(Y_prob, 0.5).float()return Y_prob, Y_hat, A

论文源码:https://github.com/AMLab-Amsterdam/AttentionDeepMIL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/277776.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国外visa卡怎么办理,可充ChatGPTPLUS、Claude、Midjourney

很多小伙都在使用ChatGPT,但是想充值ChatGPTPLUS缺需要国外的visa卡,拿自己的银联卡,尝试了好多次还是不行,其实用一张国外的visa卡几分钟就可以升级好 办理国外visa卡,点击获取 国外的visa卡,具体要看你…

HarmonyOS-鸿蒙系统概述

你了解鸿蒙系统吗? 你看好鸿蒙系统吗? 今年秋季即将推出的HarmonyOS Next 星河版热度空前,一起来了解一下吧。本文将从HarmonyOS 的应用场景、发展历程、架构、开发语言、开发工具、生态建设六个角度聊一聊个人的理解。 1、应用场景 鸿蒙…

Go——运算符,变量和常量,基本类型

一.运算符 Go语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 1.1 算术运算符 注意:(自增)和--(自减)在go语言中是单独的语句,并不是运算符。 1.2 关系运算符 1.3 逻辑运算符 1.4 位运算符 位运算符对整数在内存…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

TCP/UDP协议

TCP/UDP协议都工作在传输层 这两个协议的目标都是在程序之间传输数据&#xff08;可以是文本文件、图片、视频&#xff09;&#xff0c;对于TCP协议和UDP协议来说&#xff0c;都是一堆二进制数。 把人与人之间的通信看成是进程间通信&#xff0c;“写信”是基于非连接的UDP&a…

Leetcode刷题笔记——动态规划(背包问题)篇

Leetcode刷题笔记——动态规划&#xff08;背包问题&#xff09;篇 一、0-1 背包问题 0-1背包问题简介 有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包…

Unload-labs

function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext ".jpg|.png|.gif";//提取上传文件的类…

代码算法训练营day9 | 28. 实现 strStr() 、459.重复的子字符串

day9&#xff1a; 28. 实现 strStr()KMP的主要应用&#xff1a;什么是前缀表&#xff1a;前缀表是如何记录的&#xff1a; 如何计算前缀表&#xff1a;构造next数组&#xff1a;1、初始化2、处理前后缀不相同的情况3、处理前后缀相同的情况 代码&#xff1a; 459.重复的子字符串…

Mysql 索引、锁与MVCC等相关知识点

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 索引类型存储方式区分逻辑区分实际使用区分索引失效情况 索引建立规范SQL编写规范exlpain字段解析ACID的原理日志引擎慢SQL整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a…

德人合科技 | 公司办公终端、电脑文件资料 \ 数据透明加密防泄密管理软件系统

天锐绿盾是一款全面的企业级数据安全解决方案&#xff0c;它专注于为企业办公终端、电脑文件资料提供数据透明加密防泄密管理。 首页 德人合科技——www.drhchina.com 这款软件系统的主要功能特点包括&#xff1a; 1. **透明加密技术**&#xff1a; 天锐绿盾采用了透明加密技…

HarmonyOS NEXT应用开发—Grid和List内拖拽交换子组件位置

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊&#xff0c;不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…

HarmonyOS鸿蒙开发常用4种布局详细说明

介绍一下鸿蒙开发常用4种布局 1、线性布局 2、层叠布局 3、网格布局 4、列表布局 ​1. 线性布局&#xff08;Column/Row&#xff09; 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0c;通过线性容器Row&#xff08;行&#xff09;和Column&…

SpringSecurity(SpringBoot2.X版本实现)

资料来源于 SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权 侵权删 目录 介绍 快速开始 认证 认证流程 登录校验流程 SpringSecurity完整流程 认证流程详解 代码实现 准备工作 mysql mybatis-plus redis 统一返回类 核心代码 密码加密存…

神策分析 Copilot 成功通过网信办算法备案,数据分析 AI 化全面落地

近日&#xff0c;神策数据严格遵循《互联网信息服务深度合成管理规定》&#xff0c;已完成智能数据问答算法备案。该算法基于大模型技术&#xff0c;专注于为客户提供数据指标查询和数据洞察方面的专业回答。 神策分析 Copilot 运用神策数据智能数据问答算法&#xff0c;聚焦分…

Vue-router3.0版本跳转报错

1.路由创建之后发现控制台push路由跳转报错了 2.解决方法&#xff1a; //在router文件中添加 const originalPush VueRouter.prototype.push VueRouter.prototype.push function push(location) {return originalPush.call(this, location).catch(err > err) }3.解决了

【深度学习模型移植】用torch普通算子组合替代torch.einsum方法

首先不得不佩服大模型的强大之处&#xff0c;在算法移植过程中遇到einsum算子在ONNX中不支持&#xff0c;因此需要使用普通算子替代。参考TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法。可以写出简单的替换方法&#xff0c;但是该方法会…

有上百个文件夹需要按顺序编码重命名怎么办?这个方法值得你收藏

在日常生活和工作中&#xff0c;我们经常需要管理大量的文件夹&#xff0c;以便更好地组织和存储文件。为了更方便地查找和识别文件夹&#xff0c;给文件夹按号码命名是一种非常实用的方法。下面&#xff0c;我将详细介绍如何给文件夹按号码命名&#xff0c;并提供一些实用的建…

[Python初阶]2255.统计是给定字符串前缀的字符串数目

目录 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 ③.startswith()方法理解 与 说明 Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决 ⑤总结 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 需求:统计列表words中,是字符串s的前缀的字符串的数目. 解…

【pynput】监控是否打开百度贴吧网页

文章目录 简介Demo 简介 有网友提过一个要求&#xff0c;用 Python 实现一个 电脑打开某网站就自动关机的功能。 想到的思路有两个&#xff1a; 【windows 平台】, 获取活动的窗口标题&#xff0c;如果标题里包含了某些网站名称, 那就使用关机命令 可以定时拉取标题, 也可以使…