Pytorch注意力机制下的向量相加

一、期望

        软性注意力机制(Soft Attention Mechanism)是一种常见的注意力机制。假设输入N个向量,输出为1个向量,那么软性注意力机制的核心思想是设计一个打分函数s,用于计算输入的每一个向量的分数,然后通过softmax计算公式求得每个向量的权重,最终运用向量线性相加的方式得到最终的1个向量。如下图所示:

        实际上打分函数s还要输入一个查询向量q,但是这个q是根据具体任务来指定的,因此上图中我没有标注出q向量。

        假设有N个向量,每个向量的注意力权重也有对应N个,注意力机制下的向量相加可描述为

         假如没有注意力,那么注意力权重都相等,且为1/N,计算方式如下:

二、实现

        注意力机制下

import torch

# 设置打印偏好
torch.set_printoptions(linewidth=1024, precision=2)

# 注意力权重
w = torch.tensor([[0.0, 0.0, 0.0, 1.0],
                  [0.0, 0.0, 0.5, 0.5]])

# 4个输入向量,batch size为2
x = torch.tensor([[[0.1, 0.1, 0.2], [0.8, 0.8, 0.8], [0.0, 0.0, 0.0], [0.8, 0.8, 1.0]],
                  [[0.2, 0.2, 0.6], [0.0, 0.0, 0.6], [0.5, 0.5, 0.5], [1.0, 1.0, 0.6]]])

# 4个向量根据权重线性相加
rw = w.reshape(w.shape[0], w.shape[1], 1)
a = (rw * x).sum(dim=1)

# 打印
print(w)
print(x)
print(a)

        输出

tensor([[0.00, 0.00, 0.00, 1.00],
            [0.00, 0.00, 0.50, 0.50]])


tensor([[[0.10, 0.10, 0.20],
             [0.80, 0.80, 0.80],
             [0.00, 0.00, 0.00],
             [0.80, 0.80, 1.00]],

            [[0.20, 0.20, 0.60],
             [0.00, 0.00, 0.60],
             [0.50, 0.50, 0.50],
             [1.00, 1.00, 0.60]]])


tensor([[0.80, 0.80, 1.00],
            [0.75, 0.75, 0.55]])

        无注意力的情况下

import torch

# 设置打印偏好
torch.set_printoptions(linewidth=1024, precision=2)

# 4输入向量,batch size为2
x = torch.tensor([[[0.1, 0.1, 0.2], [0.8, 0.8, 0.8], [0.0, 0.0, 0.0], [0.8, 0.8, 1.0]],
                  [[0.2, 0.2, 0.6], [0.0, 0.0, 0.6], [0.5, 0.5, 0.5], [1.0, 1.0, 0.6]]])

# 计算最终的输出向量
a = (x.sum(dim=1) / x.shape[1]).unsqueeze(1)

# 打印
print(x)
print(a)

        输出

tensor([[[0.10, 0.10, 0.20],
             [0.80, 0.80, 0.80],
             [0.00, 0.00, 0.00],
             [0.80, 0.80, 1.00]],

            [[0.20, 0.20, 0.60],
             [0.00, 0.00, 0.60],
             [0.50, 0.50, 0.50],
             [1.00, 1.00, 0.60]]])


tensor([[[0.43, 0.43, 0.50]],

            [[0.43, 0.43, 0.58]]])

三、参考

        神经网络与深度学习,邱锡鹏,机械工业出版社,199-203

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
通道注意力机制(channel attention)是一种用于特征图中通道维度上的注意力机制,它可以帮助模型在不同通道之间分配不同的权重,以提高特征图的表达能力。以下是通道注意力机制PyTorch实现: ```python import torch import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, in_planes, reduction_ratio=16): super(ChannelAttention, self).__init__() # 定义两个全局池化层,分别对应平均池化和最大池化 self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) # 定义两个全连接层,用于降维和升维 self.fc1 = nn.Conv2d(in_planes, in_planes // reduction_ratio, 1, bias=False) self.relu = nn.ReLU(inplace=True) self.fc2 = nn.Conv2d(in_planes // reduction_ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu(self.fc1(self.max_pool(x)))) # 对两个全连接层的输出进行相加,并通过sigmoid函数进行归一化 out = self.sigmoid(avg_out + max_out) return out ``` 在代码中,我们首先定义了一个名为`ChannelAttention`的类,它继承自`nn.Module`。在初始化函数中,我们首先定义了两个全局池化层,分别对应平均池化和最大池化。然后定义了两个卷积层,分别用于降维和升维。在前向传播函数中,我们首先对输入张量进行全局平均池化和全局最大池化,然后将它们分别通过降维卷积层和激活函数,最后通过升维卷积层来得到两个特征向量。这两个特征向量相加,并通过sigmoid函数进行归一化,最终得到通道注意力系数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞机火车巴雷特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值