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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
介绍Python中内置的itertools模块
Apr 29 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
python的继承知识点总结
Dec 10 Python
Python搭建Spark分布式集群环境
Jul 05 Python
解决使用export_graphviz可视化树报错的问题
Aug 09 Python
python 绘制正态曲线的示例
Sep 24 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 Python
scrapy头部修改的方法详解
Dec 06 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
如何删除多级目录
2006/10/09 PHP
php mysql数据库操作类
2008/06/04 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
php socket通信简单实现
2016/11/18 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
javascript 全角转换实现代码
2009/07/17 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
python发送arp欺骗攻击代码分析
2014/01/16 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Python set常用操作函数集锦
2017/11/15 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
详解python中list的使用
2019/03/15 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
关于Assembly命名空间的三个面试题
2015/07/23 面试题
美术指导助理求职信
2014/04/20 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
学习张林森心得体会
2014/09/10 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
Django如何与Ajax交互
2021/04/29 Python
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js