PyTorch中的nn.Embedding应用详解

[复制链接]
发表于 2025-9-8 04:02:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
PyTorch





前言

在深度学习中,词嵌入(Word Embedding)是一种常见的技能,用于将离散的词汇或符号映射到连续的向量空间。这种映射使得相似的词汇在向量空间中具有相似的向量表示,从而可以捕捉词汇之间的语义关系。在PyTorch中,nn.Embedding模块提供了一种简单而高效的方式来实现词嵌入。
一、nn.Embedding的基本原理

nn.Embedding是一个存储固定大小的辞书的嵌入向量的查找表。给定一个编号,嵌入层可以或许返回该编号对应的嵌入向量。这些嵌入向量反映了各个编号代表的符号之间的语义关系。在输入一个编号列表时,nn.Embedding会输出对应的符号嵌入向量列表。
在内部,nn.Embedding实际上是一个参数化的查找表,其中每一行都对应一个符号的嵌入向量。这些嵌入向量在练习过程中通过反向传播算法举行更新,以优化模子的性能。因此,nn.Embedding不仅可以用于低落数据的维度,淘汰计算和存储开销,还可以通过练习学习输入数据中的语义或结构信息。
二、nn.Embedding的实际应用

简单的例子

  1. import torch
  2. from torch.nn import Embedding
  3. class Model(torch.nn.Module):
  4.     def __init__(self):
  5.         super(Model, self).__init__()
  6.         self.emb = Embedding(5, 3)
  7.     def forward(self,vec):
  8.         input = torch.tensor([0, 1, 2, 3, 4])
  9.         emb_vec1 = self.emb(input)
  10.         # print(emb_vec1)  ### 输出对同一组词汇的编码
  11.         output = torch.einsum('ik, kj -> ij', emb_vec1, vec)
  12.         return output
  13. def simple_train():
  14.     model = Model()
  15.     vec = torch.randn((3, 1))
  16.     label = torch.Tensor(5, 1).fill_(3)
  17.     loss_fun = torch.nn.MSELoss()
  18.     opt = torch.optim.SGD(model.parameters(), lr=0.015)
  19.     print('初始化emebding参数权重:\n',model.emb.weight)
  20.     for iter_num in range(100):
  21.         output = model(vec)
  22.         loss = loss_fun(output, label)
  23.         opt.zero_grad()
  24.         loss.backward(retain_graph=True)
  25.         opt.step()
  26.         # print('第{}次迭代emebding参数权重{}:\n'.format(iter_num, model.emb.weight))
  27.     print('训练后emebding参数权重:\n',model.emb.weight)
  28.     torch.save(model.state_dict(),'./embeding.pth')
  29.     return model
  30. def simple_test():
  31.    model = Model()
  32.    ckpt = torch.load('./embeding.pth')
  33.    model.load_state_dict(ckpt)
  34.    model=model.eval()
  35.    vec = torch.randn((3, 1))
  36.    print('加载emebding参数权重:\n', model.emb.weight)
  37.    for iter_num in range(100):
  38.       output = model(vec)
  39.    print('n次预测后emebding参数权重:\n', model.emb.weight)
  40. if __name__ == '__main__':
  41.    simple_train()  # 训练与保存权重
  42.    simple_test()
复制代码
练习代码
  1. import torch
  2. from torch.nn import Embedding
  3. class Model(torch.nn.Module):
  4.     def __init__(self):
  5.         super(Model, self).__init__()
  6.         self.emb = Embedding(5, 10)
  7.     def forward(self,vec):
  8.         input = torch.tensor([0, 1, 2, 3, 4])
  9.         emb_vec1 = self.emb(input)
  10.         print(emb_vec1)  ### 输出对同一组词汇的编码
  11.         output = torch.einsum('ik, kj -> ij', emb_vec1, vec)
  12.         print(output)
  13.         return output
  14. def simple_train():
  15.     model = Model()
  16.     vec = torch.randn((10, 1))
  17.     label = torch.Tensor(5, 1).fill_(3)
  18.     print(label)
  19.     loss_fun = torch.nn.MSELoss()
  20.     opt = torch.optim.SGD(model.parameters(), lr=0.015)
  21.     for iter_num in range(1):
  22.         output = model(vec)
  23.         loss = loss_fun(output, label)
  24.         print('iter:%d loss:%.2f' % (iter_num, loss))
  25.         opt.zero_grad()
  26.         loss.backward(retain_graph=True)
  27.         opt.step()
  28. if __name__ == '__main__':
  29.     simple_train()
复制代码
自然语言处理处罚使命

在自然语言处理处罚使命中,词嵌入是一种非常有用的技能。通过将每个单词表示为一个实数向量,我们可以将高维的词汇空间映射到一个低维的连续向量空间。这有助于提高模子的泛化能力和计算效率。例如,在文天职类使命中,我们可以使用nn.Embedding将文本中的每个单词转换为嵌入向量,然后将这些向量输入到神经网络中举行分类。
以下是一个简单的示例代码,演示了如安在PyTorch中使用nn.Embedding举行文天职类:
  1. import torch
  2. import torch.nn as nn
  3. # 定义词嵌入层,词典大小为10000,嵌入向量维度为128
  4. embedding = nn.Embedding(num_embeddings=10000, embedding_dim=128)
  5. # 假设我们有一个包含5个单词的文本,每个单词的编号分别为1, 2, 3, 4, 5
  6. input_ids = torch.tensor([1, 2, 3, 4, 5], dtype=torch.long)
  7. # 通过词嵌入层将单词编号转换为嵌入向量
  8. embedded = embedding(input_ids)
  9. # 输出嵌入向量的形状:(5, 128)
  10. print(embedded.shape)
  11. # 定义神经网络模型
  12. class TextClassifier(nn.Module):
  13.     def __init__(self, embedding_dim, hidden_dim, num_classes):
  14.         super(TextClassifier, self).__init__()
  15.         self.embedding = embedding
  16.         self.fc1 = nn.Linear(embedding_dim, hidden_dim)
  17.         self.fc2 = nn.Linear(hidden_dim, num_classes)
  18.     def forward(self, input_ids):
  19.         embedded = self.embedding(input_ids)
  20.         # 对嵌入向量进行平均池化,得到一个固定长度的向量表示整个文本
  21.         pooled = embedded.mean(dim=0)
  22.         # 通过全连接层进行分类
  23.         logits = self.fc2(self.fc1(pooled))
  24.         return logits
  25. # 实例化模型并进行训练...
复制代码
上述代码中,我们首先定义了一个词嵌入层embedding,辞书大小为10000,嵌入向量维度为128。然后,我们创建了一个包含5个单词的文本,每个单词的编号分别为1到5。通过调用embedding(input_ids),我们将单词编号转换为嵌入向量。最后,我们定义了一个文天职类器模子TextClassifier,其中包含了词嵌入层、全连接层等组件。在模子的前向传播过程中,我们首先对嵌入向量举行平均池化,得到一个固定长度的向量表示整个文本,然后通过全连接层举行分类。
除了自然语言处理处罚使命外,nn.Embedding还可以用于图像处理处罚使命。例如,在卷积神经网络(CNN)中,嵌入层可以将图像的像素值映射到一个高维的空间,从而更好地捕捉图像中的复杂特征和结构。这有助于提高模子的性能和泛化能力。
需要留意的是,在图像处理处罚使命中,我们通常使用卷积层(nn.Conv2d)或像素嵌入层(nn.PixelEmbed)等模块来处理处罚图像数据,而不是直接使用nn.Embedding。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表