侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Pytorch在NLP中的简单应用详解

Python  /  管理员 发布于 5年前   394

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

一、Pytorch基础

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

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

1)Tensor张量

a) 创建Tensors

#tensorx = 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变为Variablex = autograd.Variable(torch.Tensor([1,2,3]),requires_grad = True)#将Variable变为Tensory = 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) #即两个单词,单词的词嵌入维度为5hello_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 torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.autograd as autogradimport torch.optim as optim from six.moves import xrange

对句子进行分词:

context_size = 2embed_dim = 10text_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 mineShall 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]

分词的形式为:

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

建立N-Gram Language model

#N-Gram Language modelclass 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)

定义损失函数和优化器

#定义损失函数以及优化器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中的简单应用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    pycharm 2019 最新激活方式(pycharm破解、激活)
    下一条:
    Pytorch技巧:DataLoader的collate_fn参数使用详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客