图解SimCLR框架,用对比学习得到一个好的视觉预训练模型

2023-10-27

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:amitness

编译:ronghuaiyang

正文共: 3027 字 33 图

预计阅读时间: 9 分钟

导读

有点像词向量预训练模型,这个框架可以作为很多视觉相关的任务的预训练模型,可以在少量标注样本的情况下,拿到比较好的结果。

The Illustrated SimCLR Framework

Published March 04, 2020 in illustration

https://amitness.com/2020/03/illustrated-simclr/

近年来,众多的自我监督学习方法被提出用于学习图像表示,每一种方法都比前一种更好。但是,他们的表现仍然低于有监督的方法。当Chen等人在他们的研究论文“SimCLR:A Simple Framework for Contrastive Learning of Visual Representations”中提出一个新的框架时,这种情况改变了。SimCLR论文不仅改进了现有的自监督学习方法,而且在ImageNet分类上也超越了监督学习方法。在这篇文章中,我将用图解的方式来解释研究论文中提出的框架的关键思想。

来自儿时的直觉

当我还是个孩子的时候,我记得我们需要在课本上解决这些难题。

孩子们解决这个问题的方法是通过看左边动物的图片,知道它是一只猫,然后寻找右边的猫。

“这样的练习是为了让孩子能够识别一个物体,并将其与其他物体进行对比。我们能用类似的方式教机器吗?”

事实证明,我们可以通过一种叫做对比学习的方法来学习。它试图教会机器区分相似和不同的东西。

对机器进行问题公式化

要为机器而不是孩子来对上述练习进行建模,我们需要做三件事:

1、相似和不同图像的样本

我们需要相似和不同的图像样本对来训练模型。

监督学习的思想学派需要人类手工创造这样的配对。为了实现自动化,我们可以利用自监督学习。但是我们如何表示它呢?

2、了解图像所表示的内容的能力

我们需要某种机制来得到能让机器理解图像的表示。

3、量化两个图像是否相似的能力

我们需要一些机制来计算两个图像的相似性。

SimCLR框架的方法

本文提出了一个框架“SimCLR”来对上述问题进行自监督建模。它将“对比学习”的概念与一些新颖的想法混合在一起,在没有人类监督的情况下学习视觉的表示。

SimCLR框架

SimCLR框架,正如全文所示,非常简单。取一幅图像,对其进行随机变换,得到一对增广图像x_i和x_j。该对中的每个图像都通过编码器以获得图像的表示。然后用一个非线性全连通层来获得图像表示z,其任务是最大化相同图像的z_i和z_j两种表征之间的相似性。

手把手的例子

让我们通过一个示例来研究SimCLR框架的各个组件。假设我们有一个包含数百万未标记图像的训练库。

  1. 自监督的公式 [数据增强]

    首先,我们从原始图像生成批大小为N的batch。为了简单起见,我们取一批大小为N = 2的数据。在论文中,他们使用了8192的大batch。

论文中定义了一个随机变换函数T,该函数取一幅图像并应用 random (crop + flip + color jitter + grayscale).

对于这个batch中的每一幅图像,使用随机变换函数得到一对图像。因此,对于batch大小为2的情况,我们得到2N = 4张总图像。

2、得到图像的表示 [基础编码器]

每一对中的增强过的图像都通过一个编码器来获得图像表示。所使用的编码器是通用的,可与其他架构替换。下面显示的两个编码器有共享的权值,我们得到向量h_i和h_j。

在本文中,作者使用ResNet-50架构作为ConvNet编码器。输出是一个2048维的向量h。

3、投影头

两个增强过的图像的h_i和h_j表示经过一系列非线性Dense -> Relu -> Dense层应用非线性变换,并将其投影到z_i和z_j中。本文用g(.)表示,称为投影头。

4. 模型调优: [把相似图像的拉的更近一些]

因此,对于batch中的每个增强过的图像,我们得到其嵌入向量z。

从这些嵌入,我们计算损失的步骤如下:

a. 计算余弦相似性

现在,用余弦相似度计算图像的两个增强的图像之间的相似度。对于两个增强的图像x_i和x_j,在其投影表示z_i和z_j上计算余弦相似度。

其中

  • τ是可调参数。它可以缩放输入,并扩大余弦相似度的范围[- 1,1]。

  • ||z_i||是该矢量的模

使用上述公式计算batch中每个增强图像之间的两两余弦相似度。如图所示,在理想情况下,增强后的猫的图像之间的相似度会很高,而猫和大象图像之间的相似度会较低。

b. 损失的计算

SimCLR使用了一种对比损失,称为“NT-Xent损失”(归一化温度-尺度交叉熵损失)。让我们直观地看看它是如何工作的。

首先,将batch的增强对逐个取出。

接下来,我们使用softmax函数来得到这两个图像相似的概率。

这个softmax计算等价于第二个增强的猫图像与图像对中的第一个猫图像最相似的概率。这里,batch中所有剩余的图像都被采样为不相似的图像(负样本对)。

然后,通过取上述计算的对数的负数来计算这一对图像的损失。这个公式就是噪声对比估计(NCE)损失:

在图像位置互换的情况下,我们再次计算同一对图像的损失。

最后,我们计算Batch size N=2的所有配对的损失并取平均值。

基于这种损失,编码器和投影头表示法会随着时间的推移而改进,所获得的表示法会将相似的图像放在空间中更相近的位置。

下游任务

一旦SimCLR模型被训练在对比学习任务上,它就可以用于迁移学习。为此,使用来自编码器的表示,而不是从投影头获得的表示。这些表示可以用于像ImageNet分类这样的下游任务。

目标结果

SimCLR比以前ImageNet上的自监督方法更好。下图显示了在ImageNet上使用不同自监督方法学习表示的训练线性分类器的top-1精度。灰色的十字架是有监督的ResNet50,SimCLR以粗体显示。

  • 在ImageNet ilsvvc -2012上,实现了76.5%的top-1准确率,比之前的SOTA自监督方法[Contrastive Predictive Coding](https://arxiv.org/abs/1905.09272)提高了7%,与有监督的ResNet50持平。

  • 当训练1%的标签时,它达到85.8%的top-5精度,超过了AlexNet,但使用带标签的数据少了100倍。

SimCLR的代码

本文作者在Tensorflow中对SimCLR的正式实现可以在GitHub上找到:https://github.com/googl-research/simclr。他们还为使用Tensorflow Hub的ResNet50架构的1倍、2倍和3倍变体提供了预训练模型:https://github.com/googresearch/simclr#。

有各种非官方的SimCLR PyTorch实现,它们已经在小型数据集上测试过,比如CIFAR-10:https://github.com/leftthomas/SimCLR和STL-10:https://github.com/Spijkervet/SimCLR。

总结

因此,SimCLR为这一方向的进一步研究和改善计算机视觉的自监督学习状态提供了一个强有力的框架。

—END—

英文原文:https://amitness.com/2020/03/illustrated-simclr/

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧

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

图解SimCLR框架,用对比学习得到一个好的视觉预训练模型 的相关文章

  • 判断点是否在对角线两点构成的矩形中

    已知一个矩形的对角线的两个点坐标分别为 A 0 123456789 0 523456789 B 0 423456789 0 323456789 判断C 0 223456789 0 423456789 点是否在A和B构成的矩形中 一 Java
  • 可编程渲染管线与着色器语言

    可编程渲染管线与着色器语言 Programming pipeline shading language Sampler Direct3D 9 asm ps A sampler is a input pseudo register for a
  • JavaWeb基础1——MySQL

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 一 概念 二 下载安装配置卸载 三 关系型数据库
  • php svg写入文字转png,php如何实现svg转化png

    php实现svg转化png的方法 首先通过 drawInlineSVG 方法将svg转为canvas 然后使用 base64 image content 方法将canvas转为png即可 推荐 PHP视频教程 svg转png实现 1 php
  • 2021年3月最新的山东大学网络认证的网址

    http 202 194 15 87 srun portal pc ac id 9 srun wait 1 theme basic
  • 共创开发闭环,轻流CEO薄智元:让无代码回归本质

    以无代码的开发形式为基础 以业务人员为用户定位 奔向 无代码 的路径为企业提供个性化解决方案和产品 使开展业务各个环节的负责人深入地参与到系统开发中去 形成圆桌闭环 这是轻流的答案 作者 斗斗 出品 产业家 数字化需求迫切 人员成本高 研发
  • Faster Rcnn 代码解读之 blob.py

    Fast R CNN Copyright c 2015 Microsoft Licensed under The MIT License see LICENSE for details Written by Ross Girshick Bl
  • Java Comparator的使用-构建自己的Comparator(Lambda)

    引文 在开发的过程中 通常会对一些List进行排序 如果仅仅对某一个数字型的字段进行排序 排序的种类有很多 无论是使用Java 8 新特性的Stream排序 或者是使用Array sort方法都可以 但有时候我们需要对字符串类型 并且可能会
  • 深度学习训练模型的硬件条件(点评)

    比较系统性的文章 包括本地硬件搭建 云端训练环境介绍 原文地址 https blog csdn net u010327061 article details 80775135 之前热衷于学习理论知识 目前想跑代码了发现不知道从何下手 自己电
  • node网页爬虫

    前言 以前听后端的同事说 用网页爬虫可以抓取到许多电影下载资源 当时就跃跃欲试 想学习一下 无奈当时太懒 也经受不住生活中各种能获得即时快乐感事情的诱惑 时间都没有用到正经事情上 把这件事情耽搁了好几年 前段时间在掘金看到一篇有关爬虫的文章
  • 【pip command】之 pip install

    目录 前言 1 用法 2 安装位置 3 安装步骤 4 参数处理顺序 5 运行时依赖项的安装顺序 5 1 示例记录 安装 pywifi 后提示 No module named comtypes 6 Requirements File Form
  • 网站和API支持HTTPS,最好在Nginx上配置

    随着我们网站用户的增多 我们会逐渐意识到HTTPS加密的重要性 在不修改现有代码的情况下 要从HTTP升级到HTTPS 让Nginx支持HTTPS是个很好的选择 今天我们来讲下如何从Nginx入手 从HTTP升级到HTTPS 同时支持静态网
  • SRGAN——使用与超分辨率重建的GAN

    SRGAN数据GAN理论在超分辨率重建 SR 方面的应用 一 超分辨率技术 1 SR技术介绍 SR技术 是指从观测到的低分辨率图像重建出相对应的高分辨率图像 在监控设备 卫星图像和医学影像等领域都有重要的应用价值 也可以应用于马赛克图片的恢
  • vmware一打开虚拟机就蓝屏

    win10的更新又和Vmware起了冲突 更新系统后再用Vmware打开虚拟机会立马蓝屏并重新启动 此时最简单的解决方法就是升级Vmware到16版本就可以解决
  • Git 修改已提交 commit 的信息

    背景 由于 Github 和公司 Git 使用账号不一样 偶尔没注意 提交出错后就需要修改 commit 信息 修改最后一次提交 commit 的信息 修改最近提交的 commit 信息 git commit amend message m
  • gbdt matlab,python数据分析学习笔记(三):文件读取&绘图&机器学习调包

    pandas read csv函数 http pandas pydata org pandas docs stable generated pandas read excel html matplotlib inline的作用 matplo
  • Radius认证协议(一)

    简介 为大量用户管理分散的串行线和调制解调器池需要重要的管理支持 由于调制解调器池定义为与外部世界的链接 因此需要特别关注其安全 授权和计费 这可以通过管理单个的用户数据库来实现 该数据库可以进行认证 验证用户名和密码 以及向用户提供的服务
  • Serverless架构模式简介

    Serverless架构模式简介 一 简介 Serverless是一种无服务的架构 类似aws lambda Serverless与跟传统架构不同 由开发者实现的服务端逻辑运行在无状态的计算容器中 它是由事件触发 短暂的 可能只存在于一次请
  • OpenWRT 恢复出厂设置

    输入 firstboot 输入 y 输入 重启 reboot
  • 安装虚拟机提示“无法安装服务VMAuthdService”,请确保您有足够的权限安装系统服务

    以下内容仅供参考 我的情况是 1 Win7 安装过VM12 2 无法安装服务VMAuthdService 3 服务 中 VMAuthdService这项没有消失 不排除仅 以管理员 尝试 net stop VMAuthdService ta

随机推荐

  • cas-overlay-template-5.3 集成Oauth2.0

    第一步 在pom xml 文件添加oauth2 0协议支持
  • 创建第一款iPhone应用程序

    现在让我们来创建一个在iOS模拟器上运行的简单视图应用 空白的应用程序 操作步骤如下 1 打开Xcode并选择创建一个新的Xcode项目 2 然后选择单一视图应用程序 3 接下来输入产品名称即应用程序名称 组织名称和公司标识符 4 确定已经
  • reid数据集

    https blog csdn net qiuchangyong article details 82219775 最近一段时间在做行人重识别方向的研究 行人重识别 Person Re Identification 作为图像识别领域的一个分
  • python中super()出现的TypeError: must be type, not classobj

    python中super 只能应用于新式类 而不能应用于经典类 否则会出现报错 TypeError must be type not classobj Python 2 x中默认都是经典类 只有显式继承了object才是新式类 Python
  • 【ROS机器人系统】自主导航+YOLO目标检测+语音播报

    文章目录 注意事项 一 总体功能设计 二 实验环境 三 演示 四 场景搭建 建图与导航模块 4 1 场景搭建 4 2 小车模型 4 3 导航模块 1 安装依赖 2 从github下载的文件中的test ws目录下 3 运行导航功能 五 YO
  • 图像标签Day02

    1 常见的图像格式 JGP GIF PNG BPM位图 img src resources image 图像标签 jpg alt 基神头像 title 基基哥 width 8
  • springcloud配置nacos启动报错

    报错1 2022 06 09 22 07 27 934 ERROR 15656 main c a cloud nacos NacosConfigProperties create config service error propertie
  • python把路径中反斜杠'\'变为'/'

    windows文件的路径是按反斜杠 分开的 例如 C ProgramData Microsoft Windows Start Menu Programs Xmanager 5 linux总文件路径是使用 分开 例如 home usernam
  • ubutu虚拟机和主机共享同一网络

    ubutu虚拟机和主机共享同一网络 前言 一 使用场景 二 vmware设置 三 主机windows设置 四 虚拟机ubuntu配置 前言 本文采用的是共享同一网卡的方式达到虚拟机使用和主机一样的网络的目的 主要参考了虚拟机共享主机网卡连接
  • loading加载

  • 浅谈 axios ajax fetch

    原生ajax 创建异步对象 var xhr new XMLHttpRequest 设置请求基本信息 并加上请求头 xhr setRequestHeader Content type application x www form urlenc
  • 2014年底总结

    这是第一次写年底总结 其实每年一直都有年底写总结的想法 可总是手头的事情很多 最终计划赶不上变化 最后写总结的想法就不了了之了 今天手头上没有什么工作 趁着现在有些空闲的时间 赶紧开始动笔了 其实很多事情不是没时间做 而是我们的惰性成功了
  • 图像处理那些算法

    图像的几何变换 1 旋转 借助矩阵运算来实现图像的旋转功能 2 平移 借助矩阵运算来实现图像的旋转功能 3 对称 借助矩阵运算来实现图像的对称功能 水平镜像变换 垂直镜像变换 图片裁剪 借助 get gca currentPoint 获取鼠
  • Liunx - 安装maven

    一 使用步骤 1 下载安装 maven官网 https maven apache org download cgi 上传至云服务中 我使用的连接工具 MobaXterm Personal 一键上传 选择你要安装的路径新建maven文件夹 新
  • 【软件测试】软件测试方法之黑盒测试方法和白盒测试

    白盒测试方法 一 概念 白盒测试也称结构测试或逻辑驱动测试 是针对被测单元内部是如何进行工作的测试 它根据程序的控制结构设计测试用例 主要用于软件或程序验证 它可以形象得用下图表示 二 白盒测试方法应该遵循的原则 保证一个模块中的所有独立路
  • exif-js读取图像的元数据(以取经纬度、方位角为例)

    参考文档 安装 npm install exif js save 引用 import EXIF from exif js 使用 EXIF getData document getElementById imgElement function
  • vue聊天功能模块(九)艾特功能实现

    预览 艾特开始 思路 输入ctrl 弹出群成员列表弹框 点击成员时 把成员名称添加到输入框 同时隐藏弹框 1 点击弹框外任意位置 把弹框关闭即可 2 点击删除键时 把 和名称删掉 3 要实现艾特提示 输入框显示的是 某某某 实际发出去的消息
  • HttpClient 之 发送Https请求

    HttpClient包是一个优秀的Http请求的开源jar 本文Http工具类的封装基于HttpClient 封装后的工具类支持Https请求 但是由于项目的需要快速的实现 以下代码还可能会有点过时 但是要是可行的 并且相对比较简单 1 实
  • 小程序组件化开发

    前言 随着小程序的普及 越来越多的开发者开始使用小程序进行开发 而小程序的组件化开发已经成为了一种标配的开发模式 本文将深入介绍小程序组件化开发的相关知识 包括组件的定义 生命周期 通信和使用等方面 帮助大家更好地理解和使用小程序的组件化开
  • 图解SimCLR框架,用对比学习得到一个好的视觉预训练模型

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 amitness 编译 ronghuaiyang 正文共 3027 字 33 图 预计阅读时间 9 分钟 导读 有点像词向量预训练模型 这个框架可以作为很多视觉相关的任务的预训练