SinusoidalPositionalEmbedding/tensor2tensor中实现的绝对位置编码

这篇具有很好参考价值的文章主要介绍了SinusoidalPositionalEmbedding/tensor2tensor中实现的绝对位置编码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、目录

  1. 代码

二、实现

  1. 代码
import torch.nn as nn
import math
import torch
from typing import Optional,Any

class SinusoidalPositionalEmbedding(nn.Embedding):
    """
    This module produces sinusoidal positional embeddings of any length.

    We don't want to save the weight of this embedding since it's not trained (deterministic) and it can be huge.

    Padding symbols are ignored.

    These embeddings get automatically extended in forward if more positions is needed.
    """

    def __init__(self, num_positions, embedding_dim, padding_idx):
        self.make_weight(num_positions, embedding_dim, padding_idx)

    def make_weight(self, num_positions, embedding_dim, padding_idx):
        weight = self.get_embedding(num_positions, embedding_dim, padding_idx)
        if not hasattr(self, "weight"):
            # in ___init__
            super().__init__(num_positions, embedding_dim, padding_idx, _weight=weight)
        else:
            # in forward put the weights on the correct dtype and device of the param
            weight = weight.to(dtype=self.weight.dtype, device=self.weight.device)
            self.weight = nn.Parameter(weight)
        self.weight.detach_()
        self.weight.requires_grad = False

    @staticmethod
    def get_embedding(num_embeddings, embedding_dim, padding_idx):
        """
        Build sinusoidal embeddings.

        This matches the implementation in tensor2tensor, but differs slightly from the description in Section 3.5 of
        "Attention Is All You Need".
        """
        half_dim = embedding_dim // 2
        emb = math.log(10000) / (half_dim - 1)
        emb = torch.exp(torch.arange(half_dim, dtype=torch.float) * -emb)
        emb = torch.arange(num_embeddings, dtype=torch.float).unsqueeze(1) * emb.unsqueeze(0)
        emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=1).view(num_embeddings, -1)
        if embedding_dim % 2 == 1:
            # zero pad
            emb = torch.cat([emb, torch.zeros(num_embeddings, 1)], dim=1)
        if padding_idx is not None:
            emb[padding_idx, :] = 0
        return emb

    @staticmethod
    def make_positions(tensor, padding_idx: int):
        """
        Replace non-padding symbols with their position numbers.

        Position numbers begin at padding_idx+1. Padding symbols are ignored.
        """
        # The series of casts and type-conversions here are carefully
        # balanced to both work with ONNX export and XLA. In particular XLA
        # prefers ints, cumsum defaults to output longs, and ONNX doesn't know
        # how to handle the dtype kwarg in cumsum.
        mask = tensor.ne(padding_idx).int()
        return (torch.cumsum(mask, dim=1).type_as(mask) * mask).long() + padding_idx

    def forward(
        self,
        input,
        incremental_state: Optional[Any] = None,
        timestep= None,
    ):
        """Input is expected to be of size [bsz x seqlen]."""
        bsz, seq_len = input.shape[:2]
        max_pos = self.padding_idx + 1 + seq_len
        if max_pos > self.weight.size(0):
            # expand embeddings if needed
            self.make_weight(max_pos, self.embedding_dim, self.padding_idx)
        positions = self.make_positions(input, self.padding_idx)
        return super().forward(positions)

if __name__ == '__main__':
    max_position_embeddings=1024
    embed_dim=712
    padding_idx=102
    embed_positions = SinusoidalPositionalEmbedding(
        max_position_embeddings + padding_idx + 1, embed_dim, padding_idx
    )
    input_ids=torch.randint(0,10,size=(2,10))
    positions = embed_positions(input_ids)
    print(positions.shape)

文章来源地址https://www.toymoban.com/news/detail-783355.html

到了这里,关于SinusoidalPositionalEmbedding/tensor2tensor中实现的绝对位置编码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • tensor的不同维度种类

    0维标量(scalar),1维向量(vector),二维矩阵(matrix),3维以上n维张量

    2024年02月08日
    浏览(10)
  • PyTorch核心--tensor 张量 !!

    文章目录 前言 张量的概念 1. 张量的定义 2. 张量的属性 3. 张量的形状 张量的原理 1. 存储(storage) 2. 形状(shape) 3. 步幅(stride) 张量的操作 1. 数学运算 2. 逻辑运算 3. 索引和切片 4. 形状操作 5. 广播 总结 在PyTorch中,张量是核心数据结构,它是一个多维数组,类似Numpy中

    2024年01月23日
    浏览(29)
  • Pytorch.tensor 相关用法

    Torch.tensor.backward()方法的使用举例 理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理 Autograd: 自动求导

    2024年02月10日
    浏览(10)
  • 解决使用copy.deepcopy()拷贝Tensor或model时报错只支持用户显式创建的Tensor问题

    解决使用copy.deepcopy()拷贝Tensor或model时报错只支持用户显式创建的Tensor问题

    模型训练过程中常需边训练边做validation或在训练完的模型需要做测试,通常的做法当然是先创建model实例然后掉用load_state_dict()装载训练出来的权重到model里再调用model.eval()把模型转为测试模式,这样写对于训练完专门做测试时当然是比较合适的,但是对于边训练边做validati

    2024年01月18日
    浏览(11)
  • Python报错:IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in

    Python报错如下: 这是一个Python程序的运行错误信息,提示了以下问题: NO.1 UserWarning: nn.init.xavier_uniform is now deprecated in favor of nn.init.xavier_uniform_. :这是一个警告提示,提醒你在使用 nn.init.xavier_uniform 时应改为使用 nn.init.xavier_uniform_ 。 NO.2 Traceback (most recent call last):... :这部

    2024年02月14日
    浏览(12)
  • Pytorch Tensor维度变换方法

    1 .torch.reshape()、torch.view()可以调整Tensor的shape 2 .torch.unsqueeze(index)可以为Tensor增加一个维度 3 .squeeze()可以删减维度 4 .expand()扩展维度 5 .repeat()维度重复,不常用 6 .transpose(dim1, dim2)交换dim1与dim2,进行维度变换。 注意这种交换使得存储不再连续,再执行一些reshape的操作会报

    2024年02月14日
    浏览(7)
  • pytorch创建和操作tensor

    参考: https://pytorch.org/docs/stable/tensors.html

    2024年02月16日
    浏览(11)
  • tensor与numpy的相互转换

    tensor与numpy的相互转换

    1. numpy转tensor 命令1:torch.tensor() 注意 : 命令2:torch.as_tensor() 命令3:torch.from_numpy() 区别:转换之后,numpy.array和tensor中的数据是否仍指向相同的内存地址 torch.from_numpy(np.array) 和 torch.as_tensor() ,均会指向相同的内存地址。 torch.tensor()不会指向相同的内存地址,是深度copy。从

    2023年04月08日
    浏览(11)
  • 深度学习:探究Tensor和Numpy

    深度学习:探究Tensor和Numpy

    目录 引言 1 pytorch中Tensor 1.1 什么是Tensor 1.2 为什么需要Tensor 1.3 如何创建Tensor 1.3.1 从已有其他数据结构转化创建为Tensor 1.3.2 随机初始化一个Tensor 1.3.3 从已保存文件加载一个Tensor 1.4 Tensor的特性 1.4.1 丰富的常用函数操作 1.4.2 灵活的dtype和CPU/GPU自由切换 1.4.3 自动梯度求解 2 Nu

    2024年02月14日
    浏览(10)
  • opencv,numpy,tensor格式转换

    opencv,numpy,tensor格式转换

    目前接触到的读取图片的方式主要是两种,一是使用opencv的 cv2 模块,二是 PIL. Image 模块,两者的使用有不同。 最先一个问题是读取格式。 1. cv2读取的图片格式直接是numpy的ndarry格式,图片是形状为 HxWxC 的BGR图片。 直接打印是BGR格式 经过格式转换之后得到正常的RGB格式图片

    2024年02月16日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包