Swin Transformer

目录

1.  Patch Partition  & Patch Embedding 

1.1 Patch Partition

2. State

2.1 Patch Merging

3. Transformer Block

3.1 window 

3.2 Cyclic-shift


1.  Patch Partition  & Patch Embedding 

1.1 Patch Partition

        首先将输入的图像 [H,W,3] ,切割成patches ,每个Patch大小是[4,4,3],比如一张[3,224,224]大小的图像,会被分成 224/4 * 224/4 = 3136个patch 。这样图像的维度变成 [224/4,224/4,4*4*3] 即[56,56,48]。

1.2 Linear Embedding 

        Linear Embedding 将特征维度从48映射到C(=96) 。

class PatchEmbed(nn.Module) :
    """
    将image split into no-overlapping patch
    """
    def __init__(self,patch_size=4,in_c=3,embed_dim=96,norm_layer=None) :
        super(PatchEmbed,self).__init__()
        patch_size = (patch_size ,patch_size)
        self.patch_size = patch_size
        self.in_chans = in_c
        self.embed_dim = embed_dim
        self.proj = nn.Conv2d(in_c,embed_dim,kernel_size=patch_size,stride=patch_size)
        self.norm = norm_layer(embed_dim) if norm_layer else nn.Identity()


    def forward(self,x) :
        _,_,H,W = x.shape
        pad_input = (H % self.patch_size[0] !=0 ) or (W % self.patch_size[1] !=0)

        if pad_input :
            # 需要 padding
            x = F.pad(x, (0, self.patch_size[1] - W % self.patch_size[1],  # 表示宽度方向右侧填充数
                          0, self.patch_size[0] - H % self.patch_size[0],  # 表示高度方向底部填充数
                          0, 0))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值