Pytorch在NLP中的简单应用详解


Posted in Python onJanuary 08, 2020

因为之前在项目中一直使用Tensorflow,最近需要处理NLP问题,对Pytorch框架还比较陌生,所以特地再学习一下pytorch在自然语言处理问题中的简单使用,这里做一个记录。

一、Pytorch基础

首先,第一步是导入pytorch的一系列包

import torch
import torch.autograd as autograd #Autograd为Tensor所有操作提供自动求导方法
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

1)Tensor张量

a) 创建Tensors

#tensor
x = torch.Tensor([[1,2,3],[4,5,6]])
#size为2x3x4的随机数随机数
x = torch.randn((2,3,4))

b) Tensors计算

x = torch.Tensor([[1,2],[3,4]])
y = torch.Tensor([[5,6],[7,8]])
z = x+y

c) Reshape Tensors

x = torch.randn(2,3,4)
#拉直
x = x.view(-1)
#4*6维度
x = x.view(4,6)

2)计算图和自动微分

a) Variable变量

#将Tensor变为Variable
x = autograd.Variable(torch.Tensor([1,2,3]),requires_grad = True)
#将Variable变为Tensor
y = x.data

b) 反向梯度算法

x = autograd.Variable(torch.Tensor([1,2]),requires_grad=True)
y = autograd.Variable(torch.Tensor([3,4]),requires_grad=True)
z = x+y
#求和
s = z.sum()
#反向梯度传播
s.backward()
print(x.grad)

c) 线性映射

linear = nn.Linear(3,5) #三维线性映射到五维
x = autograd.Variable(torch.randn(4,3))
#输出为(4,5)维
y = linear(x)

d) 非线性映射(激活函数的使用)

x = autograd.Variable(torch.randn(5))
#relu激活函数
x_relu = F.relu(x)
print(x_relu)
x_soft = F.softmax(x)
#softmax激活函数
print(x_soft)
print(x_soft.sum())

output:

Variable containing:
-0.9347
-0.9882
 1.3801
-0.1173
 0.9317
[torch.FloatTensor of size 5]
 
Variable containing:
 0.0481
 0.0456
 0.4867
 0.1089
 0.3108
[torch.FloatTensor of size 5]
 
Variable containing:
 1
[torch.FloatTensor of size 1]
 
Variable containing:
-3.0350
-3.0885
-0.7201
-2.2176
-1.1686
[torch.FloatTensor of size 5]

二、Pytorch创建网络

1) word embedding词嵌入

通过nn.Embedding(m,n)实现,m表示所有的单词数目,n表示词嵌入的维度。

word_to_idx = {'hello':0,'world':1}
embeds = nn.Embedding(2,5) #即两个单词,单词的词嵌入维度为5
hello_idx = torch.LongTensor([word_to_idx['hello']])
hello_idx = autograd.Variable(hello_idx)
hello_embed = embeds(hello_idx)
print(hello_embed)

output:

Variable containing:
-0.6982 0.3909 -1.0760 -1.6215 0.4429
[torch.FloatTensor of size 1x5]

2) N-Gram 语言模型

先介绍一下N-Gram语言模型,给定一个单词序列 ,计算 ,其中 是序列的第 个单词。

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.autograd as autograd
import torch.optim as optim
 
from six.moves import xrange

对句子进行分词:

context_size = 2
embed_dim = 10
text_sequence = """When forty winters shall besiege thy brow,
And dig deep trenches in thy beauty's field,
Thy youth's proud livery so gazed on now,
Will be a totter'd weed of small worth held:
Then being asked, where all thy beauty lies,
Where all the treasure of thy lusty days;
To say, within thine own deep sunken eyes,
Were an all-eating shame, and thriftless praise.
How much more praise deserv'd thy beauty's use,
If thou couldst answer 'This fair child of mine
Shall sum my count, and make my old excuse,'
Proving his beauty by succession thine!
This were to be new made when thou art old,
And see thy blood warm when thou feel'st it cold.""".split()
#分词
trigrams = [ ([text_sequence[i], text_sequence[i+1]], text_sequence[i+2]) for i in xrange(len(text_sequence) - 2) ]
trigrams[:10]

分词的形式为:

Pytorch在NLP中的简单应用详解

#建立vocab索引
vocab = set(text_sequence)
word_to_ix = {word: i for i,word in enumerate(vocab)}

建立N-Gram Language model

#N-Gram Language model
class NGramLanguageModeler(nn.Module): 
 def __init__(self, vocab_size, embed_dim, context_size):
  super(NGramLanguageModeler, self).__init__()
  #词嵌入
  self.embedding = nn.Embedding(vocab_size, embed_dim)
  #两层线性分类器
  self.linear1 = nn.Linear(embed_dim*context_size, 128)
  self.linear2 = nn.Linear(128, vocab_size)
  
 def forward(self, input):
  embeds = self.embedding(input).view((1, -1)) #2,10拉直为20
  out = F.relu(self.linear1(embeds))
  out = F.relu(self.linear2(out))
  log_probs = F.log_softmax(out)
  return log_probs

输出模型看一下网络结构

#输出模型看一下网络结构
model = NGramLanguageModeler(96,10,2)
print(model)

Pytorch在NLP中的简单应用详解

定义损失函数和优化器

#定义损失函数以及优化器
loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(),lr = 0.01)
model = NGramLanguageModeler(len(vocab), embed_dim, context_size)
losses = []

模型训练

#模型训练
for epoch in xrange(10):
 total_loss = torch.Tensor([0])
 for context, target in trigrams:
  #1.处理数据输入为索引向量
  #print(context)
  #注:python3中map函数前要加上list()转换为列表形式
  context_idxs = list(map(lambda w: word_to_ix[w], context))
  #print(context_idxs)
  context_var = autograd.Variable( torch.LongTensor(context_idxs) )
 
  
  #2.梯度清零
  model.zero_grad()
  
  #3.前向传播,计算下一个单词的概率
  log_probs = model(context_var)
  
  #4.损失函数
  loss = loss_function(log_probs, autograd.Variable(torch.LongTensor([word_to_ix[target]])))
  
  #反向传播及梯度更新
  loss.backward()
  optimizer.step()
  
  total_loss += loss.data 
 losses.append(total_loss)
print(losses)

以上这篇Pytorch在NLP中的简单应用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python练习程序批量修改文件名
Jan 16 Python
Python中多线程thread与threading的实现方法
Aug 18 Python
python之Socket网络编程详解
Sep 29 Python
总结python实现父类调用两种方法的不同
Jan 15 Python
python中异常捕获方法详解
Mar 03 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
centos6.8安装python3.7无法import _ssl的解决方法
Sep 17 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
去除python中的字符串空格的简单方法
Dec 22 Python
Pandas搭配lambda组合使用详解
Jan 22 Python
python三子棋游戏
May 04 Python
解析PyCharm Python运行权限问题
Jan 08 #Python
python读取ini配置的类封装代码实例
Jan 08 #Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 #Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 #Python
Pytorch DataLoader 变长数据处理方式
Jan 08 #Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 #Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 #Python
You might like
php短域名转换为实际域名函数
2011/01/17 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
django中的图片验证码功能
2019/09/18 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
Python新手学习raise用法
2020/06/03 Python
sklearn的predict_proba使用说明
2020/06/28 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
关于Assembly命名空间的三个面试题
2015/07/23 面试题
学生个人的自我评价分享
2013/11/05 职场文书
自主招生学校推荐信
2014/09/26 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书