image中的transformer操作

首先可以通过很多个conv,将imag弄成feature map:(N, C, H, W),然后reshape + transpose弄成(N, H*W, C)

此后需要构建Q, K, V矩阵,其实就是nn.Linear层:

nn.Linear(C, C)

通过全连接层之后实现channel之间的信息传递,得到三个矩阵:
q ( x ) : ( N , H ∗ W , C ) , k ( x ) : ( N , H ∗ W , C ) , v ( x ) : ( N , H ∗ W , C ) 。 q(x): (N, H*W, C), k(x): (N, H*W, C), v(x): (N, H*W, C)。 q(x):(N,HW,C),k(x):(N,HW,C),v(x):(N,HW,C)

对于multi-head,将 q ( x ) , k ( x ) , v ( x ) q(x), k(x), v(x) q(x),k(x),v(x)分别进行reshape:
q ′ ( x ) : ( N , H ∗ W , n u m _ h e a d s , s i z e _ p e r _ h e a d ) q'(x): (N, H*W, num\_heads, size\_per\_head) q(x):(N,HW,num_heads,size_per_head)
k ′ ( x ) : ( N , H ∗ W , n u m _ h e a d s , s i z e _ p e r _ h e a d ) k'(x): (N, H*W, num\_heads, size\_per\_head) k(x):(N,HW,num_heads,size_per_head)
v ′ ( x ) : ( N , H ∗ W , n u m _ h e a d s , s i z e _ p e r _ h e a d ) v'(x): (N, H*W, num\_heads, size\_per\_head) v(x):(N,HW,num_heads,size_per_head)

进行(0, 2, 1, 3)的transpose:
q ′ ′ ( x ) : ( N , n u m _ h e a d s , H ∗ W , s i z e _ p e r _ h e a d ) q''(x): (N, num\_heads, H*W, size\_per\_head) q(x):(N,num_heads,HW,size_per_head)
k ′ ′ ( x ) : ( N , n u m _ h e a d s , H ∗ W , s i z e _ p e r _ h e a d ) k''(x): (N, num\_heads, H*W, size\_per\_head) k(x):(N,num_heads,HW,size_per_head)
v ′ ′ ( x ) : ( N , n u m _ h e a d s , H ∗ W , s i z e _ p e r _ h e a d ) v''(x): (N, num\_heads, H*W, size\_per\_head) v(x):(N,num_heads,HW,size_per_head)

然后在每个head上进行q(x)*k(x).transpose(-1, -2)*v(x)
( N , n u m _ h e a d s , H ∗ W , H ∗ W ) (N, num\_heads, H*W, H*W) (N,num_heads,HW,HW)$。

每个feature map上的attention score得size为(H*W, H*W), 然后除以 s i z e _ p e r _ h e a d size\_per\_head size_per_head

再用attention_score(N, num_heads, H*W, H*W)乘以v(x) (N, num_heads, H*W, size_per_head)。得到的结果为: (N, num_heads, H*W, size_per_head)

相当于在H*W上进行attention。

最后还原: (N, H*W, num_heads, size_per_head)-> (N, H*W, C)

attention完成之后进行还原,直接transpose然后reshape成(N, C, H, W)
实现multi-head attention时不是循环的计算每个头,而是通过 transposes and reshapes,用矩阵乘法来完成的。

In practice, the multi-headed attention are done with transposes and reshapes rather than actual separate tensors. 

hidden_size (d) = num_attention_heads (m) * attention_head_size (a)
也即 d=m*a
并将 num_attention_heads 维度transpose到前面,使得Q和K的维度都是(m,n,a)。这样点积可以看作大小为(m,n,a)和(m,a,n)的两个张量相乘,得到一个(m,n,n)的矩阵,其实就相当于(n,a)和(a,n)的两个矩阵相乘,做了m次。

transformer中multi-head attention中每个head为什么要进行降维

timm实现的代码如下:

class Attention(nn.Module):
    def __init__(self, dim, num_heads=8, qkv_bias=False, attn_drop=0., proj_drop=0.):
        super().__init__()
        self.num_heads = num_heads
        head_dim = dim // num_heads
        self.scale = head_dim ** -0.5

        self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)
        self.attn_drop = nn.Dropout(attn_drop)
        self.proj = nn.Linear(dim, dim)
        self.proj_drop = nn.Dropout(proj_drop)

    def forward(self, x):
        B, N, C = x.shape
        qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)
        q, k, v = qkv[0], qkv[1], qkv[2]   # make torchscript happy (cannot use tensor as tuple)

        attn = (q @ k.transpose(-2, -1)) * self.scale
        attn = attn.softmax(dim=-1)
        attn = self.attn_drop(attn)

        x = (attn @ v).transpose(1, 2).reshape(B, N, C)
        x = self.proj(x)
        x = self.proj_drop(x)
        return x

其中sequence lengthH*W,而hidden_sizechannel的数目。

image embedding实现:

class PatchEmbed(nn.Module):
    """ 2D Image to Patch Embedding
    """
    def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768, norm_layer=None, flatten=True):
        super().__init__()
        img_size = to_2tuple(img_size)
        patch_size = to_2tuple(patch_size)
        self.img_size = img_size
        self.patch_size = patch_size
        self.grid_size = (img_size[0] // patch_size[0], img_size[1] // patch_size[1])
        self.num_patches = self.grid_size[0] * self.grid_size[1]
        self.flatten = flatten

        self.proj = nn.Conv2d(in_chans, 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):
        B, C, H, W = x.shape
        assert H == self.img_size[0] and W == self.img_size[1], \
            f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})."
        x = self.proj(x)
        if self.flatten:
            x = x.flatten(2).transpose(1, 2)  # BCHW -> BNC
        x = self.norm(x)
        return x
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "图像去雾变换器与透射感知的3D位置嵌入"是一种用于图像去雾的算法模型。图像去雾是指通过降低或消除图像的雾霾、模糊和变暗等现象,使得图像更加清晰和真实。这个模型的主要思想是结合了图像去雾和传输感知技术,并加入了3D位置嵌入的方法。 首先,这个模型通过传输感知技术来估计图像的散射波分量和大气光照。传输感知是指通过分析图像的传输特性,来恢复出原始场景的方法。这个模型会分析图像的散射波分量和大气光照,从而能够更准确地进行去雾操作。 其次,模型还采用了3D位置嵌入的方法来提高去雾效果。3D位置嵌入是指将图像的像素点的位置信息加入到模型,从而能够更好地理解图像的深度和空间结构。通过引入3D位置嵌入,模型能够更好地处理图像的近红外图像和多层次场景,提高去雾效果的精度和稳定性。 总的来说,"图像去雾变换器与透射感知的3D位置嵌入"是一种应用传输感知和3D位置嵌入技术的图像去雾算法。它能够更准确地估计图像的散射波分量和大气光照,同时加入了3D位置嵌入的方法提高去雾效果。这个模型在图像去雾领域有着较好的应用前景,可以帮助提高图像的质量和真实感。 ### 回答2: image dehazing transformer with transmission-aware 3d position embedding是一种用于图像去雾的转换器模型,它利用传输感知的三维位置嵌入来改善图像的可见度。 这个模型主要包括两个关键部分:转换器和传输感知的三维位置嵌入。 转换器是一个神经网络模型,它能够学习图像去雾的特征表示。通过对输入图像进行编码和解码,转换器能够自动地从雾化图像提取出有用的信息。它通过多层自注意机制来捕捉图像不同区域的关联性,并通过残差连接来保留原始图像的细节。 传输感知的三维位置嵌入是指将每个像素点的位置信息嵌入到模型,以更好地理解图像的深度和空间关系。这种嵌入技术可以帮助模型更准确地分析图像光线的传输过程,从而改善图像去雾的效果。 通过将转换器和传输感知的三维位置嵌入相结合,该模型可以更好地理解图像的物体位置、深度和光线传输情况,并根据这些信息进行有效的图像去雾处理。它能够减少雾化图像的噪声和模糊,并提高图像的细节和清晰度。 总之,image dehazing transformer with transmission-aware 3d position embedding是一种结合了转换器和传输感知的三维位置嵌入的模型,用于改善图像去雾效果。它能够有效地提升图像的细节和可见度,为图像处理领域带来了新的突破。 ### 回答3: image dehazing transformer with transmission-aware 3d position embedding是一种用于图像去雾的转换模型,它结合了传输感知的3D位置嵌入技术。 去雾是指通过处理雾霾造成的图像模糊和对比度不足,使图像恢复清晰和细节丰富。传统的去雾方法通常使用图像处理技术,如滤波和增强对比度等,但效果可能有限。 image dehazing transformer with transmission-aware 3d position embedding利用了transformer模型,这是一种基于自注意力机制的神经网络模型。通过自注意力机制,模型能够学习全局和局部的图像特征。同时,模型还引入了传输感知的3D位置嵌入技术。 传输感知的3D位置嵌入技术可以捕捉到雾霾图像物体的深度和位置信息。通过将这些信息与图像特征融合,模型能够更准确地理解图像不同物体的投射和透射过程,从而更好地去除雾霾。这种技术可以提高模型对场景深度的感知和图像恢复的精度。 综上所述,image dehazing transformer with transmission-aware 3d position embedding是一种结合了transformer模型和传输感知的3D位置嵌入技术的图像去雾方法。它能够通过学习全局和局部的图像特征,并结合深度和位置信息,更准确地去除雾霾,恢复清晰的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值