【Pytorch基础】torch.nn.embedding理解

本文详细介绍了PyTorch中的nn.Embedding模块,包括其参数解释、工作原理以及在实际任务中的应用步骤,重点讲解了num_embeddings、embedding_dim和padding_idx的作用。通过实例演示了如何为单词进行初始化并处理padding。
摘要由CSDN通过智能技术生成

  方法参数

torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, 
                   norm_type=2.0, scale_grad_by_freq=False,sparse=False,_weight=None)

  torch.nn.Embedding 模块可以看做一个字典,字典中每个索引对应一个词和词的embedding形式。利用这个模块,可以给词做embedding的初始化操作。

模块中主要参数:
num_embeddings :字典中词的个数
embedding_dim:embedding的维度
padding_idx(索引指定填充):如果给定,则遇到padding_idx中的索引,则将其位置填0(0是默认值)。

大小说明:
input:(∗) , LongTensor 结构
output:(*,e):*是input的大小,e是embedding_dim,即每个词的embedding的维度
注:embeddings中的值是正态分布N(0,1)中随机取值。

import torch
import torch.nn as nn
x = torch.LongTensor([[1,2,4],[4,3,2]])
embeddings = nn.Embedding(5,5,padding_idx=4) #5个词,每个词也是5维
print(embeddings(x))
print(embeddings(x).size())
 
 
output:
tensor([[[ 0.8839, -1.2889,  0.0697, -0.9998, -0.7471],
         [-0.5681,  0.8486,  0.8176,  0.8349,  0.1719],
         [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000]],  ->index=4 赋值 0
 
        [[ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000],   ->index=4 赋值 0
         [ 1.4224,  0.2333,  1.9383, -0.7320,  0.9987],
         [-0.5681,  0.8486,  0.8176,  0.8349,  0.1719]]],
       grad_fn=<EmbeddingBackward>)
torch.Size([2, 3, 5])

  embedding方法获取的向量只是随机初始化的,并不代表任何含义,并且不会有word2vec等训练出来的效果。但是可以利用这样的方法先赋值然后在学习。
  总结一下一般任务中的流程:
  首先将单词转成字典的形式,由于英语中以空格为词的分割,所以可以直接建立词典索引结构。类似于:dic={‘i’:1,‘like’:2,‘you’:3,‘want’:4,‘an’:5,‘apple’:6}这样的形式。如果是中文的话,首先进行分词操作。
  然后在以句子为list,为每个句子建立索引结构,list[[sentence1],[sentence2]]。以上面字典的索引来说,最终建立的就是[[1,2,3],[1,4,5,6]]。这样长短不一的句子。
  接下来要进行padding的操作。由于tensor结构中都是等长的,所以要对上面那样的句子做padding操作后再利用nn.Embedding来进行词的初始化。padding后的可能是这样的结构[[1,2,3,0],[1,4,5,6]]。其中0作为填充。(注意:由于在NMT任务中肯定存在着填充问题,所以在embedding时一定存在着第三个参数,让某些索引为下的值为0,代表无实际意义的填充)

参考资料

[1]torch.nn.Embedding

torch.nn.embeddingPyTorch 中的一个类,用于将输入的整数或长整数序列转换为对应的嵌入向量。嵌入向量是将离散的符号或词语映射到连续的向量空间中的表示,用于在神经网络中处理自然语言等任务。 这个类可以在神经网络中用作嵌入层,它接收一个整数或长整数张量作为输入,每个元素代表一个符号或词语的索引。然后,它会根据指定的嵌入矩阵将每个索引映射为对应的嵌入向量。嵌入矩阵的大小通常为(词汇大小,嵌入维度),其中词汇大小表示所有可用符号或词语的数量,嵌入维度表示每个嵌入向量的长度。 以下是一个使用 torch.nn.embedding 的示例: ```python import torch import torch.nn as nn # 创建一个嵌入层 embedding = nn.Embedding(100, 128) # 100 是词汇大小,128 是嵌入维度 # 输入一个整数序列 input = torch.LongTensor([[1,2,4,5], [4,3,2,9]]) # 将整数序列转换为嵌入向量 output = embedding(input) print(output.shape) # 输出:torch.Size([2, 4, 128]) ``` 在上面的示例中,我们首先创建了一个嵌入层,指定词汇大小为100,嵌入维度为128。然后,我们定义了一个输入整数序列 input,其中包含两个样本,每个样本有四个整数。最后,我们使用 embedding 对输入进行转换得到嵌入向量 output,该结果的形状是(2, 4, 128),其中2表示样本数量,4表示每个样本的整数数量,128表示嵌入维度。 希望这个例子能够帮助你理解 torch.nn.embedding 的用法。如果还有其他问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值