Swin Transformer代码讲解

Swin Transformer代码讲解

下采样是4倍,所以patch_size=4
在这里插入图片描述

在这里插入图片描述
2.
在这里插入图片描述
3.
emded_dim=96就是下面图片中的C,经过第一个Linear Embedding处理之后的通道数
在这里插入图片描述
在这里插入图片描述
4.
在这里插入图片描述

经过第一个全连接层把通道数翻为几倍
在这里插入图片描述
在这里插入图片描述
6.
在Muhlti-Head Attention中是否使用qkv——bias,这里默认是使用
在这里插入图片描述
7.

第一个drop_rate接在PatchEmbed后面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二个drop_rate在Multi-Head Attention过程中使用的
在这里插入图片描述
9.
第三个drop_rate是指在每一个Swin Transformer Blocks中使用的,它是从0慢慢增长到0.1的
在这里插入图片描述

在这里插入图片描述
10.
patch_norm默认接在PatchEmbed后面的
在这里插入图片描述
11.
默认不使用,使用的话,只是会节省内存
在这里插入图片描述
12.
对应于每一个stage中Swin Transformer Blocks的个数
在这里插入图片描述
13.
对应stage4的输出的通道的个数
在这里插入图片描述

在这里插入图片描述
14.
PatchEmbed就是把图片划分成没有重叠的patches
在这里插入图片描述
15.
PatchEmbed对应结构图中高的 Patch Partition 和Linearing Embedding
在这里插入图片描述
在这里插入图片描述
16.
Patch Partition 确实是通过一个卷积实现的
在这里插入图片描述
17.
在宽度方向右侧pad和在高度方向的底部pad
在这里插入图片描述
18.
从维度2开始展平的
在这里插入图片描述
19.
这儿是上文提到的第一个drop_rate直接接在patchEmbed后面
在这里插入图片描述
20.
针对所使用的Swin Transformer Blocks设置一个drop_path_rate。从0开始一直到drop_path_rate
在这里插入图片描述
21.
遍历生成每一个stage,而代码中的stage和论文中的stage有一点差异
在这里插入图片描述
在这里插入图片描述
对于stage4,它没有Patch Merging,只有Swin Transformer Blocks
在这里插入图片描述

在该stage层中需要堆叠的Swin Transformer Blocks的次数
在这里插入图片描述
23.
drop_rate:直接接在patchEmbed后面
attn_drop:该stage所使用的
dpr:该stage中不同Swin Traansformer Blocks所使用的
在这里插入图片描述
24.
构建前3个stage是有PatchMerging,但是最后一个stage是没有PatchMerging
在这里self.num_layers=4
在这里插入图片描述
25.
在这里插入图片描述

在这里插入图片描述
26.
在这里插入图片描述

在这里插入图片描述

在下面的Patch Merging中传入的特征矩阵的shape是x: B , H*W , C这样的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
28.
当x的h和w不是2的整数倍时,就需要padding,需要在右边padding一列0,在下面padding一行0。
在这里插入图片描述
在这里插入图片描述
29.
在这里插入图片描述
30.
在这里插入图片描述
31.
对于分类模型就需要加上下面这部分代码
在这里插入图片描述
32.

对整个模型进行权重初始化
在这里插入图片描述
33.
进行4倍下采样
在这里插入图片描述
34.
L:H*W
在这里插入图片描述
35.
按照一定的比例进行丢失
在这里插入图片描述
36.
遍历各个stage
在这里插入图片描述

下面的代码是在搭建Swin-T模型
在这里插入图片描述

在这里插入图片描述

Swin_T在imagenet-1k上的预训练权重
在这里插入图片描述
39.

Swin_B(window7_224)
在这里插入图片描述
在这里插入图片描述

Swin_B(window7_384)

在这里插入图片描述

在这里插入图片描述
41.
原始的特征矩阵需要进行向右和向下进行移动,但是具体的向右和向下移动的距离等于:窗口的大小除以2,再向下取整
在这里插入图片描述
在这里插入图片描述
self.shift_size就是向右和向下移动的距离
在这里插入图片描述
42.
一个stage中的Swin Trasformer Blocks的个数
在这里插入图片描述

当shift_size=0:使用W-MSA
当shift_size不等于0:使用SW-MSA,shift_size = self.shift_size
在这里插入图片描述
44.
Swin Transformer Blocks有可能是W-MSA也有可能是SW-MSA。在使用的时候并不是把W-MSA和SW-MSA当成一个Swin Transformer Blocks
在这里插入图片描述
45.
depth表示下图中圈出来的数字
在这里插入图片描述
在这里插入图片描述
46.
此处的下采样是使用Patch Merging实现的
在这里插入图片描述
47.
这个实在SW-MSA时使用的
在这里插入图片描述
48.
Swin Transformer Blocks是不会改变特征矩阵的高和宽的,所以每一个SW-MSA都是一样的,所以attn_mask的大小是不会发生改变的,所以attn_mask只需要创建一次
在这里插入图片描述
49.
在这里插入图片描述
50.
这便是创建完了一个stage中的全部Swin Transformer Blocks
在这里插入图片描述
51.
这便是下采样Patch Merging,下采样高度和宽度会减小两倍
在这里插入图片描述
52.
这里的+1,是防止传入的H和W是奇数,那么就需要padding
在这里插入图片描述在这里插入图片描述
53.

在这里插入图片描述
在这里插入图片描述
54.
在这里插入图片描述
在这里插入图片描述
55.
在这里插入图片描述
56.
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
58.
在这里插入图片描述
59.
下面这两个x的shape是一样的
在这里插入图片描述

在这里插入图片描述
60.

在这里插入图片描述

在这里插入图片描述
61.
WMSA和SWMSA所使用的窗口的大小
在这里插入图片描述

第一个全连接层将channel翻多少倍
在这里插入图片描述
63.

在这里插入图片描述
64.

在这里插入图片描述
65.
每一个swin-transformer阶段中使用的,但它是从0慢慢增长到下面设置的数值
在这里插入图片描述
在这里插入图片描述
66.
在这里插入图片描述

在这里插入图片描述
68.

在这里插入图片描述
69.

在这里插入图片描述
70.

在这里插入图片描述

官方pad函数
在这里插入图片描述
72.
在这里插入图片描述

在这里插入图片描述
74.
在这里插入图片描述
75.
在这里插入图片描述
76.
在这里插入图片描述
77.
在这里插入图片描述
78.
在这里插入图片描述
79.
在这里插入图片描述
80.
在这里插入图片描述
81.
在这里插入图片描述
82.
在这里插入图片描述
83.
在这里插入图片描述
84.
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
移动的大小=窗口大小除以2,然后向下取整
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
87.
在这里插入图片描述
88.

在这里插入图片描述
89.
在这里插入图片描述
90.

无论是wmsa和swmsa,单独的它们都不会改变特征矩阵的尺寸
在这里插入图片描述

mask放在这个位置解决了多尺度训练的问题

在这里插入图片描述
92.

在这里插入图片描述
93.
运行完一个stage中的所有wmsa和swmsa
在这里插入图片描述
94.
在这里插入图片描述
95.
在这里插入图片描述

下面代码运行的最终结果如下所示
在这里插入图片描述

在这里插入图片描述
97.

在这里插入图片描述
98.
在这里插入图片描述

在这里插入图片描述
99.

在这里插入图片描述
100.

在这里插入图片描述
101.

在这里插入图片描述

在这里插入图片描述

下面两个函数属于互为逆过程
在这里插入图片描述

在这里插入图片描述
104.

在这里插入图片描述
105.
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
108.
在这里插入图片描述
109.
在这里插入图片描述
110.
在这里插入图片描述
111.

在这里插入图片描述
112.
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
115.
互为逆过程
在这里插入图片描述
在这里插入图片描述
116.

Transformer代码的主要结构是由Encoder、Decoder和Projection三个部分组成的。在构造函数中,定义了这三个模块,并且指定了解码层的输出维度大小。在forward函数中,接受编码输入enc_inputs和解码输入dec_inputs,并通过Encoder对enc_inputs进行编码,然后将编码结果和解码输入传递给Decoder进行解码。最后,将解码结果通过Projection进行线性变换,得到最终的输出。 具体的代码实现如下所示: ``` import torch import torch.nn as nn class Transformer(nn.Module): def __init__(self, d_model, tgt_vocab_size): super(Transformer, self).__init__() self.encoder = Encoder() # 编码层 self.decoder = Decoder() # 解码层 self.projection = nn.Linear(d_model, tgt_vocab_size, bias=False) # 输出层 def forward(self, enc_inputs, dec_inputs): enc_outputs = self.encoder(enc_inputs) # 编码 dec_outputs = self.decoder(dec_inputs, enc_outputs) # 解码 outputs = self.projection(dec_outputs) # 输出 return outputs ``` 其中,Encoder和DecoderTransformer代码中的两个关键模块。Encoder负责将输入序列进行编码,而Decoder则负责根据编码结果进行解码。 请注意,以上代码只是一个伪代码示例,具体的实现可能会有一些变化,例如具体的编码和解码操作的实现方式可能会有所不同,这取决于具体的Transformer模型的设计和要解决的任务。 这段引用描述了Transformer中的编码器层和编码输入的处理方式。 这段引用描述了Transformer类的定义和forward函数的实现。 这段引用描述了代码中的一个转置操作,用于变换维度。 以上是对Transformer代码的简要说明,具体的实现细节可以参考完整的代码实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值