快捷方式

EmbeddingBag

class torch.nn.EmbeddingBag(num_embeddings, embedding_dim, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, mode='mean', sparse=False, _weight=None, include_last_offset=False, padding_idx=None, device=None, dtype=None)[source]

计算“包”中嵌入的总和或平均值,无需实例化中间嵌入。

对于长度恒定的包、没有 per_sample_weights、没有索引等于 padding_idx 以及 2D 输入,此类

  • 使用 mode="sum" 等效于 Embedding 后跟 torch.sum(dim=1)

  • 使用 mode="mean" 等效于 Embedding 后跟 torch.mean(dim=1)

  • 使用 mode="max" 等效于 Embedding 后跟 torch.max(dim=1)

但是,EmbeddingBag 比使用这些操作的链式操作在时间和内存效率方面高得多。

EmbeddingBag 还支持将每个样本的权重作为参数传递给前向传递。这会在根据 mode 指定的加权归约之前缩放嵌入的输出。如果传递了 per_sample_weights,则唯一支持的 mode"sum",它根据 per_sample_weights 计算加权和。

参数
  • num_embeddings (int) – 嵌入字典的大小

  • embedding_dim (int) – 每个嵌入向量的尺寸

  • max_norm (float, 可选) – 如果给出,则范数大于 max_norm 的每个嵌入向量都被重新归一化为具有 max_norm 的范数。

  • norm_type (float, 可选) – 用于计算 max_norm 选项的 p-范数的 p。默认为 2

  • scale_grad_by_freq (bool, 可选) – 如果给出,则会按小批量中单词频率的倒数缩放梯度。默认为 False。注意:当 mode="max" 时,不支持此选项。

  • mode (str, 可选) – "sum""mean""max"。指定减少 Bag 的方式。"sum" 计算加权和,考虑 per_sample_weights"mean" 计算 Bag 中值的平均值,"max" 计算每个 Bag 的最大值。默认值:"mean"

  • sparse (bool, 可选) – 如果为 True,则关于 weight 矩阵的梯度将是一个稀疏张量。有关稀疏梯度的更多详细信息,请参阅注释。注意:当 mode="max" 时,不支持此选项。

  • include_last_offset (bool, 可选) – 如果为 True,则 offsets 具有一个额外的元素,其中最后一个元素等效于 indices 的大小。这与 CSR 格式匹配。

  • padding_idx (int, 可选) – 如果指定,则 padding_idx 处的条目不会对梯度做出贡献;因此,在训练期间不会更新 padding_idx 处的嵌入向量,即它保持为固定的“填充”。对于新构造的 EmbeddingBag,padding_idx 处的嵌入向量默认为全零,但可以更新为另一个值用作填充向量。请注意,padding_idx 处的嵌入向量被排除在归约之外。

变量

weight (Tensor) – 模块的可学习权重,形状为 (num_embeddings, embedding_dim),从 N(0,1)\mathcal{N}(0, 1) 初始化。

示例

>>> # an EmbeddingBag module containing 10 tensors of size 3
>>> embedding_sum = nn.EmbeddingBag(10, 3, mode='sum')
>>> # a batch of 2 samples of 4 indices each
>>> input = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9], dtype=torch.long)
>>> offsets = torch.tensor([0, 4], dtype=torch.long)
>>> embedding_sum(input, offsets)
tensor([[-0.8861, -5.4350, -0.0523],
        [ 1.1306, -2.5798, -1.0044]])

>>> # Example with padding_idx
>>> embedding_sum = nn.EmbeddingBag(10, 3, mode='sum', padding_idx=2)
>>> input = torch.tensor([2, 2, 2, 2, 4, 3, 2, 9], dtype=torch.long)
>>> offsets = torch.tensor([0, 4], dtype=torch.long)
>>> embedding_sum(input, offsets)
tensor([[ 0.0000,  0.0000,  0.0000],
        [-0.7082,  3.2145, -2.6251]])

>>> # An EmbeddingBag can be loaded from an Embedding like so
>>> embedding = nn.Embedding(10, 3, padding_idx=2)
>>> embedding_sum = nn.EmbeddingBag.from_pretrained(
        embedding.weight,
        padding_idx=embedding.padding_idx,
        mode='sum')
forward(input, offsets=None, per_sample_weights=None)[source]

EmbeddingBag 的前向传递。

参数
  • input (Tensor) – 包含指向嵌入矩阵的索引的 Bag 的张量。

  • offsets (Tensor, 可选) – 仅当 input 为 1D 时使用。offsets 确定 input 中每个 Bag(序列)的起始索引位置。

  • per_sample_weights (Tensor, 可选) – 浮点/双精度权重的张量,或 None 表示所有权重应取为 1。如果指定,则 per_sample_weights 必须与 input 具有完全相同的形状,并且被视为具有相同的 offsets(如果它们不为 None)。仅支持 mode='sum'

返回

形状为 (B, embedding_dim) 的张量输出。

返回类型

Tensor

注意

关于 inputoffsets 的一些说明

  • inputoffsets 必须具有相同的类型,int 或 long

  • 如果 input 是形状为 (B, N) 的 2D,它将被视为每个固定长度为 NB 个 Bag(序列),这将返回 B 个值,这些值以取决于 mode 的方式聚合。offsets 在这种情况下被忽略,并且需要为 None

  • 如果 input 是形状为 (N) 的 1D,它将被视为多个 Bag(序列)的连接。offsets 需要是一个 1D 张量,包含 input 中每个 Bag 的起始索引位置。因此,对于形状为 (B)offsetsinput 将被视为具有 B 个 Bag。空 Bag(即长度为 0)将返回填充零的向量。

classmethod from_pretrained(embeddings, freeze=True, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, mode='mean', sparse=False, include_last_offset=False, padding_idx=None)[source]

从给定的二维 FloatTensor 创建 EmbeddingBag 实例。

参数
  • embeddings (Tensor) – 包含 EmbeddingBag 权重的 FloatTensor。第一维被传递给 EmbeddingBag 作为 'num_embeddings',第二维作为 'embedding_dim'。

  • freeze (bool, 可选) – 如果为 True,则张量在学习过程中不会更新。等效于 embeddingbag.weight.requires_grad = False。默认值:True

  • max_norm (float, 可选) – 请参阅模块初始化文档。默认值:None

  • norm_type (float, 可选) – 请参阅模块初始化文档。默认值 2

  • scale_grad_by_freq (bool, 可选) – 请参阅模块初始化文档。默认值 False

  • mode (str, 可选) – 请参阅模块初始化文档。默认值:"mean"

  • sparse (bool, 可选) – 请参阅模块初始化文档。默认值:False

  • include_last_offset (bool, 可选) – 请参阅模块初始化文档。默认值:False

  • padding_idx (int, 可选) – 请参阅模块初始化文档。默认值:None

返回类型

EmbeddingBag

示例

>>> # FloatTensor containing pretrained weights
>>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>>> embeddingbag = nn.EmbeddingBag.from_pretrained(weight)
>>> # Get embeddings for index 1
>>> input = torch.LongTensor([[1, 0]])
>>> embeddingbag(input)
tensor([[ 2.5000,  3.7000,  4.6500]])

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源