1--源码

import torch
import math
import numpy as np
import torch.nn as nnclass Pos_Embed(nn.Module):def __init__(self, channels, num_frames, num_joints):super().__init__()# 根据帧序和节点序生成位置向量pos_list = [] for tk in range(num_frames):for st in range(num_joints):pos_list.append(st)position = torch.from_numpy(np.array(pos_list)).unsqueeze(1).float()  # num_frames*num_joints, 1pe = torch.zeros(num_frames * num_joints, channels)  # T*N, Cdiv_term = torch.exp(torch.arange(0, channels, 2).float() * -(math.log(10000.0) / channels))pe[:, 0::2] = torch.sin(position * div_term)  # 偶数列 # 偶数C维度sinpe[:, 1::2] = torch.cos(position * div_term)  # 奇数列 # 奇数C维度cospe = pe.view(num_frames, num_joints, channels).permute(2, 0, 1).unsqueeze(0)  # T N C -> C T N -> 1 C T Nself.register_buffer('pe', pe)def forward(self, x):  # nctv # BCTNx = self.pe[:, :, :x.size(2)]return xif __name__ == "__main__":B = 2C = 4T = 120N = 25x = torch.rand((B, C, T, N))Pos_embed_1 = Pos_Embed(C, T, N)PE = Pos_embed_1(x)# print(PE.shape) # 1 C T Nx = x + PEprint("All Done !")

2--源码分析与理解

原理理解:Positional Encoding(位置编码)

推荐视频:位置编码

代码解释:

①代码 div_term = torch.exp(torch.arange(0, channels, 2).float() * -(math.log(10000.0) / channels)):

令:channels = C, torch.arange(0, channels, 2).float() = k(则k = 0, 2, ..., C-2);

-(math.log(10000.0) / channels)  \large {\color{Red} =\frac{-\log_{e}1000}{C}}

则:torch.arange(0, channels, 2).float() * -(math.log(10000.0) / channels)\large {\color{Red} =\frac{-k\log_{e}10000}{C}}

torch.exp(torch.arange(0, channels, 2).float() * -(math.log(10000.0) / channels))\LARGE {\color{Red} =e^{\frac{-k\log_{e}10000}{C}} = e^{\log_{e}\frac{-10000k}{C}} = \frac{-10000k}{C}};

②代码:pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term):

令:position = p,则position * div_term\large {\color{Red} =p*\frac{-10000k}{C}=\frac{p}{10000^{\frac{k}{c}}}};

k等价为2ipe[:, 0::2]pe[:, 1::2]分别取维度C的偶数列和奇数列,就可以得到上图绿框所示的公式。

3--参考

参考1

参考2

深度学习笔记--Transformer中position encoding的源码理解与实现相关推荐

  1. glibc-2.23学习笔记(一)—— malloc部分源码分析

    glibc-2.23学习笔记(一)-- malloc部分源码分析 搭建Glibc源码调试环境 1.下载并解压glibc源码 2.配置gdb 3.编译测试程序 第一次调用 源码分析 __libc_mal ...

  2. glibc-2.23学习笔记(二)—— free部分源码分析

    glibc-2.23学习笔记(二)-- free部分源码分析 _libc_free _int_free 函数定义 局部变量 start fast bins部分 unsorted bins部分 mmap ...

  3. 【机器学习】word2vec学习笔记(一):word2vec源码解析

    0. word2vec地址 官网地址:https://code.google.com/archive/p/word2vec/ GitHub地址:https://github.com/tmikolov/ ...

  4. 【深度学习】transformer中softmax为什么要scaled

    论文中解释是:向量的点积结果会很大,将softmax函数push到梯度很小的区域,scaled会缓解这种现象.怎么理解将sotfmax函数push到梯度很小区域?还有为什么scaled是维度的根号,不 ...

  5. 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv

    搞明白了卷积网络中所谓deconv到底是个什么东西后,不写下来怕又忘记,根据参考资料,加上我自己的理解,记录在这篇博客里. 先来规范表达 为了方便理解,本文出现的举例情况都是2D矩阵卷积,卷积输入和核 ...

  6. [深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析

    在当前的 NLP 领域,Transformer / BERT 已然成为基础应用,而 Self-Attention  则是两者的核心部分,下面尝试用 Q&A 和源码的形式深入 Self-Atte ...

  7. 基于深度学习的自动车牌识别(详细步骤+源码)

    点击下方卡片,关注" OpenCV与AI深度学习"公众号! 视觉/图像重磅干货,第一时间送达! 来源 | Learn OpenCV 作者 | Sanyam 翻译 | OpenCV与 ...

  8. 【机器学习】word2vec学习笔记(三):word2vec源码注释

    1. word2vec地址 官网地址:https://code.google.com/archive/p/word2vec/ GitHub地址:https://github.com/tmikolov/ ...

  9. 【OFDM通信】基于matlab深度学习OFDM系统信号检测【含Matlab源码 2023期】

    ⛄一.深度学习OFDM系统信号检测简介 1 OFDM系统模型 OFDM系统是一种常用的多载波调制方式, 因为其具有能够在带宽较窄的情况下传输大量数据.能够对抗频率选择性衰落.传输速率高.实现简单.信道 ...

最新文章

  1. Android中使用getDrawable时提示:Call requires API level 21(current min is 15)
  2. 如何让gridview中的checkbox根据数据库情况默认选中?
  3. 程序员求职面试三部曲之一:选择合适的工作单位
  4. 38 MM配置-采购-采购订单-采购订单审批-定义采购订单审批过程
  5. Java byte类型转换成int类型时需要 0XFF的原因
  6. 计算机教室电气设计规范,车库电气设计规范.docx
  7. html5语义化标签标记定义导航,gogo娱乐-官方网站
  8. oracle 结果百分比,Oracle 百分比
  9. 破解蛋白质结构秘密的AlphaFold
  10. Zabbix学习笔记(七)---网络波动监控
  11. react 在JXL中嵌入JS表达式
  12. 视频产生的本质及色彩空间:RGB 和 YUV
  13. Postman发送带cookie的http请求
  14. Storm部署与运行
  15. VS2017+openCV3.4.6+openCV3.4.6 contrib扩展模块安装
  16. wxpython之入门
  17. VmatrixOJ--IP and QQ
  18. python人脸识别门禁系统_智能人脸识别门禁系统
  19. npm 卡住 type-fest@^0.20.2 问题解决
  20. The producer service state not OK, CREATE_JUST

热门文章

  1. 知乎高赞 | 有哪些对职业生涯帮助巨大的工作习惯?
  2. 学习Python与数据库--python与MySQL的交互
  3. 【LOJ】#3103. 「JSOI2019」节日庆典
  4. matlab 麻将,麻将AI开发计划正式启动!
  5. 计量经济学及Stata应用 陈强 第十章工具变量法习题10.5
  6. 在一个软件开发项目中进行实际日程安排的十二点提示
  7. 奥林巴斯FV31S激光扫描显微镜软件下载地址
  8. Matlab:设置figure中英文不同字体
  9. 关于CRMEB 商城系统商业授权的那些事儿
  10. Jetson Xavier gpio编程 (8)