nn.EmbeddingBag把offsets之间的进行归约,offsets从0开始

示例回顾

python 复制代码
import torch
import torch.nn as nn

# 定义嵌入字典的大小和嵌入维度
num_embeddings = 10
embedding_dim = 3

# 创建一个 nn.EmbeddingBag 实例
embedding_bag = nn.EmbeddingBag(num_embeddings, embedding_dim, mode='mean')

# 定义输入索引和偏移量
input_indices = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9])
offsets = torch.tensor([0, 4])

# 计算嵌入并进行归约
output = embedding_bag(input_indices, offsets)

print("EmbeddingBag output:")
print(output)

解释

  1. 嵌入字典

    • num_embeddings = 10 表示嵌入字典的大小,即词汇表的大小。
    • embedding_dim = 3 表示每个嵌入向量的维度。
  2. 输入索引和偏移量

    • input_indices = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9]) 是输入的索引张量,表示需要嵌入的词汇索引。
    • offsets = torch.tensor([0, 4]) 是偏移量张量,表示每个序列的起始位置。
  3. 嵌入向量

    • nn.EmbeddingBag 会根据 input_indices 从嵌入字典中查找对应的嵌入向量。

计算过程

假设嵌入字典中的嵌入向量如下(随机初始化):

复制代码
embedding_matrix = [
    [0.1, 0.2, 0.3],  # index 0
    [0.4, 0.5, 0.6],  # index 1
    [0.7, 0.8, 0.9],  # index 2
    [1.0, 1.1, 1.2],  # index 3
    [1.3, 1.4, 1.5],  # index 4
    [1.6, 1.7, 1.8],  # index 5
    [1.9, 2.0, 2.1],  # index 6
    [2.2, 2.3, 2.4],  # index 7
    [2.5, 2.6, 2.7],  # index 8
    [2.8, 2.9, 3.0]   # index 9
]

计算步骤

  1. 查找嵌入向量 - 对于 input_indices = [1, 2, 4, 5, 4, 3, 2, 9],查找对应的嵌入向量:

    复制代码
    [
      [0.4, 0.5, 0.6],  # index 1
      [0.7, 0.8, 0.9],  # index 2
      [1.3, 1.4, 1.5],  # index 4
      [1.6, 1.7, 1.8],  # index 5
      [1.3, 1.4, 1.5],  # index 4
      [1.0, 1.1, 1.2],  # index 3
      [0.7, 0.8, 0.9],  # index 2
      [2.8, 2.9, 3.0]   # index 9
    ]
  2. 应用偏移量

    • offsets = [0, 4] 表示两个序列的起始位置:
      • 第一个序列:input_indices[0:4] 对应的嵌入向量:

        复制代码
        [
          [0.4, 0.5, 0.6],  # index 1
          [0.7, 0.8, 0.9],  # index 2
          [1.3, 1.4, 1.5],  # index 4
          [1.6, 1.7, 1.8]   # index 5
        ]
      • 第二个序列:input_indices[4:8] 对应的嵌入向量:

        复制代码
        [
          [1.3, 1.4, 1.5],  # index 4
          [1.0, 1.1, 1.2],  # index 3
          [0.7, 0.8, 0.9],  # index 2
          [2.8, 2.9, 3.0]   # index 9
        ]
  3. 计算平均值

    • 对每个序列的嵌入向量进行平均计算:
      • 第一个序列的平均值:

        复制代码
        mean([
          [0.4, 0.5, 0.6],
          [0.7, 0.8, 0.9],
          [1.3, 1.4, 1.5],
          [1.6, 1.7, 1.8]
        ]) = [1.0, 1.1, 1.2]
      • 第二个序列的平均值:

        复制代码
        mean([
          [1.3, 1.4, 1.5],
          [1.0, 1.1, 1.2],
          [0.7, 0.8, 0.9],
          [2.8, 2.9, 3.0]
        ]) = [1.45, 1.55, 1.65]
  4. 输出结果

    • 最终输出的嵌入向量为:

      复制代码
      [
        [1.0, 1.1, 1.2],
        [1.45, 1.55, 1.65]
      ]

总结

nn.EmbeddingBag 中,mean 模式会对输入索引对应的嵌入向量进行平均计算。具体步骤如下:

  1. 根据输入索引查找对应的嵌入向量。
  2. 根据偏移量将输入索引分成多个序列。
  3. 对每个序列的嵌入向量进行平均计算。
  4. 输出归约后的嵌入向量。

通过这种方式,nn.EmbeddingBag 可以高效地处理变长序列的嵌入操作,并进行归约计算。

相关推荐
学历真的很重要4 分钟前
LangChain V1.0 Short-term Memory 详细指南
后端·python·语言模型·面试·langchain·agent·ai编程
菜只因C21 分钟前
深度学习:从技术本质到未来图景的全面解析
人工智能·深度学习
LitchiCheng1 小时前
Mujoco 基础:获取模型中所有 body 的 name, id 以及位姿
人工智能·python
Allen_LVyingbo1 小时前
面向医学影像检测的深度学习模型参数分析与优化策略研究
人工智能·深度学习
老鱼说AI1 小时前
算法基础教学第一步:数据结构
数据结构·python·算法
2301_795167201 小时前
Python 高手编程系列八:缓存
开发语言·python·缓存
闲人编程2 小时前
Django测试框架深度使用:Factory Boy与Fixture对比
数据库·python·django·sqlite·钩子·fixture·codecapsule
梅花142 小时前
基于Django房屋租赁系统
后端·python·django·bootstrap·django项目·django网站
今天没有盐2 小时前
Python数据分析实战:从超市销售到教学评估
python·pycharm·编程语言
Coding茶水间3 小时前
基于深度学习的PCB缺陷检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·计算机视觉