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模拟登陆Tom邮箱示例分享
Jan 13 Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
Python字符串格式化输出方法分析
Apr 13 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
python 调用HBase的简单实例
Dec 18 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
python 绘制场景热力图的示例
Sep 23 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获取url的函数代码
2011/08/02 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
php实现微信企业转账功能
2018/10/02 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
Express之get,pos请求参数的获取
2017/05/02 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
Linux的主要特性
2014/10/06 面试题
房地产出纳岗位职责
2013/12/01 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
英文道歉信
2015/01/20 职场文书
综合管理员岗位职责
2015/02/11 职场文书
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js