Pytorch的torch.nn.embedding()如何实现词嵌入层

 更新时间:2024年02月27日 15:49:11   作者:#苦行僧  
这篇文章主要介绍了Pytorch的torch.nn.embedding()如何实现词嵌入层问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

torch.nn.embedding()实现词嵌入层

nn.embedding()其实是NLP中常用的词嵌入层,在实现词嵌入的过程中embedding层的权重用于随机初始化词的向量,该embedding层的权重参数在后续训练时会不断更新调整,并被优化。 

nn.embedding:这是一个矩阵类,该开始时里面初始化了一个随机矩阵,矩阵的长是字典的大小,宽是用来表示字典中每个元素的属性向量,向量的维度根据你想要表示的元素的复杂度而定。

类实例化之后可以根据字典中元素的下标来查找元素对应的向量。 

因为输入的句子长度不一,有的长有的短。

长了截断,不够长补齐(我文中用’'填充,然后在nn.embedding层将其补0,也就是用它来表示无意义的词,这样在后面的max-pooling层也就自然而然会把其过滤掉,这样就不用担心他会影响识别。)

这里说一下它的用法:

nn.embedding()主要3个参数

  • 第一个参数num_embeddings是指词表大小 
  • 第二个参数embedding_dim是指你需要用多少维来表示一个符号
  • 第三个参数pading_idx即需要用0填充的符号在词表中的位置,如下,输出中后面两个’'都有被填充为了0.
import torch
import torch.nn as nn


#词表
word_to_id = {'hello':0, '<PAD>':1,'world':2}
embeds = nn.Embedding(len(word_to_id), 4,padding_idx=word_to_id['<PAD>'])

text = 'hello world <PAD> <PAD>'
hello_idx = torch.LongTensor([word_to_id[i] for i in text.split()])
#词嵌入得到词向量
hello_embed = embeds(hello_idx)
print(hello_embed)

从以下输出可以看到,每行代表句子中一个单词的词嵌入向量,句子中的每个单词都有4维度,最后两个0向量是时用来填充补齐的没意义。

所以embedding层其实相当于将前面用索引编码的句子表示乘上embedding层的可训练权重得到的就是词嵌入的结果

输出:

tensor([[-1.1436, 1.4588, -1.2755, 0.0077],
[-0.9600, -1.9986, -1.1087, -0.1520],
[ 0.0000, 0.0000, 0.0000, 0.0000],
[ 0.0000, 0.0000, 0.0000, 0.0000]], grad_fn=)

你也可以使用nn.Embedding.from_pretrained()加载预训练好的模型,如word2vec,glove等,在训练的过程中也可以边训练,边更新词向量,加快模型的收敛。

本文用的只是简单的nn.embedding()

然后具体使用 nn.embedding() 时,写在初始化搭建网络里

如下:

class Network(nn.Module):
    def __init__(self):
        super(TextCNN, self).__init__(nvocab,embed)
        self.filter_sizes = (2, 3, 4)
        self.embed = embed
        self.num_filters = 256
        self.dropout = 0.5
        self.num_classes = num_classes
        self.n_vocab = nvocab
        #通过padding_idx将<PAD>字符填充为0,因为他没意义哦,后面max-pooling自然而然会把他过滤掉哦
        self.embedding = nn.Embedding(self.n_vocab, self.embed, padding_idx=word2idx['<PAD>'])
        self.convs = nn.ModuleList(
            [nn.Conv2d(1, self.num_filters, (k, self.embed)) for k in self.filter_sizes])
        
        self.dropout = nn.Dropout(self.dropout)
        self.fc = nn.Linear(self.num_filters * len(self.filter_sizes), self.num_classes)
        
    def conv_and_pool(self, x, conv):
        x = F.relu(conv(x)).squeeze(3)
        x = F.max_pool1d(x, x.size(2)).squeeze(2)
        return x
        
    def forward(self, x):
        out = self.embedding(x)
        out = out.unsqueeze(1)
        out = torch.cat([self.conv_and_pool(out, conv) for conv in self.convs], 1)
        out = self.dropout(out)
        out = self.fc(out)
        return out

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python线程的两种编程方式

    Python线程的两种编程方式

    这篇文章主要介绍了Python线程的两种编程方式,Python中如果要使用线程的话,一种是函数式,一种是用类来包装的线程对象,需要的朋友可以参考下
    2015-04-04
  • Python Scala中使用def语句定义方法的详细过程

    Python Scala中使用def语句定义方法的详细过程

    这篇文章主要介绍了Python Scala中使用def语句定义方法,Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量,下面来讲解Scala的方法,需要的朋友可以参考下
    2022-09-09
  • python实现用户登陆邮件通知的方法

    python实现用户登陆邮件通知的方法

    这篇文章主要介绍了python实现用户登陆邮件通知的方法,实例分析了Python计划任务与邮件发送的使用技巧,需要的朋友可以参考下
    2015-07-07
  • 关于Python ImportError: No module named 通用解决方法

    关于Python ImportError: No module named&nb

    最近多个小伙伴儿问“ImportError: No module named xxx“,应该怎么样解决,下面小编给大家带来了关于Python ImportError: No module named 通用解决方法,感兴趣的朋友一起看看吧
    2022-11-11
  • python多线程编程方式分析示例详解

    python多线程编程方式分析示例详解

    本文介绍一下有关Python多线程的相关应用技巧,线程相对进程来说是"轻量级"的,操作系统用较少的资源创建和管理线程。程序中的线程在相同的内存空间中执行,并共享许多相同的资源,下面看使用方法
    2013-12-12
  • pandas添加新列的5种常见方法

    pandas添加新列的5种常见方法

    pandas为DataFrame格式数据添加新列的方法非常简单,下面这篇文章主要给大家介绍了关于pandas添加新列的5种常见方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头

    Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头

    这篇文章主要介绍了Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头的示例,帮助大家更好的利用python处理图片,感兴趣的朋友可以了解下
    2020-10-10
  • 浅谈python多进程共享变量Value的使用tips

    浅谈python多进程共享变量Value的使用tips

    今天小编就为大家分享一篇浅谈python多进程共享变量Value的使用tips,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • pycharm 实现显示project 选项卡的方法

    pycharm 实现显示project 选项卡的方法

    今天小编就为大家分享一篇pycharm 实现显示project 选项卡的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • django多种支付、并发订单处理实例代码

    django多种支付、并发订单处理实例代码

    在本篇文章里小编给大家整理的是关于django多种支付、并发订单处理实例代码,需要的朋友们可以学习下。
    2019-12-12

最新评论