用于cv的自监督学习方案
提出问题:将NLP中的自监督学习用于视觉中,文章中提出了一种MAE(屏蔽自动编码器),尝试用很小的输入预训练模型来训练很大的模型,由于是图像的遮掩,所以可以选择无关紧要的的像素点来进行掩蔽吗?还是可以随机选择图像的像素点来进行掩蔽,在底层特征被模型把握的同时,是否需要注意高层的特征,对于一些高细节度的特征是否舍弃?
论文的大概操作:先对输入的图像打码,再对缺失的部分进行重建
模型的主要结构: 非对称的编码-解码架构,一个高比例遮蔽输入图像
这个自编码在视觉中和在语言中的区别?
1、过去在视觉中卷积神经网络占主导地位,但传统的卷积网络无法对一些隐藏的特征或者被遮挡的特征进行整合,基于此,作者提出了用ViT(Vision Transformer)进行试验
2、图像和语言的信息密度不同,自然语言的话语中一般都有特定语义,信息量巨大,但图像中的冗余还是很多的,所以可以遮盖一部分(文中举例是75%)的无用像素块,再通过MAE通过相邻像素进行图像重构。
不同遮挡度还原出的图像效果
3、自动编码器的解码器在语言和图像中功能是不同的,解码器把图像中的潜藏的信息重新映射回输入,对于重构图像有较大帮助,而在BERT中作用较小。
作者设计的流程
为非对称的encoder-decoder结构,encoder(改进过的ViT)只输入有图像信息的图片(即未被遮掩的),decoder处理这部分图像信息,由于decoder处理的信息可能只有全图信息的25%或者更少,所以可以用很少的数据来还原出极大的图像,减轻了运行消耗。
作者为什么选择非对称结构?
经过多次实验发现,只要用轻量的网络,非对称结构就能把全部的tokens处理好,大大的减短了预训练的时间(姑且认为是炼丹玄学吧)
对图像遮掩的处理(数据预处理,参考了github上的GitHub - pengzhiliang/MAE-pytorch: Unofficial PyTorch implementation of Masked Autoencoders Are Scalable Vision Learners)
import random
import math
import numpy as np
class RandomMaskingGenerator:
def __init__(self, input_size, mask_ratio):
if not isinstance(input_size, tuple): #如果指定的对象拥有指定的类型,则 isinstance() 函数返回 True,否则返回 False。
input_size = (input_size,) * 2 #如果不是指定类型给它扩充以满足格式要求
self.height, self.width = input_size
self.num_patches = self.height * self.width #定义掩膜的大小?
self.num_mask = int(mask_ratio * self.num_patches)#总共需要掩膜的数量=遮掩率*总的patches
def __repr__(self):
repr_str = "Maks: total patches {}, mask patches {}".format(
self.num_patches, self.num_mask#输出总的patches和mask patches
)
return repr_str
def __call__(self):
mask = np.hstack([
np.zeros(self.num_patches - self.num_mask),
np.ones(self.num_mask),
]) #设计掩膜
np.random.shuffle(mask)
return mask # [196]