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 可以高效地处理变长序列的嵌入操作,并进行归约计算。

相关推荐
小小测试开发1 小时前
pytest 库用法示例:Python 测试框架的高效实践
开发语言·python·pytest
初学小刘1 小时前
深度学习在目标检测中的应用与挑战
人工智能·深度学习·目标检测
至善迎风1 小时前
把 Python 应用打包成 Mac 应用程序 — 完整指南
python·macos
MYX_3091 小时前
第四章 神经网络的基本组件
pytorch·深度学习·神经网络·学习
OpenBayes1 小时前
教程上新|重新定义下一代 OCR:IBM 最新开源 Granite-docling-258M,实现端到端的「结构+内容」统一理解
人工智能·深度学习·机器学习·自然语言处理·ocr·图像识别·文档处理
应用市场2 小时前
无人机编队飞行原理与Python仿真实现完整指南
python·无人机·cocos2d
蓝桉~MLGT2 小时前
Python学习历程——字符串相关操作及正则表达式
python·学习·正则表达式
一晌小贪欢2 小时前
Python爬虫第5课:正则表达式与数据清洗技术
爬虫·python·正则表达式·网络爬虫·python爬虫·python3·网页爬虫
Nina_7173 小时前
Google提示词白皮书总结(2)
人工智能·python
Lynnxiaowen3 小时前
今天我们继续学习python3编程之python基础
linux·运维·python·学习