torch.nn.functional.embedding_bag#
- torch.nn.functional.embedding_bag(input, weight, offsets=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, mode='mean', sparse=False, per_sample_weights=None, include_last_offset=False, padding_idx=None)[source]#
计算嵌入的“包”的总和、平均值或最大值。
计算在不实例化中间嵌入的情况下完成。有关更多详细信息,请参阅
torch.nn.EmbeddingBag
。注意
此操作在使用 CUDA 设备上的张量时可能会产生非确定性梯度。有关更多信息,请参阅 可复现性。
- 参数
input (LongTensor) – 包含嵌入矩阵索引的包的张量
weight (Tensor) – 嵌入矩阵,其行数等于最大可能索引 + 1,列数等于嵌入大小
offsets (LongTensor, optional) – 仅在
input
为一维时使用。offsets
确定input
中每个包(序列)的起始索引位置。max_norm (float, optional) – 如果给定,则将范数大于
max_norm
的每个嵌入向量重新归一化为范数max_norm
。注意:这将修改weight
(原地)。norm_type (float, optional) –
max_norm
选项中用于计算p
-范数的p
值。默认为2
。scale_grad_by_freq (bool, optional) – 如果给定,将通过小批量中词的频率的倒数来缩放梯度。默认为
False
。注意:当mode="max"
时,此选项不受支持。mode (str, optional) –
"sum"
、"mean"
或"max"
。指定减少 bag 的方式。默认:"mean"
sparse (bool, optional) – 如果为
True
,则相对于weight
的梯度将是稀疏张量。有关稀疏梯度的更多详细信息,请参见torch.nn.Embedding
下的“注释”。注意:当mode="max"
时,此选项不受支持。per_sample_weights (Tensor, optional) – 一个浮点/双精度权重张量,或者为 None 表示所有权重都将取为 1。如果指定,
per_sample_weights
必须与输入具有完全相同的形状,并且将被视为具有与offsets
相同的offsets
,如果它们不是 None。include_last_offset (bool, optional) – 如果为
True
,则 offsets 的大小等于 bag 的数量 + 1。最后一个元素是输入的数量,或者最后一个 bag(序列)的结束索引位置。padding_idx (int, optional) – 如果指定,
padding_idx
处的条目不计入梯度;因此,padding_idx
处的嵌入向量在训练期间不会被更新,即它保持为一个固定的“pad”。请注意,padding_idx
处的嵌入向量不被计入缩减。
- 返回类型
- 形状
input
(LongTensor) 和offsets
(LongTensor, optional)如果
input
是形状为 (B, N) 的 2D 张量,它将被视为B
个 bag(序列),每个 bag 的长度固定为N
,这将根据mode
以特定方式返回聚合后的B
个值。在此情况下,offsets
被忽略且必须为None
。如果
input
是形状为 (N) 的 1D 张量,它将被视为多个 bag(序列)的连接。此时要求offsets
是一个 1D 张量,包含input
中每个 bag 的起始索引位置。因此,对于形状为 (B) 的offsets
,input
将被视为具有B
个 bag。空 bag(即长度为 0 的 bag)将返回填充零的向量。
weight
(Tensor): 模块的可学习权重,形状为 (num_embeddings, embedding_dim)per_sample_weights
(Tensor, optional)。形状与input
相同。output
: 聚合后的嵌入值,形状为 (B, embedding_dim)
示例
>>> # an Embedding module containing 10 tensors of size 3 >>> embedding_matrix = torch.rand(10, 3) >>> # a batch of 2 samples of 4 indices each >>> input = torch.tensor([1, 2, 4, 5, 4, 3, 2, 9]) >>> offsets = torch.tensor([0, 4]) >>> F.embedding_bag(input, embedding_matrix, offsets) tensor([[ 0.3397, 0.3552, 0.5545], [ 0.5893, 0.4386, 0.5882]]) >>> # example with padding_idx >>> embedding_matrix = torch.rand(10, 3) >>> input = torch.tensor([2, 2, 2, 2, 4, 3, 2, 9]) >>> offsets = torch.tensor([0, 4]) >>> F.embedding_bag(input, embedding_matrix, offsets, padding_idx=2, mode='sum') tensor([[ 0.0000, 0.0000, 0.0000], [-0.7082, 3.2145, -2.6251]])