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, optional) – 如果給定,則範數大於
max_norm的每個嵌入向量將被重新歸一化為範數為max_norm。norm_type (float, optional) – 計算
max_norm選項的 p-範數的 p 值。預設為2.0。scale_grad_by_freq (bool, optional) – 如果給定,將透過詞語在小批次中的頻率的倒數來縮放梯度。預設為
False。注意:當mode="max"時,此選項不受支援。mode (str, optional) –
"sum"、"mean"或"max"。指定歸約包的方式。"sum"計算加權和,並考慮per_sample_weights。"mean"計算包中值的平均值,"max"計算每個包的最大值。預設為"mean"。sparse (bool, optional) – 如果為
True,則關於weight矩陣的梯度將是一個稀疏張量。有關稀疏梯度的更多詳細資訊,請參見 Notes。注意:當mode="max"時,此選項不受支援。include_last_offset (bool, optional) – 如果為
True,則offsets將多一個元素,最後一個元素等同於 indices 的大小。這匹配 CSR 格式。padding_idx (int, optional) – 如果指定,則
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是 2D 的,形狀為 (B, N),它將被視為B個包(序列),每個包的固定長度為N,這將根據mode返回B個聚合值。offsets被忽略,並且在此情況下要求為None。如果
input是 1D 的,形狀為 (N),它將被視為多個包(序列)的連線。offsets要求是包含input中每個包起始索引位置的 1D 張量。因此,對於形狀為 (B) 的offsets,input將被視為有B個包。空包(即長度為 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, optional) – 如果為
True,則張量在學習過程中不會被更新。等同於embeddingbag.weight.requires_grad = False。預設為True。max_norm (float, optional) – 請參見模組初始化文件。預設為
None。norm_type (float, optional) – 請參見模組初始化文件。預設為
2.0。scale_grad_by_freq (bool, optional) – 請參見模組初始化文件。預設為
False。mode (str, optional) – 請參見模組初始化文件。預設為
"mean"。sparse (bool, optional) – 請參見模組初始化文件。預設為
False。include_last_offset (bool, optional) – 請參見模組初始化文件。預設為
False。padding_idx (int, optional) – 請參見模組初始化文件。預設為
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]])