深度学习——ViT:an image is worth 16x16 words: transformers for image recognition at scale

前言

ViT使用Transformer的Encoder做图像识别,这篇文章发表在ICLR 2021上,是一片oral文章,具体可见我是链接

其实个人看完transformer后,感觉Transformer更像是一个是一个广义卷积神经,Q、K、V矩阵完全可以看成由多个卷积堆叠在一起组成,只是相比于CNN,Transformer在网络的浅层就通过注意力机制建立了全局视野,其实完全可以尝试在CNN的浅层施加注意力机制,从而建立全局视野。

值得注意的是,论文只给出了在大型数据集上pretrain,在下游数据集上finetune的结果,并没有给出从零训练Transformer的结果,同时这篇论文也给出了Transformer在图像识别上表现出的一些非常有意思的性质。

阅读本文前,请确保自己了解Transformer的结构,本文不会过多介绍Transformer的结构,有兴趣请浏览点我

ViT的结构

模型总体架构
在这里插入图片描述

ViT的输入

如上图所示,对于模型输入而言,ViT将图像分为一个个不相交的patch,每个patch都是一个二维矩阵,ViT将其reshape成一组一维向量 { x 1 , x 2 , . . . , x N } \{x_1,x_2,...,x_N\} {x1,x2,...,xN},接着每个一维向量输入到一个单层全连接层神经网络中(所有patch共用一个MLP),得到一组序列 { x 1 E , x 2 E , . . . , x p E } \{x_1E,x_2E,...,x_pE\} {x1E,x2E,...,xpE},其中E为单层全连接层神经网络的参数(可以看成是一个矩阵),对应上图标有1、2、3…的不标准矩形,除了上述序列外,ViT还添加了一个可学习的序列 x c l a s s x_{class} xclass,输入模型的序列为 { x c l a s s , x 1 E , x 2 E , . . . , x p E } \{x_{class},x_1E,x_2E,...,x_pE\} {xclass,x1E,x2E,...,xpE},上述序列在添加一个可学习的position embedding,作为Transformer Encoder的输入,ViT的position embedding与Transformer不太一致,原Transformer的position embedding不是可学习的,ViT这么做,一方面是相对于文本数据,图像序列的相对位置关系通常难以人为设定,另一方面,可以增加模型的灵活性

分类使用的feature vector

Transformer Encoder的输出是一个序列,ViT使用这组序列中的首个feature vector,作为分类器的输入

实验

实验部分主要探索了ViT在大数据集上预训练,在下游数据上finetune的实验结果,并没有直接report在下游数据直接训练的结果,并且ViT预训练用到的数据越多,性能越好。

此处挑一个比较有意思的结果,如下图所示
在这里插入图片描述

作者计算了每一层,mutil-head attention之间的attention distance,作者没解释attention distance是如何计算的,只是说这个指标可以等价于CNN中的感受野,上图横坐标表示网络深度,纵坐标表示Mean attention distance,即多次实验取平均的结果,attention distance越大,表示感受野越大,可以看到,Transformer的浅层就已经建立了很大的感受野,而CNN中,大的感受野只有在网络的深层才可以建立,这是两者的区别

论文《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》由谷歌团队发表于ICLR 2021,主要介绍了Vision Transformer (ViT) 的设计与性能。以下是关于该论文的一些重要引用: ### 关键概念概述 - **图像分割为Patch序列**:为了使Transformer能够处理图像数据,论文提出将图像划分为固定大小的块(patches)。这些块被线性映射为向量,并附加位置编码以保留空间信息[^2]。 - **减少归纳偏差**:相比于传统卷积神经网络(CNN),ViT通过直接处理图像patch序列的方式显著减少了图像特定的归纳偏差。这意味着模型更加灵活,能够在不同类型的图像任务中表现出更强的泛化能力[^3]。 - **预训练的重要性**:研究发现,在大规模数据集上进行预训练对于提升ViT的表现至关重要。即使是在较小的数据集上微调时,经过充分预训练的ViT也能达到甚至超过现有最佳卷积网络的效果[^4]。 - **计算效率高**:尽管Transformer架构通常被认为计算成本较高,但实验表明,当应用于适当规模的任务时,ViT所需的计算资源实际上低于许多先进的CNN模型。 ### 技术细节说明 下面是一段简单的Python代码实现如何将一张图片转换成适合输入给ViT模型的形式: ```python import numpy as np def split_image_into_patches(image, patch_size=16): height, width, channels = image.shape patches = [] for y in range(0, height, patch_size): for x in range(0, width, patch_size): patch = image[y:y+patch_size, x:x+patch_size] if patch.shape[:2] == (patch_size, patch_size): # Ensure full-sized patches only. patches.append(patch.flatten()) return np.array(patches) # Example usage with a dummy RGB image of size 224x224 pixels and 3 color channels. dummy_image = np.random.rand(224, 224, 3) image_patches = split_image_into_patches(dummy_image) print(f"Number of Patches Generated: {len(image_patches)}") ``` 此函数会把任意尺寸的RGB图像切割成一系列形状相同的补丁,准备作为后续嵌入层的输入源材料之一。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值