论文|Vision Transformer(学习博客总结)

如果说VIT精读,肯定是下面这位老师讲的啦,应该是和沐神一个团队的,讲的十分好,建议二刷!
ViT论文逐段精读【论文精读】:
https://www.bilibili.com/video/BV15P4y137jb?from=search&seid=16478250350520066116&spm_id_from=333.337.0.0
在Transformer Encoder后其实还有一个Layer Norm没有画出来,后面有我自己画的ViT的模型可以看到详细结构。这里我们只是需要分类的信息,所以我们只需要提取出[class]token生成的对应结果就行,即[197, 768]中抽取出[class]token对应的[1, 768]。接着我们通过MLP Head得到我们最终的分类结果。MLP Head原论文中说在训练ImageNet21K时是由Linear+tanh激活函数+Linear组成。但是迁移到ImageNet1K上或者你自己的数据上时,只用一个Linear即可。
论文|Vision Transformer(学习博客总结)
文章图片

论文|Vision Transformer(学习博客总结)
文章图片

论文|Vision Transformer(学习博客总结)
文章图片

作者:霹雳巴拉,老哥画图很好,讲的有些地方需要基础,所以可以先看上面的视频,再来看这个老哥的,也可以遇到不懂的直接去看霹雳哥前期的博客吧 ,或者b站也有讲,图画的很不错,就收藏了。跟着霹雳哥学习!
Vision Transformer详解:
https://blog.csdn.net/qq_37541097/article/details/118242600
博客和b站视频结合着看:
https://www.bilibili.com/video/BV1Jh411Y7WQ?from=search&seid=11223658520806660328&spm_id_from=333.337.0.0
这位博主还是接下来的VIT实现部分,慢慢附链接:
ps:分享一下听到一个很不错的歌,新裤子乐队的!!
生活因你而火热
论文|Vision Transformer(学习博客总结)
文章图片

blog.csdnimg.cn/b97beecd6cc9435e8d7baef38643bf2e.jpg?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAenF4OTUxMTAy,size_17,color_FFFFFF,t_70,g_se,x_16#pic_center)
论文|Vision Transformer(学习博客总结)
文章图片

嘻嘻嘻!!!
【论文|Vision Transformer(学习博客总结)】LN与BN区别:
原文:https://blog.csdn.net/qq_37541097/article/details/117653177
重点:
为什么不使用直接BN呢,因为在RNN这类时序网络中,时序的长度并不是一个定值(网络深度不一定相同),比如每句话的长短都不一定相同,所有很难去使用BN,所以作者提出了Layer Normalization(注意,在图像处理领域中BN比LN是更有效的,但现在很多人将自然语言领域的模型用来处理图像,比如Vision Transformer,此时还是会涉及到LN)。
只看公式的话感觉和BN没什么区别,都是减均值除以标准差,是为了防止分母为零。同样也有两个可训练的参数 β , γ 。不同的是,BN是对一个batch数据的每个channel进行Norm处理,但LN是对单个数据的指定维度进行Norm处理与batch无关(后面有示例)。
在Pytorch的LayerNorm类中有个normalized_shape参数,可以指定你要Norm的维度(注意,函数说明中the last certain number of dimensions,指定的维度必须是从最后一维开始)。比如我们的数据的shape是[4, 2, 3],那么normalized_shape可以是[3](最后一维上进行Norm处理),也可以是[2, 3](Norm最后两个维度),也可以是[4, 2, 3](对整个维度进行Norm),但不能是[2]或者[4, 2],否则会报以下错误。
这里t.shape[-1]指的是数据的最后一个维度3即只对最后一个维度进行Norm处理,

#分别使用官方的LN方法和自己实现的LN方法进行比较,import torch import torch.nn as nndef layer_norm_process(feature: torch.Tensor, beta=0., gamma=1., eps=1e-5): var_mean = torch.var_mean(feature, dim=-1, unbiased=False) # 均值 mean = var_mean[1] # 方差 var = var_mean[0]# layer norm process feature = (feature - mean[..., None]) / torch.sqrt(var[..., None] + eps) feature = feature * gamma + betareturn featuredef main(): t = torch.rand(4, 2, 3) print(t) # 仅在最后一个维度上做norm处理 norm = nn.LayerNorm(normalized_shape=t.shape[-1], eps=1e-5) #这里t.shape[-1]指的是数据的最后一个维度3即只对最后一个维度进行Norm处理, # 官方layer norm处理 t1 = norm(t) # 自己实现的layer norm处理 t2 = layer_norm_process(t, eps=1e-5) print("t1:\n", t1) print("t2:\n", t2)if __name__ == '__main__': main()

    推荐阅读