(表征学习论文阅读)A Simple Framework for Contrastive Learning of Visual Representations

Chen T, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations[C]//International conference on machine learning. PMLR, 2020: 1597-1607.

1. 前言

本文作者为了了解对比学习是如何学习到有效的表征,对本文所提出的三大组件进行了全面的研究:

  1. 各种数据增强手段的组合在表征学习中起到了重要作用;
  2. 在表征和对比损失之间引入非线性变换能够有效提高表征质量;
  3. 对比学习相较于监督学习需要更大的batch size和更多的训练步数。

在没有人类标注或者监督的情况下学习数据的有效表征是一个长期存在的难题,目前的主要工作可以分为两类:

  1. 基于生成模型的方法
    例如VQ-VAE,MAE,BERT
  2. 基于判别模型的方法
    例如MoCo,CLIP

2. 方法

本文提出了一个框架SimCLR,通过最大化同一数据的不同数据增强处理后的两个视角之间的相似度来学习有效表征。
在这里插入图片描述

  1. 如图所示,本文首先将数据 x x x进行两个不同的增强,这里作者使用了三种简单的数据增强方法:随机裁剪后再调整到原始大小、随机颜色失真、高斯模糊。
  2. f ( ∙ ) f(\bullet) f()代表编码器,这里作者使用的是同一个编码器来对两个视角数据进行编码
  3. 最后编码器输出的结果通过非线性变换 g ( ∙ ) g(\bullet) g()得到 z i z_i zi z j z_j zj,两个向量构成了一组正例,进行相似度计算,也就是简单的单位向量内积计算出余弦相似度。目标就是最大化两者的余弦相似度。同时,一个batch中其他的数据构成了负例,最小化与负例的相似度。注意最终训练完成的编码器我们是需要舍弃掉非线性变换的。
    本文使用的损失函数就是最基本的InfoNCE损失,具体可以参考我的另一篇讲解InfoNCE的博文。
    在这里插入图片描述
    在这里插入图片描述

3. 代码

这里仅提供文章提到的两个点的代码:

  1. 数据增强
    高斯模糊
import numpy as np
import torch
from torch import nn
from torchvision.transforms import transformsnp.random.seed(0)class GaussianBlur(object):"""blur a single image on CPU"""def __init__(self, kernel_size):radias = kernel_size // 2kernel_size = radias * 2 + 1self.blur_h = nn.Conv2d(3, 3, kernel_size=(kernel_size, 1),stride=1, padding=0, bias=False, groups=3)self.blur_v = nn.Conv2d(3, 3, kernel_size=(1, kernel_size),stride=1, padding=0, bias=False, groups=3)self.k = kernel_sizeself.r = radiasself.blur = nn.Sequential(nn.ReflectionPad2d(radias),self.blur_h,self.blur_v)self.pil_to_tensor = transforms.ToTensor()self.tensor_to_pil = transforms.ToPILImage()def __call__(self, img):img = self.pil_to_tensor(img).unsqueeze(0)sigma = np.random.uniform(0.1, 2.0)x = np.arange(-self.r, self.r + 1)x = np.exp(-np.power(x, 2) / (2 * sigma * sigma))x = x / x.sum()x = torch.from_numpy(x).view(1, -1).repeat(3, 1)self.blur_h.weight.data.copy_(x.view(3, 1, self.k, 1))self.blur_v.weight.data.copy_(x.view(3, 1, 1, self.k))with torch.no_grad():img = self.blur(img)img = img.squeeze()img = self.tensor_to_pil(img)return img

组合各类增强手段

class ContrastiveLearningDataset:def __init__(self, root_folder=r"D:\pyproject\representation_learning\data"):self.root_folder = root_folder@staticmethoddef get_simclr_pipeline_transform(size, s=1):"""Return a set of data augmentation transformations as described in the SimCLR paper."""color_jitter = transforms.ColorJitter(0.8 * s, 0.8 * s, 0.8 * s, 0.2 * s)data_transforms = transforms.Compose([transforms.RandomResizedCrop(size=size),transforms.RandomHorizontalFlip(),transforms.RandomApply([color_jitter], p=0.8),transforms.RandomGrayscale(p=0.2),GaussianBlur(kernel_size=int(0.1 * size)),transforms.ToTensor()])return data_transformsdef get_dataset(self, name, n_views):valid_datasets = {'cifar10': lambda: datasets.CIFAR10(self.root_folder, train=True,transform=ContrastiveLearningViewGenerator(self.get_simclr_pipeline_transform(32),n_views),download=True),'stl10': lambda: datasets.STL10(self.root_folder, split='unlabeled',transform=ContrastiveLearningViewGenerator(self.get_simclr_pipeline_transform(96),n_views),download=True)}try:dataset_fn = valid_datasets[name]except KeyError:raise InvalidDatasetSelection()else:return dataset_fn()
  1. 非线性变换
class ResNetSimCLR(nn.Module):def __init__(self, base_model, out_dim):super(ResNetSimCLR, self).__init__()self.resnet_dict = {"resnet18": models.resnet18(pretrained=False, num_classes=out_dim),"resnet50": models.resnet50(pretrained=False, num_classes=out_dim)}self.backbone = self._get_basemodel(base_model)dim_mlp = self.backbone.fc.in_features# add mlp projection head# 修改resnet最后一层的全连接层即可self.backbone.fc = nn.Sequential(nn.Linear(dim_mlp, dim_mlp), nn.ReLU(), self.backbone.fc)def _get_basemodel(self, model_name):try:model = self.resnet_dict[model_name]except KeyError:raise InvalidBackboneError("Invalid backbone architecture. Check the config file and pass one of: resnet18 or resnet50")else:return modeldef forward(self, x):return self.backbone(x)

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

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

相关文章

JdbcTemplate

1.JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,…

rpc的通信流程

rpc能实现调用远程方法就跟调用本地(同一个项目中的方法)一样,发起调用请求的那一方叫做服务调用方,被调用的一方叫做服务提供方。 接下来就和大家分享一下调用过程的流程和细节。 传输协议 既然是远程调用那肯定就需要通过网络…

探索Python爬虫:解析网页数据的神奇之旅

在当今数字化时代,信息的获取变得比以往任何时候都更加便捷。然而,即使在互联网上,获取数据也需要通过正确的工具和技术。Python爬虫就是这样一种强大的工具,它可以让我们轻松地从互联网上收集数据,并将其转化为有用的…

格雷希尔GripSeal用于自动化机械手抓取的防爆阀快速连机器,提高新能源电池包的生产效能

透气防爆阀是当新能源车PACK电池包内部气压过高时,可以释放内部气体避免电池包因压力过高而引发爆炸的安全装置。而新能源汽车在当今社会的普及度越来越高,自动化生产成为了汽车行业的常态,因此,透气防爆阀在进行自动化气密性测试…

如何在 Windows上安装 Python

系列文章目录 作者:i阿极 作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒…

Cesium中加载GaussianSplatting模型

Gaussian Splatting Gaussian Splatting (高斯泼溅) 是近段时间,三维视觉领域热度极高的一项突破性工作。 2020 年提出的 NeRF 等辐射场方法彻底改变了多张照片或视频主导的场景新视角合成的算法生态,但训练、渲染的速度与质量仍存在瓶颈。Gaussian Sp…

算法——哈希表

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享分治算法关于哈希表相关算法的专题 如果有不足的或者错误的请您指出! 1.哈希表简介 哈希实际上可以简单认为是一个存储数据的容器,用于快速查找某个元素,时间复杂度仅为O(1),怎…

A股风格因子看板(2024.4第1期)

该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格景 露等。 今日为该因子跟踪第1期,指数组合数据截止日2024-03-31,要点如下 近1年A股风格因子收益走…

vue快速入门(十)v-bind动态属性绑定

注释很详细&#xff0c;直接上代码 上一篇 新增内容 图片切换逻辑动态绑定的完整写法与简写方法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

Codigger Desktop:用户体验与获得收益双赢的革新之作(一)

上周&#xff0c;我们介绍了Codigger Desktop凭借其强大的功能、稳定的性能以及人性化的设计&#xff0c;成为了广大开发者的得力助手。Codigger Desktop除了是开发者的利器外&#xff0c;它以其出色的用户体验和创新的收益模式&#xff0c;为用户提供了一个全新的选择。Codigg…

解密电子邮件组:高效沟通利器,团队协作新纪元

在当今时代&#xff0c;电子邮件无处不在&#xff0c;尤其是对于商业活动而言。电子邮件的重要性不容忽视&#xff0c;因为它在沟通中极为高效。然而&#xff0c;电子邮件也存在降低工作效率和阻碍流程的风险。在这种情况下&#xff0c;电子邮件群组就是最佳的解决方案。什么是…

基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的高校招生系统1拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;学生管理、专业管理、报名管理、录取通知管理、招生公告管理等 用户&#xff1a;登录注册、报…