对比学习是一种通过对比正反两个例子来学习表征的自监督学习方法。对于自监督对比学习,下一个等式是对比损失:

Li,j=−log⁡exp(zi⋅zj/τ)∑k=1,k≠i2Nexp(zi⋅zk/τ)\mathcal{L}_{i,j} = - \log \frac{exp(\textbf{z}_i \cdot \textbf{z}_j / \tau)}{\sum_{k=1,k\neq i}^{2N}exp(\textbf{z}_i \cdot \textbf{z}_k / \tau)} Li,j​=−log∑k=1,k​=i2N​exp(zi​⋅zk​/τ)exp(zi​⋅zj​/τ)​

在很多情况下,对比学习只需要对每一个样本生成一个正样本,同一个batch内的其他样本作为负样本,实现如下:

def contrastive_loss(x, x_aug, T):""":param x: the hidden vectors of original data:param x_aug: the positive vector of the auged data:param T: temperature:return: loss"""batch_size, _ = x.size()x_abs = x.norm(dim=1)x_aug_abs = x_aug.norm(dim=1)sim_matrix = torch.einsum('ik,jk->ij', x, x_aug) / torch.einsum('i,j->ij', x_abs, x_aug_abs)sim_matrix = torch.exp(sim_matrix / T)pos_sim = sim_matrix[range(batch_size), range(batch_size)]loss = pos_sim / (sim_matrix.sum(dim=1) - pos_sim)loss = - torch.log(loss).mean()return loss

如果要用生成的负样本进行对比,代码如下:

def info_nce_loss(self, features):labels = torch.cat([torch.arange(self.args.batch_size) for i in range(self.args.n_views)], dim=0)labels = (labels.unsqueeze(0) == labels.unsqueeze(1)).float()labels = labels.to(self.args.device)features = F.normalize(features, dim=1)similarity_matrix = torch.matmul(features, features.T)# assert similarity_matrix.shape == (#     self.args.n_views * self.args.batch_size, self.args.n_views * self.args.batch_size)# assert similarity_matrix.shape == labels.shape# discard the main diagonal from both: labels and similarities matrixmask = torch.eye(labels.shape[0], dtype=torch.bool).to(self.args.device)labels = labels[~mask].view(labels.shape[0], -1)similarity_matrix = similarity_matrix[~mask].view(similarity_matrix.shape[0], -1)# assert similarity_matrix.shape == labels.shape# select and combine multiple positivespositives = similarity_matrix[labels.bool()].view(labels.shape[0], -1)# select only the negatives the negativesnegatives = similarity_matrix[~labels.bool()].view(similarity_matrix.shape[0], -1)logits = torch.cat([positives, negatives], dim=1)labels = torch.zeros(logits.shape[0], dtype=torch.long).to(self.args.device)logits = logits / self.args.temperaturereturn logits, labelsself.criterion = torch.nn.CrossEntropyLoss()
loss = self.criterion(logits, labels)

更多内容访问 omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2022 • OmegaXYZ-版权所有 转载请注明出处

对比学习Python实现相关推荐

  1. 『对比Excel,轻松学习Python数据分析』新书发布

    之前在公众号提过,我写了一本书,现在这本书终于面世了,这本书就是『对比Excel,轻松学习Python数据分析』,这本书是写什么的,以及这本书怎么写的,相信大家通过书名就能了解一二,但还是有必要专门写 ...

  2. python和excel的区别-对比Excel,轻松学习Python数据分析

    阅读权限50威望2 级论坛币2119 个学术水平357 点热心指数383 点信用等级313 点经验103301 点帖子917精华在线时间8677 小时注册时间2012-3-28最后登录2020-10- ...

  3. 数据分析领域,为什么要对比Excel学习Python?

    Python本身是一门编程语言,应用于Web开发.爬虫.机器学习等多个领域,但是除了这些,今天我要告诉你Python大热的一个学习方向--那就是Python数据分析. 我常常会听到这样的问题,&quo ...

  4. 好书推荐:《对比Excel,轻松学习Python数据分析》

    之前就一直有打算出一个结合Excel的Python数据分析的教程,刚好张俊红同学就出了书籍,后面写相关文章又多了一本好书.我首先说说我的看法,为什么要和Excel做结合了. Excel大家都熟悉,结合 ...

  5. Python数据分析是什么?为什么要对比Excel学习Python数据分析?

    Python 虽然是一门编程语言,但是它并不难学,不仅不难学,而且很容易上手,这也是Python深受广大数据从业者喜爱的原因之一,因此大家在学习Python之前首先在心里告诉自己一句话,那就是Pyth ...

  6. 《对比excel,轻松学习python数据分析》学习笔记

    文章目录 前言 为什么要学习python 为什么要对比excel学习python 第1章 数据分析基础 数据分析的作用 数据分析的内容 数据分析的流程 第2章 python基础知识 1.python介 ...

  7. 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?

    原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...

  8. 语义表征的无监督对比学习:一个新理论框架

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑ 译者 | Linstancy 责编 | 琥珀 出品 | AI科技大本营(ID:rgznai100) ...

  9. 怎么学python-如何轻松学习Python数据分析

    1.实际的工作 如果你是一名数据分析师,我相信你对上面的这些词应该不陌生.我自己在刚开始做数据分析的时候,基本上每天就是Excel,就是Excel里面的vlookup.sumifs.数据透视表这些,s ...

  10. 学python需要学数据库吗-学习Python爬虫前,你必须知道的一些工具!

    原标题:学习Python爬虫前,你必须知道的一些工具! 许多小伙伴在学习了一段时间的Python后,开始上手爬虫项目了,作为一个总算掌握了基础,开始向上进阶的Python小白,在做爬虫的时候肯定会遇到 ...

最新文章

  1. Python-anaconda-Spyder使用matplotlib画图无法显示报错解决:Figures now render in the Plots pane by default. To mak
  2. [Usaco2007 Dec]穿越泥地[bfs][水]
  3. 酶促反应动力学_酶促反应动力学实验
  4. [Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建
  5. Linux学习——shell编程之变量
  6. vscode remote ssh 远程开发免密登陆方法
  7. PPT 下载 | 神策数据杜明翰:数据赋能产品的 3 个锦囊
  8. Oracle 原理: 物化视图,快照,实体化视图。
  9. GDCM:检查二个dicom文件的BigEndian错误的测试程序
  10. springboot创建多个对象
  11. Git 和 GitHub 教程——版本控制入门
  12. web csrf java_在Java Web应用程序中阻止CSRF
  13. ldd3笔记_2_加载模块方法, 模块程序组成【ZT】
  14. @PropertySource 解析 yml 配置文件,自定义解析 yaml 工厂类
  15. 全国各地车牌代码整理出数据库表,直接生成表
  16. 什么思维是计算机科学的基础概念,计算思维的定义和特征是什么
  17. 窄带物联网应用于工业计算机,工业物联网嵌入式边缘计算机的制作方法
  18. python怎么用sin_python怎么打sin
  19. python中pixels函数_Python的PIL库中getpixel方法的使用
  20. vue网页打印针式打印机内容显示不全

热门文章

  1. oracle.exe占用内存过大,【大话IT】oracle.exe耗尽物理内存
  2. 移动短信回执怎么开通_微信短视频直播怎么做?
  3. linux中lsattr命令,Linux命令(16)——chattr与lsattr命令
  4. java 构建_Java入门环境构建
  5. list vue 添加数据方法_在PySpark数据框中添加新列的5种方法
  6. spring中配置ioc中的常用注解
  7. linux 显存占用内存,Linux服务器内存、CPU、显卡、硬盘使用情况查看
  8. process 类 java_Process 执行命令行Java封装类详解
  9. 三个箭头循环的标志_FLASH制作循环移动的箭头动画
  10. Cesium:解决画线不光滑,模糊不清,锯齿状