1.Swin Transformer
2.使用Cleanlab、码解PCA和Procrustes可视化ViT微调
3.捋一捋Swin Transformer
4.源代码阅读+一个示例 详解timm库背后的码解create_model以及register_model函数
5.轻松理解ViT(Vision Transformer)原理及源码
Swin Transformer
ç®åtransformerä»è¯è¨å°è§è§ä»»å¡çææ主è¦æ¯ç±äºè¿ä¸¤ä¸ªé¢åé´çå·®å¼ï¼
为äºè§£å³ä»¥ä¸ä¸¤ç¹ï¼æ们æåºäºå±çº§Transformerï¼éè¿æ»å¨çªå£æåç¹å¾çæ¹å¼å°ä½¿å¾ self.attention ç计ç®ééä½ä¸ºåå¾å尺寸ç线æ§ç¸å ³ã
æ们è§å¯å°å°è¯è¨é¢åè¿ç§»å°è§è§é¢åç主è¦é®é¢å¯ä»¥è¢«æ»ç»ä¸ºä¸¤ç§ï¼
å¨æºç å®ç°ä¸ä¸¤ä¸ªæ¨¡ååäºä¸ºä¸ï¼ç§°ä¸º PatchEmbedding ãè¾å ¥å¾ç尺寸为 çRGBå¾çï¼å° 4x4x3 è§ä¸ºä¸ä¸ªpatchï¼ç¨ä¸ä¸ªlinear embedding å±å°patch转æ¢ä¸ºä»»ædimension(éé)çfeatureãæºç ä¸ä½¿ç¨4x4çstride=4çconvå®ç°ã->
è¿æ¯è¿ç¯è®ºæçæ ¸å¿æ¨¡åã
window partition å为 regular window partition å shift window partition ï¼å¯¹åºäº W-MSA å SW-MSA ãéè¿çªå£ååï¼å°è¾å ¥ç feature map 转æ¢ä¸º num_windows*B, window_size, window_size, C ï¼å ¶ä¸ num_windows = H*W / window_size / window_size ãç¶åresize å° num_windows*B, window_size*window_size, C è¿è¡attentionãæºç å¦ä¸ï¼
ç± regular window partition 模å å mutil-head self attention 模åç»æã
W-MSAç¸æ¯äºç´æ¥ä½¿ç¨MSA主è¦æ¯ä¸ºäºéä½è®¡ç®éãä¼ ç»çtransformeré½æ¯åºäºå ¨å±æ¥è®¡ç®æ³¨æåï¼å æ¤è®¡ç®å¤æ度é常é«ãä½æ¯swin transformeréè¿å¯¹æ¯ä¸ªçªå£æ½å 注æåï¼ä»èåå°äºè®¡ç®éãattentionç主è¦è®¡ç®è¿ç¨å¦ä¸ï¼
å设æ¯ä¸ä¸ª window çåºå大å°ä¸º ï¼è¾å ¥ç尺寸为 ï¼ä»¥ä¸ä¸ºåå§ç å ç计ç®å¤æ度ï¼
è½ç¶ éä½äºè®¡ç®éï¼ä½æ¯ç±äºå°attentionéå¶å¨ window å ï¼å æ¤ä¸éåç window 缺ä¹èç³»ï¼éå¶äºæ¨¡åçæ§è½ãå æ¤æåºäº 模åãå¨ MSA åé¢å ä¸ä¸ä¸ª cycle shift window partition
swin transformerä¸æ²¡æä½¿ç¨ pooling è¿è¡ä¸éæ ·ï¼èæ¯ä½¿ç¨äºåyolov5ä¸ç focus å±è¿è¡ feature map çä¸éæ ·ã -> ï¼å¨ä½¿ç¨ä¸ä¸ªå ¨è¿æ¥å±-> ï¼å¨ä¸ä¸ªstageä¸å°feature mapçé«å®½ååï¼ééæ°ç¿»åã
åºå模åç»æå½å为 Swin-B ï¼æ¨¡å大å°å计ç®å¤æ度å ViT-B / DeiT-B ç¸è¿ãåæ¶æ们ä¹æåºäº Swin-T ï¼ Swin-S å Swin-L ï¼åå«å¯¹åº 0.à , 0.5à å 2à åç模å尺寸å计ç®å¤æ度ã Swin-T å Swin-S ç计ç®å¤æ度åå«å ResNet- ã ResNet- ç¸è¿ã é»è®¤è®¾ç½®ä¸º7ã 代表第ä¸å±éèå±çæ°éã
使用Cleanlab、PCA和Procrustes可视化ViT微调
在图像处理领域,码解与传统的码解CNN不同,基于Transformers架构的码解ViT模型因其在自然语言处理任务中的成功而被引入。微调这些模型以获得理想性能的码解arm源码授权过程往往涉及精细的操作。下面,码解我们将通过一步步的码解示例,展示如何通过Cleanlab、码解PCA和Procrustes技术可视化ViT模型在CIFAR-数据集上的码解微调过程。
首先,码解微调从预训练的码解ViT模型开始,使用CIFAR-的码解6万张和类标签。微调过程中,码解通过设置save_strategy和save_step来频繁保存检查点,码解确保动画有足够的平行世界源码数据点。然后,利用Transformers库的AutoFeatureExtractor和automodel获取不同阶段模型的嵌入,每个嵌入都是维的。
嵌入分析中,Cleanlab的离群值检测功能识别出分类错误的特征。接着,通过scikit-learn的PCA将维向量降维到2维,以便可视化。然而,PCA可能导致动画帧间出现不必要的轴翻转或旋转。为解决这个问题,我们应用了Procrustes Analysis进行几何变换,确保动画过渡平滑。
在最终的动画制作中,我们使用make_pca和get_ood函数创建图表,溯源码图形展示嵌入的二维分布和前8个异常值。此外,还会加载训练损失数据,以线形图的形式呈现。整个过程在Spotlight中进行最后检查,确保所有数据准确无误。
这个可视化过程不仅有助于理解微调ViT模型的步骤,还是一个有效的教学工具,能够直观地展示模型调整的过程和结果。源代码可在GitHub上查看,作者为Markus Stoll。
捋一捋Swin Transformer
Swin Transformer是ICCV 的最佳论文,它证明了Transformer在视觉领域的通用性,特别体现在Swin-T模型上。其结构区别于ViT,汽车指标源码采用4x4的初始切分和Window Attention,允许获取多尺度信息,适用于目标检测和语义分割。下面,我们通过源码解析Swin Transformer的工作原理。
首先,Swin Transformer的架构包括PatchEmbed层,将图像切割成小patch,之后通过多个BasicLayer处理,每个BasicLayer由Swin Transformer Block和Patch Merging组成。与ViT不同,Swin-T的PatchEmbed使用4x4切分并逐渐增大patch尺寸,以实现多尺度变化。BasicLayer中的核心模块Swin Transformer Block包含两个Window Attention,一个在窗口内操作,富星源码另一个解决窗口间信息交流问题。
Window Attention通过将输入分割成小窗口,降低计算复杂度,但通过shift操作引入了窗口之间的信息交互。Shifted Window Attention通过调整窗口位置并使用掩码来控制注意力,使得并行计算更高效。此外,Window Attention还包括了相对位置编码,增强对局部上下文的理解。
Patch Merging则模仿CNN,通过合并小patch以提取不同分辨率的特征,有助于多尺度特征的提取。在实验中,Swin Transformer在图像分类、目标检测和语义分割等多个领域展现了出色性能,尽管面临如Convnext的竞争,但它在视觉领域的创新性和多模态潜力仍值得关注。
源代码阅读+一个示例 详解timm库背后的create_model以及register_model函数
深入理解timm库的核心,本文将重点剖析create_model和register_model这两个关键函数的工作原理。timm库以其封装的便捷性和SOTA模型集成而闻名,但内部细节往往被隐藏。本文将通过一个实例,揭示create_model的全貌,包括register_model的作用,帮助读者更好地掌握这两个函数的使用。
首先,create_model从model_name入手,如vit_base_patch_,通过parse_model_name函数将其解析。这个过程包括urlsplit函数,用于解析model_name,如timm和vit_base_patch_被分别赋值给model_source和model_name。
进一步,split_model_name_tag函数被调用,将model_name拆分为基础模型名称和配置参数。例如,model_name='vit_base_patch_',tag=''。
然后,is_model函数检查model_name是否已注册在timm的_model_entrypoints字典中。register_model实际上是一个函数修饰器,它允许用户自定义模型,并将其添加到timm的框架中,以便无缝使用timm的训练工具,如ImageNet训练。
在is_model验证后,create_fn通过model_entrypoint(model_name)创建模型。register_model的__name__属性在此过程中起到关键作用,它将用户自定义的函数与timm的框架连接起来。
通过以上步骤,本文旨在解构create_model的内部逻辑,帮助读者更好地掌握register_model的修饰器功能,从而在项目中更自信地运用timm库。现在,让我们跟随代码实例,深入了解这两个函数的运作细节。
轻松理解ViT(Vision Transformer)原理及源码
ViT,即Vision Transformer,是将Transformer架构引入视觉任务的创新。源于NLP领域的Transformer,ViT在图像识别任务中展现出卓越性能。理解ViT的原理和代码实现在此关键点上进行。
ViT的核心流程包括图像分割为小块、块向量化、多层Transformer编码。图像被分为大小为x的块,块通过卷积和展平操作转换为向量,最终拼接形成序列。序列通过多层Transformer编码器处理,编码器包含多头自注意力机制和全连接前馈网络,实现特征提取和分类。模型输出即为分类结果。
具体实现上,Patch Embedding过程通过卷积和展平简化,将大小为x的图像转换为x的向量序列。Transformer Encoder模块包括Attention类实现注意力机制,以及Mlp类处理非线性变换。Block类整合了这两个模块,实现完整的编码过程。
VisionTransformer整体架构基于上述模块构建,流程与架构图保持一致。代码实现包括关键部分的细节,完整代码可参考相关资源。
综上所述,ViT通过将图像分割与Transformer架构相结合,实现高效图像识别。理解其原理和代码,有助于深入掌握这一创新技术。