Vision Transformer入门解析

目录

结构

输入

可训练的参数[class]token、Position Embedding

Dropout


结构

  • Linear Projection of Flattened Patches(Embedding层)
  • Transformer Encoder(图右侧有给出更加详细的结构)
  • MLP Head(最终用于分类的层结构)
    vit
  • (在Transformer Encoder后其实还有一个Layer Norm没有画出来)
  • 通过Transformer Encoder后输出的shape和输入的shape不变,输入输出都是[197, 768]
  • 只需提取出[class]token生成的对应结果,即[197, 768]中抽取出[class]token对应的[1, 768]。
  • MLP Head原论文中说在训练ImageNet21K时是由Linear+tanh激活函数+Linear组成。
  • 但是迁移到ImageNet1K上或者自己的数据上时,只用一个Linear即可
  • 以下均以ViT-B/16为例

输入

Transformer:NLP,input:token(向量)序列,即二维矩阵[num_token, token_dim]

Vision Transformer:CV,input:图像数据数据格式为[H, W, C]三维矩阵

将输入图片(224x224)按照16x16大小的Patch进行划分, (224/16)^2=196个Patches。

通过线性映射将每个Patch映射到一维向量中(后面都直接称为token),

每个Patche数据shape为[16, 16, 3]通过映射得到一个长度为768的向量。[16, 16, 3] -> [768]

(3为图像通道数)

直接使用一个卷积核大小为16x16,步距为16,卷积核个数为768的卷积来实现。

通过卷积[224, 224, 3] -> [14, 14, 768],(224/16=14)

把H以及W两个维度展平即可[14, 14, 768] -> [196, 768],

此时正好变成了一个二维矩阵,正是Transformer想要的。
 

可训练的参数[class]token、Position Embedding

参考BERT,

专门用于分类的[class]token是一个长度为768的向量,与tokens拼接在一起,

Cat([1, 768], [196, 768]) -> [197, 768]。

Position Embedding(1D Pos. Emb.),直接叠加在tokens(add),shape要一样

拼接[class]token后shape是[197, 768],那么Position Embedding的shape也是[197, 768]。

Dropout


如果模型的参数太多,而训练样本又太少,会出现过拟合

 “过拟合”会导致模型的“泛化”(通用能力)能力太差,训练的模型如果只能适用于某种特定条件,那么这个模型可用的范围,所能承受的抗干扰性(鲁棒性)就太差了

即模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。

为了解决过拟合问题,一般会采用模型集成的方法,即训练多个模型进行组合

Dropout一种正则化trick,减少过拟合现象。

在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0)。

减少特征检测器(隐层节点)间的相互作用(某些检测器依赖其他检测器才能发挥作用)。

即在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,

这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如图1所示。

  • 随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变
  • 把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。
  • 一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)
  • 重复以下过程:
  • 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
  • . 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。

(1)在训练模型阶段

无可避免的,在训练网络的每个单元都要添加一道概率流程。

标准网络和带有Dropout网络的比较


对应的公式变化如下:

 . 没有Dropout的网络计算公式:
           
. 采用Dropout的网络计算公式:

 

上面公式中Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量。

代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0。

比如某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、......、y1000,dropout比率选择0.4,这一层神经元经过dropout,1000个神经元中会有大约400个的值被置为0。

注意:训练 经过上面屏蔽掉某些神经元,使其激活值为0以后,

还需要对向量y1……y1000进行缩放(rescale),也就是乘以1/(1-p)。

否则在测试的时候,就需要对权重进行缩放,操作如下。

(有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px)

(2)在测试模型阶段

预测模型的时候,每一个神经单元的权重参数要乘以概率p。


预测模型时Dropout的操作
测试阶段Dropout公式:

 

全连接网络大量利用Dropout,而且一般认为设置为0.5或者0.3,

卷积网络隐藏层中由于卷积自身的稀疏化以及稀疏化的ReLu函数的大量使用等原因,Dropout策略在卷积网络隐藏层中使用较少。

 参考链接:

Vision Transformer详解_太阳花的小绿豆的博客-CSDN博客_vit详解

ViT论文逐段精读【论文精读】 - 哔哩哔哩

正则化-最通俗的解释_Vip__Miracle的博客-CSDN博客_正则化的通俗解释

深度学习中Dropout原理解析_Microstrong0305的博客-CSDN博客_dropout

VIT 的复仇 !!

不重要的token可以提前停止计算!英伟达提出自适应token的高效视觉Transformer网络A-ViT,提高模型的吞吐量!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是用于实现Vision Transformer框架的一部分功能,具体逐行解析如下: 1. `conv_output = F.conv2d(image, kernel, stride=stride)`: 这一行代码使用PyTorch中的卷积函数`F.conv2d`来对输入图像进行卷积操作。 2. `bs, oc, oh, ow = conv_output.shape`: 这一行代码通过`conv_output.shape`获取卷积输出张量的形状信息,其中`bs`表示批次大小,`oc`表示输出通道数,`oh`和`ow`分别表示输出张量的高度和宽度。 3. `patch_embedding = conv_output.reshape((bs, oc, oh*ow))`: 这一行代码通过`reshape`函数将卷积输出张量进行形状变换,将其转换为形状为`(bs, oc, oh*ow)`的张量。 4. `patch_embedding = patch_embedding.transpose(-1, -2)`: 这一行代码使用`transpose`函数交换张量的最后两个维度,将形状为`(bs, oh*ow, oc)`的张量转换为`(bs, oc, oh*ow)`的张量。 5. `weight = weight.transpose(0, 1)`: 这一行代码将权重张量进行转置操作,交换第0维和第1维的位置。 6. `kernel = weight.reshape((-1, ic, patch_size, patch_size))`: 这一行代码通过`reshape`函数将权重张量进行形状变换,将其转换为形状为`(outchannel*inchannel, ic, patch_size, patch_size)`的张量。 7. `patch_embedding_conv = image2emb_conv(image, kernel, patch_size)`: 这一行代码调用了`image2emb_conv`函数,并传入了图像、权重张量和补丁大小作为参数。 8. `print(patch_embedding_conv.shape)`: 这一行代码打印了`patch_embedding_conv`的形状信息。 以上是对Vision Transformer代码的逐行解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值