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

news2025/1/18 1:53:55

1--源码

import torch
import math
import numpy as np
import torch.nn as nn

class 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, 1

        pe = torch.zeros(num_frames * num_joints, channels)  # T*N, C

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

        pe[:, 0::2] = torch.sin(position * div_term)  # 偶数列 # 偶数C维度sin
        pe[:, 1::2] = torch.cos(position * div_term)  # 奇数列 # 奇数C维度cos
        pe = pe.view(num_frames, num_joints, channels).permute(2, 0, 1).unsqueeze(0)  # T N C -> C T N -> 1 C T N
        self.register_buffer('pe', pe)

    def forward(self, x):  # nctv # BCTN
        x = self.pe[:, :, :x.size(2)]
        return x

if __name__ == "__main__":
    B = 2
    C = 4
    T = 120
    N = 25
    x = 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 N
    x = x + PE

    print("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]分别取行数列和奇数列,就可以得到上图绿框所示的公式。

3--参考

参考1

参考2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

感知机的认识和简单的实现

一、感知机perceptron 1.1 感知机的信号 只有0和1两种取值 1.2 神经元会计算传递过来的信号总和 只有当信号总和超过某个界限的时候,神经元才会被激活 1.3 信号权重 不同的权重对应的信号的重要性越高 二、常见的逻辑电路 与门与非门或门 2.1 思考 使用感…

@Scope与@RefreshScope注解

在SpringIOC中,我们熟知的BeanScope有单例(singleton)、原型(prototype), Bean的Scope影响了Bean的管理方式,例如创建Scopesingleton的Bean时,IOC会保存实例在一个Map中,…

nest.js创建以及error相关问题

开始之前,你可以使用 Nest CLI 创建项目,也可以克隆一个 starter project(两者的结果是一样的)。 若要使用 Nest CLI 构建项目,请运行以下命令。这将创建一个新的项目目录,并使用核心的 Nest 文件和支撑模…

我把 CPU 三级缓存的秘密,藏在这 8 张图里

本文已收录到 GitHub AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好,我是小彭。 在上一篇文章里,我们聊到了计算机存储器系统的金…

盘点机PDA搭配蓝牙便携打印机,条码标签打印,超市仓库条码管理,条码标签纸

null使用盘点机PDA,搭配蓝牙便携打印机,移动打印条码标签的操作和设置。对于商品本身没有条码的商品,比如:外购回来无条码的商品,工厂自己生产出来的成品,那么这种就需要打印商品条码进行粘贴,即…

Spring Security认证之登录表单配置

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。 自定义登录页面 文接上篇,这一篇学习如何自定义登录表单。我们创建一个Spring Boot项目之后,还是一样…

windows docker 及 k8s 环境搭建

docker 环境搭建 下载 docker 下载 docker for desktop, , 配置 镜像源 开通 kubenates 功能 注册一个 docker hub 账号 记住账号密码, 将来拉取镜像要用到, 在 docker for desktop 中登录该账号 kubenates 环境搭建 docker 中开通 k8…

nginx服务器

一、介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2…

用户管理系统(2)

2.实现添加功能:有两个和后端交互的接口 根据用户的身份显示登陆界面: 进行插入操作: 1)在我们的前端直接获取到用户名,密码,确认密码,年龄,QQ,邮箱,判断他们是否为空,检测密码和确认密码是否一…

docker 第二次学习笔记

一、dockers简介 docker官网:https://www.docker.com 1.1 docker定义 docker是一种容器化技术,用来更好的构建和发布应用。 二、docker安装 2.1 方法1 centos7.x系统的安装 官网安装步骤:https://docs.docker.com/engine/install/cento…

IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置

IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置 Maven 项目的创建 在IDEA 21版中,Maven项目无需下载其他版本,查看有无Maven,如果没有下载 安装 首先打开IDEA ,点…

​ 详解Linux内核通信-proc文件系统

使用 /proc 文件系统来访问 Linux 内核的内容,这个虚拟文件系统 在内核空间和用户空间之间打开了一个通信窗口: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信。在 /proc 文件系统中&…

MySQL事务和索引

✏️作者:银河罐头 📋系列专栏:MySQL 🌲“种一棵树最好的时间是十年前,其次是现在” 目录索引概念使用索引在MySQL中的数据结构事务概念mysql的隔离级别索引 概念 索引是一种特殊的文件,包含着对数据表里所…

一图看懂,阿里云飞天企业版如何支持政企数智创新

杭州,2022年11月5日 – 今日,在云栖大会专有云技术和应用实践论坛,阿里云重磅发布飞天企业版在建云、管云、用云方面的全面升级,并邀请行业专家、政企客户代表和合作伙伴面向未来十年共话新一代政企IT发展趋势,分享阿里…

行业洞察 | AI贩卖的焦虑,我们该买单吗?

图片来源Midjourney Showcase 在过去的几个月里,人工智能生成的艺术在受欢迎程度和可访问性方面都经历了快速增长。随着DALL-E、Midjourney和Stable Diffusion等引擎刺激了 AI 生成的艺术品在在线平台上的大量涌入。 此前,一位美国39岁游戏设计师&#…

测试行业3年经验,面试想拿 15K,HR说你只值 7K,该如何回答或者反驳?

面试最尴尬的不是被拒绝,而是直接说你不值那个价格... 最近朋友在面试的时候,HR 突然来了句:你只值 7K。朋友后面和我说了这个事。我想如果是我处在这种情况下,自己并不能很好地回答或者反驳。不知道大家会怎么回答或者反驳&…

深入浅出了解MYSQL8特性注入是什么

前言 今天给大家带来的是MYSQL8版本的特性注入,说起SQL注入大家一定不陌生,可是你有没有想过,当SQL注入中最关键的函数SELECT被过滤后,我们要如何去执行SQL语句呢,这就是本文要讲的内容,即利用MYSQL8版本的…

智慧人社解决方案-最新全套文件

智慧人社解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、全局性数据整合2、综合数据分析平台3、一体化数据管控四、获取 - 智慧人社全套最新解决方案合集一、建设背景 智慧人社平台以建设智慧大社保服务体系为目标,全面践行“互联网+人社…

python基于PHP+MySQL的大学生交友社交网站

近年来,大学生的数量在逐步的增加,为了能够让这些大学生有一个更好的交友环境,需要创建一个基于大学生的社交交友网站。这样可以拉近彼此大学生之间的感情,让他们可以更好的进行学习和交流。 PHP大学生交友社交网站通过PHP:MySQL进行开发,分为前台和后台两部分,通过…

[附源码]SSM计算机毕业设计餐厅卫生安全系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…