基于pytorch 预训练的词向量用法详解


Posted in Python onJanuary 06, 2020

如何在pytorch中使用word2vec训练好的词向量

torch.nn.Embedding()

这个方法是在pytorch中将词向量和词对应起来的一个方法. 一般情况下,如果我们直接使用下面的这种:

self.embedding = torch.nn.Embedding(num_embeddings=vocab_size, embedding_dim=embeding_dim)
num_embeddings=vocab_size  表示词汇量的大小
embedding_dim=embeding_dim 表示词向量的维度

这种情况下, 因为没有指定训练好的词向量, 所以embedding会帮咱们生成一个随机的词向量(但是在我刚刚测试的一个情感二分类问题中, 我发现好像用不用预训练的词向量, 结果差不多, 不过不排除是因为当时使用的模型比较简单, 导致一些特征根本就没提取出来).

如果我想使用word2vec预训练好的词向量该怎么做呢?

其实很简单,pytorch已经给我们提供好了接口

self.embedding.weight.data.copy_(torch.from_numpy(embeding_vector))
self.embedding.weight.requires_grad = False

上面两句代码的意思, 第一句就是导入词向量, 第二句表示的是在反向传播的时候, 不要对这些词向量进行求导更新. 我还看到有人会在优化器那里使用这样的代码:

# emotion_net是我定义的模型
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, emotion_net.parameters()), lr=1e-3, betas=(0.9, 0.99))

大概意思也是为了保证词向量不会被反向传播而更新, 具体有没有用我就不清楚了.

其实我感觉大家比较在意的其实应该是embeding_vector的形式, 下面我就介绍一下embeding_vector的形式

为了讲述方便, 这里定义出下面几个矩阵

​embeding_vector:表示词向量,每行是一个词的词向量,有多少行就说明有多少单词

word_list:表示单词列表,里面就是单词

word_to_index:这个矩阵将word_list中的单词和embeding_vector中的位置对应起来 ​

其实embeding_vector是一个numpy矩阵, 当然你看到了, 实际输入到pytorch的时候, 是需要转换成tensor类型的. 这个矩阵是什么样子的呢? 其中这个矩阵是 [vocab_size×embeding_dim] [vocab\_size \times embeding\_dim][vocab_size×embeding_dim] 的形式. 其中一共包含vocab_size vocab\_sizevocab_size 个单词, 每个单词的维度是 embed_dim embed\_dimembed_dim, 我们把这样一个矩阵输入就行了.

之后, 我们要做的其实就是将 word_to_index word\_to\_indexword_to_index 这个矩阵搞出来, 这里的单词转下标的矩阵, 就是联系 embeding_vector embeding\_vectorembeding_vector 和 word_list word\_listword_list 这两个矩阵的中间者. 我们在输入到torch.nn.Embedding中之前, 需要先通过 word_to_index word\_to\_indexword_to_index 将单词转换成 embeding_vector embeding\_vectorembeding_vector 的下标就可以了.

以上这篇基于pytorch 预训练的词向量用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3里的super()和__class__使用介绍
Apr 23 Python
python实现数独算法实例
Jun 09 Python
Python单链表简单实现代码
Apr 27 Python
Pyhton中单行和多行注释的使用方法及规范
Oct 11 Python
Python装饰器用法实例总结
Feb 07 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
python中文编码与json中文输出问题详解
Aug 24 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
Jan 12 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 #Python
Python连接字符串过程详解
Jan 06 #Python
pytorch中的自定义数据处理详解
Jan 06 #Python
如何基于Python实现自动扫雷
Jan 06 #Python
pytorch 自定义参数不更新方式
Jan 06 #Python
3种python调用其他脚本的方法
Jan 06 #Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 #Python
You might like
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
YII实现分页的方法
2014/07/09 PHP
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python中使用PIPE操作Linux管道
2015/02/04 Python
python获取当前计算机cpu数量的方法
2015/04/18 Python
Python中的index()方法使用教程
2015/05/18 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
阿里云:Aliyun.com
2017/02/15 全球购物
Java程序员综合测试题
2014/04/25 面试题
大学生个人求职信范文
2013/09/21 职场文书
趣味运动会活动方案
2014/02/12 职场文书
公司贷款承诺书
2014/05/30 职场文书
计划生育汇报材料
2014/12/26 职场文书
教师节随笔
2015/08/15 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP