深度学习笔记--Transformer中position encoding的源码理解与实现
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) ;
则:torch.arange(0, channels, 2).float() * -(math.log(10000.0) / channels)
torch.exp(torch.arange(0, channels, 2).float() * -(math.log(10000.0) / channels));
②代码:pe[:, 0::2] = torch.sin(position * div_term) 和pe[:, 1::2] = torch.cos(position * div_term):
令:position = p,则position * div_term;
将k等价为2i,pe[:, 0::2]和pe[:, 1::2]分别取维度C的偶数列和奇数列,就可以得到上图绿框所示的公式。
3--参考
参考1
参考2
深度学习笔记--Transformer中position encoding的源码理解与实现相关推荐
- glibc-2.23学习笔记(一)—— malloc部分源码分析
glibc-2.23学习笔记(一)-- malloc部分源码分析 搭建Glibc源码调试环境 1.下载并解压glibc源码 2.配置gdb 3.编译测试程序 第一次调用 源码分析 __libc_mal ...
- glibc-2.23学习笔记(二)—— free部分源码分析
glibc-2.23学习笔记(二)-- free部分源码分析 _libc_free _int_free 函数定义 局部变量 start fast bins部分 unsorted bins部分 mmap ...
- 【机器学习】word2vec学习笔记(一):word2vec源码解析
0. word2vec地址 官网地址:https://code.google.com/archive/p/word2vec/ GitHub地址:https://github.com/tmikolov/ ...
- 【深度学习】transformer中softmax为什么要scaled
论文中解释是:向量的点积结果会很大,将softmax函数push到梯度很小的区域,scaled会缓解这种现象.怎么理解将sotfmax函数push到梯度很小区域?还有为什么scaled是维度的根号,不 ...
- 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv
搞明白了卷积网络中所谓deconv到底是个什么东西后,不写下来怕又忘记,根据参考资料,加上我自己的理解,记录在这篇博客里. 先来规范表达 为了方便理解,本文出现的举例情况都是2D矩阵卷积,卷积输入和核 ...
- [深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析
在当前的 NLP 领域,Transformer / BERT 已然成为基础应用,而 Self-Attention 则是两者的核心部分,下面尝试用 Q&A 和源码的形式深入 Self-Atte ...
- 基于深度学习的自动车牌识别(详细步骤+源码)
点击下方卡片,关注" OpenCV与AI深度学习"公众号! 视觉/图像重磅干货,第一时间送达! 来源 | Learn OpenCV 作者 | Sanyam 翻译 | OpenCV与 ...
- 【机器学习】word2vec学习笔记(三):word2vec源码注释
1. word2vec地址 官网地址:https://code.google.com/archive/p/word2vec/ GitHub地址:https://github.com/tmikolov/ ...
- 【OFDM通信】基于matlab深度学习OFDM系统信号检测【含Matlab源码 2023期】
⛄一.深度学习OFDM系统信号检测简介 1 OFDM系统模型 OFDM系统是一种常用的多载波调制方式, 因为其具有能够在带宽较窄的情况下传输大量数据.能够对抗频率选择性衰落.传输速率高.实现简单.信道 ...
最新文章
- Android中使用getDrawable时提示:Call requires API level 21(current min is 15)
- 如何让gridview中的checkbox根据数据库情况默认选中?
- 程序员求职面试三部曲之一:选择合适的工作单位
- 38 MM配置-采购-采购订单-采购订单审批-定义采购订单审批过程
- Java byte类型转换成int类型时需要 0XFF的原因
- 计算机教室电气设计规范,车库电气设计规范.docx
- html5语义化标签标记定义导航,gogo娱乐-官方网站
- oracle 结果百分比,Oracle 百分比
- 破解蛋白质结构秘密的AlphaFold
- Zabbix学习笔记(七)---网络波动监控
- react 在JXL中嵌入JS表达式
- 视频产生的本质及色彩空间:RGB 和 YUV
- Postman发送带cookie的http请求
- Storm部署与运行
- VS2017+openCV3.4.6+openCV3.4.6 contrib扩展模块安装
- wxpython之入门
- VmatrixOJ--IP and QQ
- python人脸识别门禁系统_智能人脸识别门禁系统
- npm 卡住 type-fest@^0.20.2 问题解决
- The producer service state not OK, CREATE_JUST