南理工&上海AI Lab提出Uniform Masking,为基于金字塔结构的视觉Transformer进行MAE预训练!...

关注公众号,发现CV技术之美

本篇文章分享论文『Uniform Masking: Enabling MAE Pre-training for Pyramid-based Vision Transformers with Locality』,南理工&上海AI Lab提出Uniform Masking,为基于金字塔结构的视觉Transformer进行MAE预训练!

详细信息如下:

15e5c21567f73a2de77d20fd0908044b.png

  • 论文链接:https://arxiv.org/abs/2205.10063

  • 项目链接:https://github.com/implus/UM-MAE

      01      

摘要

Masked AutoEncoder(MAE)最近通过一种优雅的非对称编码器-解码器设计引领了视觉自监督领域的发展趋势,该设计显著优化了预训练的效率和微调精度。值得注意的是,非对称结构的成功依赖于视觉Transformer(ViT)的“全局”特性,ViT的自注意机制基于离散图像块的任意子集。

然而,目前尚不清楚如何在MAE预训练中采用基于金字塔的高级ViT(如PVT、Swin),因为它们通常在“局部”窗口中引入操作,因此很难处理部分视觉token的随机序列。在本文中,我们提出了统一掩蔽(Uniform Masking,UM)策略,成功地实现了基于金字塔的具有局部性的VIT的MAE预训练(简称“UM-MAE”)。

具体而言,UM包括一个统一采样(Uniform Sampling,US),它从每个2×2网格中严格采样1个随机patch,然后是一个二次掩蔽(Secondary Masking,SM),它将已采样区域的一部分(通常为25%)随机掩蔽为可学习token。US在多个非重叠的局部窗口中保留了等效元素,从而顺利支持流行的基于金字塔的VIT;由于本文的方法减少了阻碍语义学习的像素恢复预任务的难度,因此SM设计用于更好的可转移视觉表示。作者证明了,UM-MAE显著提高了预训练的效率,在下游任务中保持有竞争力甚至更好的微调性能。

      02      

Motivation

自监督学习(SSL)使用辅助任务从大规模未标记数据中挖掘自己的监督,并学习可转移到下游任务的表示。SSL首先通过GPT和BERT的“屏蔽自动编码”解决方案在自然语言处理(NLP)领域显示出巨大的潜力。这些技术通过学习基于可用上下文预测删除的数据部分,革新了NLP的范式。

受BERT成功的启发,视觉界最近对模仿其公式(即masked autoencoding)进行图像理解引起了极大的兴趣。MAE中最有影响力的设计之一是非对称编码器-解码器结构。与接收整个patch token序列的解码器部分不同,编码器部分仅将可见图像patch(通常仅占总patch的25%)作为输入。有趣的是,这种设计不仅显著降低了训练前的复杂性&

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用torch.nn.transformer进行文本分类,具体流程如下: 1. 准备数据集,将训练数据和测试数据转化为tensor格式。 2. 构建Transformer模型,可以使用PyTorch提供的预训练模型,也可以自行构建模型。 3. 定义损失函数,常用的有交叉熵损失函数。 4. 定义优化器,常用的有Adam优化器。 5. 进行模型训练,使用训练数据对模型进行训练,并在测试数据上进行测试。 6. 对模型进行评估,可以使用准确率、F1分数等指标进行评估。 下面是一个简单的代码示例,用于实现基于Transformer的文本分类: ``` import torch import torch.nn as nn import torch.optim as optim from torchtext.datasets import IMDB from torchtext.data import Field, LabelField, BucketIterator # 将数据集转换为tensor格式 TEXT = Field(tokenize='spacy') LABEL = LabelField(dtype=torch.float) train_data, test_data = IMDB.splits(TEXT, LABEL) TEXT.build_vocab(train_data, max_size=25000) LABEL.build_vocab(train_data) train_iterator, test_iterator = BucketIterator.splits( (train_data, test_data), batch_size=64, device=torch.device('cuda')) # 定义Transformer模型 class TransformerModel(nn.Module): def __init__(self, ntoken, ninp, nhead, nhid, nlayers, dropout=0.5): super(TransformerModel, self).__init__() from torch.nn import TransformerEncoder, TransformerEncoderLayer self.model_type = 'Transformer' self.pos_encoder = PositionalEncoding(ninp, dropout) encoder_layers = TransformerEncoderLayer(ninp, nhead, nhid, dropout) self.transformer_encoder = TransformerEncoder(encoder_layers, nlayers) self.encoder = nn.Embedding(ntoken, ninp) self.ninp = ninp self.decoder = nn.Linear(ninp, 1) self.init_weights() def generate_square_subsequent_mask(self, sz): mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1) mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0)) return mask def init_weights(self): initrange = 0.1 self.encoder.weight.data.uniform_(-initrange, initrange) self.decoder.bias.data.zero_() self.decoder.weight.data.uniform_(-initrange, initrange) def forward(self, src, src_mask): src = self.encoder(src) * math.sqrt(self.ninp) src = self.pos_encoder(src) output = self.transformer_encoder(src, src_mask) output = output.mean(dim=0) output = self.decoder(output) return output.squeeze() # 定义损失函数和优化器 criterion = nn.BCEWithLogitsLoss() model = TransformerModel(len(TEXT.vocab), 512, 8, 2048, 6, dropout=0.5).to(device) optimizer = optim.Adam(model.parameters(), lr=0.0005) # 进行模型训练 def train(model, iterator, optimizer, criterion): model.train() epoch_loss = 0 for batch in iterator: optimizer.zero_grad() src = batch.text trg = batch.label src_mask = model.generate_square_subsequent_mask(src.shape[0]).to(device) output = model(src, src_mask) loss = criterion(output, trg) loss.backward() optimizer.step() epoch_loss += loss.item() return epoch_loss / len(iterator) # 在测试数据上进行测试 def evaluate(model, iterator, criterion): model.eval() epoch_loss = 0 with torch.no_grad(): for batch in iterator: src = batch.text trg = batch.label src_mask = model.generate_square_subsequent_mask(src.shape[0]).to(device) output = model(src, src_mask) loss = criterion(output, trg) epoch_loss += loss.item() return epoch_loss / len(iterator) N_EPOCHS = 10 best_valid_loss = float('inf') for epoch in range(N_EPOCHS): train_loss = train(model, train_iterator, optimizer, criterion) valid_loss = evaluate(model, test_iterator, criterion) if valid_loss < best_valid_loss: best_valid_loss = valid_loss torch.save(model.state_dict(), 'tut6-model.pt') print(f'Epoch: {epoch+1:02} | Train Loss: {train_loss:.3f} | Val. Loss: {valid_loss:.3f}') ``` 该示例中使用了IMDB数据集来进行文本分类,使用了PyTorch提供的Transformer模型,并使用Adam优化器进行模型训练。在进行模型训练时,使用了交叉熵损失函数来计算损失。最后,通过在测试数据上进行测试,评估了模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值