torch.bmm()函数详解

该代码定义了一个名为PAM_Module的神经网络模块,用于处理输入特征映射。它包含查询、键和值的卷积层,通过矩阵乘法计算注意力权重,并使用softmax函数归一化。最后,将注意力加权值与输入特征相加得到输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去掉batch_size这一维度,按照矩阵乘法运算即可

自行体会

class PAM_Module(nn.Module):
    """ Position attention module"""
    def __init__(self, in_dim) -> None:
        super().__init__()
        self.channel_in = in_dim
        
        self.query_conv = Conv2d(in_dim, in_dim // 8, kernel_size=1)
        self.key_conv = Conv2d(in_dim, in_dim//8, kernel_size=1)
        self.value_conv = Conv2d(in_dim, in_dim, kernel_size=1)
        
        self.gamma = Parameter(torch.zeros(1))
        
        self.softmax = Softmax(dim = -1)
        
    def forward(self, x):
        """
            inputs :
                x : input feature maps( B X C X H X W)
            returns :
                out : attention value + input feature
                attention: B X (HxW) X (HxW)
        """
        ## B C H W
        m_batchsize, C, height, width = x.size()
        ## B C H W --> B C HW --> B HW C
        proj_query = self.query_conv(x).view(m_batchsize, -1, height*width).permute(0, 2, 1)
        ## B C HW
        proj_key = self.key_conv(x).view(m_batchsize, -1, height*width)
        ## B HW HW
        energy = torch.bmm(proj_query, proj_key)
        attention = self.softmax(energy)
        ## B C HW 
        proj_value = self.value_conv(x).view(m_batchsize, -1, height*width)
        
        ## bmm(B C HW, B HW HW) --> B C HW
        out = torch.bmm(proj_value, attention.permute(0, 2, 1))
        ## B C H W
        out = out.view(m_batchsize, C, height, width)
        ## B C H W
        out = self.gamma*out + x
        
        return out
### Word2Vec 工作原理与实现详解 #### 1. 核心思想 Word2Vec 的核心思想在于利用上下文关系来捕捉词语的语义信息。具体来说,它假设如果两个词具有相似的上下文,则这两个词可能具有相似的意义[^2]。 #### 2. 训练目标 Word2Vec 的主要目的是将每一个单词映射到一个高维向量空间中的固定维度向量(通常称为嵌入向量)。这些向量可以通过计算余弦相似度或其他距离指标来衡量词语间的语义关联程度。 #### 3. 实现方式 Word2Vec 提供了两种不同的模型架构用于生成词向量:连续袋模型 (Continuous Bag of Words, CBOW) 和跳字模型 (Skip-Gram)[^4]。 ##### (1)CBOW 模型 在 CBOW 中,输入是一组给定的目标词周围的上下文词,输出是一个预测的目标词。该模型试图根据多个上下文词来估计中心词的概率分布。其损失函数旨在最小化错误预测的可能性,从而优化权重矩阵以获得更好的词向量表示。 以下是简单的 Python 实现示例: ```python import torch import torch.nn as nn import torch.optim as optim class CBOW(nn.Module): def __init__(self, vocab_size, embedding_dim, context_size): super(CBOW, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.linear1 = nn.Linear(context_size * embedding_dim, 128) self.linear2 = nn.Linear(128, vocab_size) def forward(self, inputs): embeds = self.embeddings(inputs).view((1, -1)) out = torch.relu(self.linear1(embeds)) out = self.linear2(out) log_probs = torch.log_softmax(out, dim=1) return log_probs ``` ##### (2)Skip-Gram 模型 相比之下,Skip-Gram 是一种逆过程——它的输入是单个目标词,而输出则是围绕此目标词的一系列上下文词。这种方法更适合于稀疏数据集的情况,在这种情况下某些高频次可能会掩盖掉低频次的重要性[^3]。 下面展示了一个 Skip-Gram 的简化版本代码片段: ```python class SkipGram(nn.Module): def __init__(self, vocab_size, embedding_dim): super(SkipGram, self).__init__() self.u_embeddings = nn.Embedding(vocab_size, embedding_dim, sparse=True) self.v_embeddings = nn.Embedding(vocab_size, embedding_dim, sparse=True) def forward(self, pos_u, pos_v, neg_v): emb_pos_u = self.u_embeddings(pos_u) emb_pos_v = self.v_embeddings(pos_v) emb_neg_v = self.v_embeddings(neg_v) score = torch.sum(torch.mul(emb_pos_u, emb_pos_v), dim=1) score = torch.clamp(score, max=10, min=-10) score = -F.logsigmoid(score) neg_score = torch.bmm(emb_neg_v, emb_pos_u.unsqueeze(2)).squeeze() neg_score = torch.clamp(neg_score, max=10, min=-10) neg_score = -torch.sum(F.logsigmoid(-neg_score), dim=1) return torch.mean(score + neg_score) ``` #### 4. 处理低频词的方法 对于那些出现频率较低的词汇,传统方法往往难以有效建模因为缺乏足够的样本支持训练良好的表征。然而,Word2Vec 可通过设置阈值丢弃极少见的术语或者调整采样率减少噪声干扰等方式缓解这一难题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值