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基础教程之自定义函数介绍
Aug 29 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
Dec 18 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
Python调用服务接口的实例
Jan 03 Python
Python 实现两个服务器之间文件的上传方法
Feb 13 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
tornado+celery的简单使用详解
Dec 21 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
keras 如何保存最佳的训练模型
May 25 Python
Python Switch Case三种实现方法代码实例
Jun 18 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速度全攻略
2006/10/09 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
python 多进程通信模块的简单实现
2014/02/20 Python
Python数据结构之翻转链表
2017/02/25 Python
Python小进度条显示代码
2019/03/05 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python实现电子词典
2020/03/03 Python
python实现简单的购物程序代码实例
2020/03/03 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
建筑实习自我鉴定
2013/10/18 职场文书
立春观后感
2015/06/18 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
导游词之北京明十三陵
2019/10/28 职场文书