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 输入,此类但是,
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),从 初始化。
示例
>>> # 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 的前向传递。
- 参数
- 返回
形状为 (B, embedding_dim) 的张量输出。
- 返回类型
注意
关于
input
和offsets
的一些说明input
和offsets
必须具有相同的类型,int 或 long如果
input
是形状为 (B, N) 的 2D,它将被视为每个固定长度为N
的B
个 Bag(序列),这将返回B
个值,这些值以取决于mode
的方式聚合。offsets
在这种情况下被忽略,并且需要为None
。如果
input
是形状为 (N) 的 1D,它将被视为多个 Bag(序列)的连接。offsets
需要是一个 1D 张量,包含input
中每个 Bag 的起始索引位置。因此,对于形状为 (B) 的offsets
,input
将被视为具有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
。
- 返回类型
示例
>>> # 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]])