当前位置: 首页 > news >正文

自己建网站做外贸网站底部导航

自己建网站做外贸,网站底部导航,免费的黄冈网站代码,网站索引量下降Pytorch手撸Attention 注释写的很详细了#xff0c;对照着公式比较下更好理解#xff0c;可以参考一下知乎的文章 注意力机制 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size):super(S…Pytorch手撸Attention 注释写的很详细了对照着公式比较下更好理解可以参考一下知乎的文章 注意力机制 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size):super(SelfAttention, self).__init__()self.embed_size embed_size# 定义三个全连接层用于生成查询Q、键K和值V# 用Linear线性层让q、k、y能更好的拟合实际需求self.value nn.Linear(embed_size, embed_size)self.key nn.Linear(embed_size, embed_size)self.query nn.Linear(embed_size, embed_size)def forward(self, x):# x 的形状应为 (batch_size批次数量, seq_len序列长度, embed_size嵌入维度)batch_size, seq_len, embed_size x.shapeQ self.query(x)K self.key(x)V self.value(x)# 计算注意力分数矩阵# 使用 Q 矩阵乘以 K 矩阵的转置来得到原始注意力分数# 注意力分数的形状为 [batch_size, seq_len, seq_len]# K.transpose(1,2)转置后[batch_size, embed_size, seq_len]# 为什么不直接使用 .T 直接转置直接转置就成了[embed_size, seq_len,batch_size]不方便后续进行矩阵乘法attention_scores torch.matmul(Q, K.transpose(1, 2)) / torch.sqrt(torch.tensor(self.embed_size, dtypetorch.float32))# 应用 softmax 获取归一化的注意力权重dim-1表示基于最后一个维度做softmaxattention_weight F.softmax(attention_scores, dim-1)# 应用注意力权重到 V 矩阵得到加权和# 输出的形状为 [batch_size, seq_len, embed_size]output torch.matmul(attention_weight, V)return output多头注意力机制 class MultiHeadAttention(nn.Module):def __init__(self, embed_size, num_heads):super().__init__()self.embed_size embed_sizeself.num_heads num_heads# 整除来确定每个头的维度self.head_dim embed_size // num_heads# 加入断言防止head_dim是小数必须保证可以整除assert self.head_dim * num_heads embed_sizeself.q nn.Linear(embed_size, embed_size)self.k nn.Linear(embed_size, embed_size)self.v nn.Linear(embed_size, embed_size)self.out nn.Linear(embed_size, embed_size)def forward(self, query, key, value):# N就是batch_size的数量N query.shape[0]# *_len是序列长度q_len query.shape[1]k_len key.shape[1]v_len value.shape[1]# 通过线性变换让矩阵更好的拟合queries self.q(query)keys self.k(key)values self.v(value)# 重新构建多头的queries,permute调整tensor的维度顺序# 结合下文demo进行理解queries queries.reshape(N, q_len, self.num_heads, self.head_dim).permute(0, 2, 1, 3)keys keys.reshape(N, k_len, self.num_heads, self.head_dim).permute(0, 2, 1, 3)values values.reshape(N, v_len, self.num_heads, self.head_dim).permute(0, 2, 1, 3)# 计算多头注意力分数attention_scores torch.matmul(queries, keys.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtypetorch.float32))attention F.softmax(attention_scores, dim-1)# 整合多头注意力机制的计算结果out torch.matmul(attention, values).permute(0, 2, 1, 3).reshape(N, q_len, self.embed_size)# 过一遍线性函数out self.out(out)return outdemo测试 self-attention测试 # 测试自注意力机制 batch_size 2 seq_len 3 embed_size 4# 生成一个随机数据 tensor input_tensor torch.rand(batch_size, seq_len, embed_size)# 创建自注意力模型实例 model SelfAttention(embed_size)# print输入数据 print(输入数据 [batch_size, seq_len, embed_size]:) print(input_tensor)# 运行自注意力模型 output_tensor model(input_tensor)# print输出数据 print(输出数据 [batch_size, seq_len, embed_size]:) print(output_tensor)print 输入数据 [batch_size, seq_len, embed_size]: tensor([[[0.7579, 0.7342, 0.1031, 0.8610],[0.8250, 0.0362, 0.8953, 0.1687],[0.8254, 0.8506, 0.9826, 0.0440]],[[0.0700, 0.4503, 0.1597, 0.6681],[0.8587, 0.4884, 0.4604, 0.2724],[0.5490, 0.7795, 0.7391, 0.9113]]])输出数据 [batch_size, seq_len, embed_size]: tensor([[[-0.3714, 0.6405, -0.0865, -0.0659],[-0.3748, 0.6389, -0.0861, -0.0706],[-0.3694, 0.6388, -0.0855, -0.0660]],[[-0.2365, 0.4541, -0.1811, -0.0354],[-0.2338, 0.4455, -0.1871, -0.0370],[-0.2332, 0.4458, -0.1867, -0.0363]]], grad_fnUnsafeViewBackward0)MultiHeadAttention 多头注意力机制务必自己debug一下主要聚焦在理解如何拆分成多头的不结合代码你很难理解多头的操作过程 1、queries.reshape(N, q_len, self.num_heads, self.head_dim).permute(0, 2, 1, 3) 处理之后的 size torch.Size([64, 8, 10, 16]) 通过上述操作queries 张量的最终形状变为 [N, self.num_heads, q_len, self.head_dim]。这样的排列方式使得每个注意力头可以单独处理对应的序列部分而每个头的处理仅关注其分配到的特定维度 self.head_dim这个形状是为了后续的矩阵乘法操作准备的其中每个头的查询将与对应的键进行点乘以计算注意力分数 2、attention_scores torch.matmul(queries, keys.transpose(-2, -1)) / torch.sqrt( torch.tensor(self.head_dim, dtypetorch.float32)) 将reshape后的quries的后两个维度进行转置后点乘对应了 Q ⋅ K T Q \cdot K^T Q⋅KT 根据demo这里的头数为8所以公式中对应的下标 i i i 为8 3、在进行完多头注意力机制的计算后通过 torch.matmul(attention, values).permute(0, 2, 1, 3).reshape(N, q_len, self.embed_size) 整合变回原来的 [batch_size,seq_length,embed_size]形状 # 测试多头注意力 embed_size 128 # 嵌入维度 num_heads 8 # 头数 attention MultiHeadAttention(embed_size, num_heads)# 创建随机数据模拟 [batch_size, seq_length, embedding_dim] batch_size 64 seq_length 10 dummy_values torch.rand(batch_size, seq_length, embed_size) dummy_keys torch.rand(batch_size, seq_length, embed_size) dummy_queries torch.rand(batch_size, seq_length, embed_size)# 计算多头注意力输出 output attention(dummy_values, dummy_keys, dummy_queries) print(output.shape) # [batch_size, seq_length, embed_size]print torch.Size([64, 10, 128])如果你难以理解权重矩阵的拼接和拆分推荐李宏毅的attention课程YouTobe
http://www.dnsts.com.cn/news/109325.html

相关文章:

  • 教育类网站框架软件开发文档是什么
  • 赣州网站推广哪家最专业便宜正品的购物app
  • 阜阳专业网站建设整合营销的案例
  • 上海专业网站制作设计公司企业网站开发方案
  • 现在建设一个网站需要什么技术台式机做网站服务器
  • 什么网站可以做产品入驻阿里主机wordpress
  • 湖北app定制开发东莞seo站内优化
  • 苏州外贸营销网站建设网站查询功能代码
  • 最好免费高清视频在线观看陕西网站建设方案优化
  • cms网站搭建好了再怎么做成都哪里做网站备案
  • 设计公司网站建设文案品牌网站建设市场分析
  • 莱阳网站开发仿cnzz 网站 源码
  • 天津建站方案百度网盘下载app
  • 网站开发与设计实训报告1000字装饰网站模版
  • 在线网站建设系统林州二建集团建设有限公司网站
  • 长泰建设局网站sogou网站提交
  • 网站左侧浮动代码网站建设工作流程
  • 五力合一营销型网站建设系统班级优化大师下载
  • 加强网站建设的建议查询公司信息去哪里查
  • 金融网站 源码wordpress部署
  • 中端网站建设要怎样建设网站
  • 做信息安全的网站鹿城做网站
  • 专用车网站建设多少钱东莞智通人才最新招聘网
  • 全景网站制作教程产品创意设计
  • 成都微信端网站建网站模板使用
  • 有没有做logo的网站wordpress后台打开慢
  • 做网站企业经营范围建设厅是做什么的
  • php商业网站制作网站开发工具评价
  • 做网站哪个软件好重庆工程公司有哪些
  • 网页建站实用技术二个字最旺财的公司名字