Transformer实战-系列教程8:SwinTransformer 源码解读1(项目配置/SwinTransformer类)

本文主要是介绍Transformer实战-系列教程8:SwinTransformer 源码解读1(项目配置/SwinTransformer类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🚩🚩🚩Transformer实战-系列教程总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
https://download.csdn.net/download/weixin_50592077/88809977?spm=1001.2014.3001.5501

SwinTransformer 算法原理
SwinTransformer 源码解读1(项目配置/SwinTransformer类)
SwinTransformer 源码解读2(PatchEmbed类/BasicLayer类)
SwinTransformer 源码解读3(SwinTransformerBlock类)
SwinTransformer 源码解读4(WindowAttention类)
SwinTransformer 源码解读5(Mlp类/PatchMerging类)

1、项目配置

本项目来自SwinTransformer 的GitHub官方源码:

Image Classification: Included in this repo. See get_started.md for a quick start.
Object Detection and Instance Segmentation: See Swin Transformer for Object Detection.
Semantic Segmentation: See Swin Transformer for Semantic Segmentation.
Video Action Recognition: See Video Swin Transformer.
Semi-Supervised Object Detection: See Soft Teacher.
SSL: Contrasitive Learning: See Transformer-SSL.
SSL: Masked Image Modeling: See get_started.md#simmim-support.
Mixture-of-Experts: See get_started for more instructions.
Feature-Distillation: See Feature-Distillation.

此处包含多个版本(分类、检测、分割、视频 ),但是仅仅学习算法建议选择第一个图像分类的基础版本就可以了

安装需求:

pip install timm==0.4.12
pip install yacs==0.1.8
pip install termcolor==1.1.0
pytorch
opencv
Apex(linux版本)

原本的数据是imagenet,这个数据太多了,有很多开源的imagenet小版本,本文配套的资源就是已经配好的imagenet小版本,目录信息、数据标注、数据划分都已经做好了

本项目的执行文件就是main.py,源码我已经修改了部分

配置参数:

--cfg configs/swin_tiny_patch4_window7_224.yaml
--data-path imagenet
--local_rank 0
--batch-size 4

–local rank 0这个参数表示的是分布式训练,直接用当前的这个就好

2、SwinTransformer类

打开models有两个构建模型的源码:
build.py
swin_transformer.py

构建模型的部分主要就在swin_transformer.py,一共有600多行代码

首先看SwinTransformer类的前向传播函数:

class SwinTransformer(nn.Module):def forward(self, x):x = self.forward_features(x)x = self.head(x)return x

打印这个过程的shape值:

  1. 原始输入x: torch.Size([4, 3, 224, 224]),原始输入是一张彩色图像,4是batch,3是通道数,图像是224*244的长宽
  2. self.forward_features(x):torch.Size([4, 768]),经过forward_features函数后,变成了768维的向量
  3. self.head(x):torch.Size([4, 1000]),head是一个全连接层,很显然这个1000是最后的分类数

所以整个体征提取的过程都在self.forward_features()函数中:

    def forward_features(self, x):x = self.patch_embed(x)if self.ape:x = x + self.absolute_pos_embedx = self.pos_drop(x)for layer in self.layers:x = layer(x)x = self.norm(x)  # B L Cx = self.avgpool(x.transpose(1, 2))  # B C 1x = torch.flatten(x, 1)return x
  1. 原始输入x: torch.Size([4, 3, 224, 224]),原始输入是一张彩色图像

  2. patch_embed: torch.Size([4, 3136, 96]),图像经过patch_embbeding变成一个Transformer需要的序列,相当于序列是3136个向量,每个向量维度是96。这个过程通常包括将图像分割成多个patches,然后将每个patch线性投影到一个指定的维度。

  3. if self.ape: x = x + self.absolute_pos_embed,如果模型配置了绝对位置编码(self.ape为真),这行代码会将绝对位置嵌入加到patch的嵌入上。绝对位置嵌入提供了每个patch在图像中位置的信息,帮助模型理解图像中不同部分的空间关系, 不改变维度

  4. pos_drop: torch.Size([4, 3136, 96]),一层Dropout

  5. layer: torch.Size([4, 784, 192]),for循环主要是Swin Transformer Block的堆叠

  6. layer: torch.Size([4, 196, 384]),4次循环,序列长度减小

  7. layer: torch.Size([4, 49, 768]),特征图个数增多,即向量维度变大

  8. layer: torch.Size([4, 49, 768]),最后一次维度不变

  9. norm: torch.Size([4, 49, 768]),层归一化,维度不变

  10. avgpool: torch.Size([4, 768, 1]),平均池化

  11. flatten: torch.Size([4, 768]),拉平操作,去掉多余的维度

SwinTransformer 算法原理
SwinTransformer 源码解读1(项目配置/SwinTransformer类)
SwinTransformer 源码解读2(PatchEmbed类/BasicLayer类)
SwinTransformer 源码解读3(SwinTransformerBlock类)
SwinTransformer 源码解读4(WindowAttention类)
SwinTransformer 源码解读5(Mlp类/PatchMerging类)

这篇关于Transformer实战-系列教程8:SwinTransformer 源码解读1(项目配置/SwinTransformer类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693925

相关文章

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现