正文共5225个字,预计阅读时间12分钟。

最近在学pyTorch的实际应用例子。这次说个简单的例子:给定一句话,判断是什么语言。这个例子是比如给定一句话:

Give it to me

判断是  ENGLISH

me gusta comer en la cafeteria

判断是  SPANISH

就是这么简单的例子。

来看怎么实现:
准备数据 格式  [(语句,类型),...]
data是train的时候用的语句,test_data是test的时候用的语句

data = [ ("me gusta comer en la cafeteria".split(), "SPANISH"),         ("Give it to me".split(), "ENGLISH"),         ("No creo que sea una buena idea".split(), "SPANISH"),         ("No it is not a good idea to get lost at sea".split(), "ENGLISH") ] test_data = [("Yo creo que si".split(), "SPANISH"),              ("it is lost on me".split(), "ENGLISH")]

因为文本计算机室识别不出来的,他们只认识01串,也就是数字。所以我们得把文本映射到数字上。

word_to_ix = {}for sent, _ in data + test_data:    f

or word in sent:

if word not in word_to_ix: word_to_ix[word] = len(word_to_ix) print(word_to_ix)

输出word_to_ix (意思是word to index)是:

{'me': 0, 'gusta': 1, 'comer': 2, 'en': 3, 'la': 4, 'cafeteria': 5, 'Give': 6, 'it': 7, 'to': 8, 'No': 9, 'creo': 10, 'que': 11, 'sea': 12, 'una': 13, 'buena': 14, 'idea': 15, 'is': 16, 'not': 17, 'a': 18, 'good': 19, 'get': 20, 'lost': 21, 'at': 22, 'Yo': 23, 'si': 24, 'on': 25}

这里先提前设置下接下来要用到的参数

VOCAB_SIZE = len(word_to_ix) NUM_LABELS = 2#只有两类 ENGLISH  SPANISH

固定模板

def init(self, num_labels, vocab_size):初始化,就是输入和输出的大小。这里我们要输入是一个句子,句子最大就是拥有所有字典的词,这里也就是vocab_size(下面再说怎么将一句话根据字典转换成一个数字序列的),输出就是分类,这里分为2类,即num_labels。这里我们用的是线性分类 ,即nn.Linear()。

def forward(self, bow_vec):bow_vec是一个句子的数字化序列,经过self.linear()得到一个线性结果(也就是预测结果),之后对这个结果进行softmax(这里用log_softmax是因为下面的损失函数用的是NLLLoss() 即负对数似然损失,需要log以下)

class BoWClassifier(nn.Module):

#nn.Module 这是继承torch的神经网络模板

def __init__(self, num_labels, vocab_size):

super(BoWClassifier, self).__init__()

self.linear = nn.Linear(vocab_size, num_labels)

def forward(self, bow_vec):

return F.log_softmax(self.linear(bow_vec))

def make_bow_vector(sentence, word_to_ix)

大概能看懂什么意思吧。就是把一个句子sentence通过word_to_ix转换成数字化序列.比如  sentence=我 是 一只 小 小 鸟   word_to_id={你:0,我:1,他:2,不:3,是:4,大:5,小:6,猪:7,鸟:8,,} make_bow_vector之后的结果是[0,1,0,0,1,0,2,0,1]
view()就是改变下向量维数。这里是讲len(word_to_ix)1->1len(word_to_ix)

def make_bow_vector(sentence, word_to_ix):    vec = torch.zeros(len(word_to_ix))    for word in sentence:        vec[word_to_ix[word]] += 1    return vec.view(1, -1)

这个就不用说了吧  一样。(如果想知道torch.LongTensor啥意思的话。可以看看。Torch中,Tensor主要有ByteTensor(无符号char),CharTensor(有符号),ShortTensor(shorts), IntTensor(ints), LongTensor(longs), FloatTensor(floats), DoubleTensor(doubles),默认存放为double类型,如果需要特别指出,通过torch.setdefaulttensortype()方法进行设定。例如torch.setdefaulttensortype(‘torch.FloatTensor’)。 )

def make_target(label, label_to_ix):    return torch.LongTensor([label_to_ix[label]])

这里再介绍下model.parameters()这个函数。他的返回结果是model里的所有参数。这里我们用的是线性函数,所以就是f(x)=Ax+b中的A和b(x即输入的数据),这些参数在之后的反馈和更新参数需要的。

model = BoWClassifier(NUM_LABELS, VOCAB_SIZE)

for param in model.parameters():

print("param:", param)

可以看出A是2len(vocab_size),b是21

param: Parameter containing:Columns 0 to 9 0.0786  0.1596  0.1259  0.0054  0.0558 -0.0911 -0.1804 -0.1526 -0.0287 -0.1086-0.0651 -0.1096 -0.1807 -0.1907 -0.0727 -0.0179  0.1530 -0.0910  0.1943 -0.1148Columns 10 to 19 0.0452 -0.0786  0.1776  0.0425  0.1194 -0.1330 -0.1877 -0.0412 -0.0269 -0.1572-0.0361  0.1909  0.1558  0.1309  0.1461 -0.0822  0.1078 -0.1354 -0.1877  0.0184Columns 20 to 25 0.1818 -0.1401  0.1118  0.1002  0.1438  0.0790 0.1812 -0.1414 -0.1876  0.1569  0.0804 -0.1897

[torch.FloatTensor of size 2x26]param: Parameter containing: 0.1859 0.1245[torch.FloatTensor of size 2]

我们再看看model的def forward(self, bow_vec):怎么用。这里就想下面的代码一样,直接在mode()填一个参数即可,就调用forward函数。

sample = data[0] bow_vector = make_bow_vector(sample[0], word_to_ix) log_probs = model(autograd.Variable(bow_vector))

print("log_probs", log_probs)

输出是:(就是log_softmax后的值)

log_probs Variable containing:-0.6160 -0.7768[torch.FloatTensor of size 1x2]

我们这里看看在test上的预测

label_to_ix = { "SPANISH": 0, "ENGLISH": 1 }

for instance, label in test_data:

bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix))

log_probs = model(bow_vec)

print log_probsprint next(model.parameters())[:,word_to_ix["creo"]]

结果是

Variable containing:

-0.5431 -0.8698

[torch.FloatTensor of size 1x2]

Variable containing:

-0.7405 -0.6480

[torch.FloatTensor of size 1x2]

Variable containing:

-0.0467 0.1065

[torch.FloatTensor of size 2]

下面就该进行重要的部分了。循环训练和更新参数
这里我们用的损失函数是nn.NLLLoss()负对数似然损失
优化依然用的最常见的optim.SGD() 梯度下降法
一般训练5-30次最终优化基本不再变化

每一步过程:
a.首先都要model.zero_grad(),因为接下来要极端梯度,得清零,以防问题
b.将数据向量化(也可以说是数字序列化,转成计算机能看懂的形式)
c.得到预测值
d.求损失loss_function
e.求梯度loss.backward()
f.更新参数optimizer.step()

loss_function = nn.NLLLoss() optimizer = optim.SGD(model.parameters(), lr=0.1)for epoch in range(100):    for instance, label in data:        model.zero_grad()        bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix))        target = autograd.Variable(make_target(label, label_to_ix))        log_probs = model(bow_vec)        loss = loss_function(log_probs, target)        loss.backward()        optimizer.step()

在测试集上测试

for instance, label in test_data:

bow_vec = autograd.Variable(make_bow_vector(instance, word_to_ix))

log_probs = model(bow_vec)

print log_probs

我们在结果上很容易看到第一个例子预测是SPANISH最大,第二个是ENGLISH最大。成功了。

Variable containing:-0.0842 -2.5161[torch.FloatTensor of size 1x2]Variable containing:-2.4886 -0.0867[torch.FloatTensor of size 1x2]

原文链接:https://www.jianshu.com/p/7b2d9e6e3633

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org

请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看


LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

pyTorch自然语言处理简单例子相关推荐

  1. PyTorch自然语言处理入门与实战 | 文末赠书

    文末赠书 注:本文选自人民邮电出版社出版的<PyTorch自然语言处理入门与实战>一书,略有改动.经出版社授权刊登于此. 处理中文与英文的一个显著区别是中文的词之间缺乏明确的分隔符.分词是 ...

  2. pytorch记录:seq2seq例子看看这torch怎么玩的

    https://blog.csdn.net/nockinonheavensdoor/article/details/82320580 先看看简单例子: import torch import torc ...

  3. webpack入门之简单例子跑起来

    webpack入门之简单例子跑起来 webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载 ...

  4. 图片上传(加水印、缩略图、远程保存)的简单例子

    图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...

  5. java hashtable import,Hashtable的一个简单例子

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下是关于Hashtable的简单例子,谁知道别的遍历Hashtable的方法,请回复! package no1; import java.util.En ...

  6. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  7. .net中使用反射的简单例子

    说明:由于工作原因,本人使用反射的机会不是很多,所以没有必要为了炫耀技术而使用这种技术,不过今天有人问到这方面的问题,所以做了一个简单例子,供初学者参考,代码如下: using System; usi ...

  8. linux下Makefile中包含有shared library动态链接库文件时候的简单例子

    如果不知道什么是makefile,可以首先看我的另一篇博客: linux下Makefile的简单例子及解释 http://www.cnblogs.com/lihaozy/archive/2012/08 ...

  9. java 国际化例子_JavaSE 国际化 简单例子

    ①在src下添加两个文件: base_zh_CN.properties Test=\u8fd9\u662f\u4e2d\u6587 base_en_US.properties Test=english ...

最新文章

  1. java 类对象可以调用静态方法吗
  2. 操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)
  3. matlab中GUIDE的UItable居中方法
  4. gradle命令无法识别
  5. 传统的世界的中国风吉祥纹样海报这样设计。
  6. vc++树状控件(TreeCtrl)用法
  7. 风吹来_“秃如其来”的年轻人,如何才能让头发“春风吹又生”?
  8. JavaSE基础——Scanner类和String类
  9. 百度搜索时,使用‘-csdn’屏蔽掉CSDN网站的博客和内容
  10. Dbeaver在公司内网情况下进行编辑驱动
  11. java微信支付通知接口_java实现微信支付结果通知
  12. 百度迟到移动互联网:寻入口级产品 文化成挑战
  13. GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之二)。
  14. CANopen高级协议详解
  15. HAN - Heterogeneous Graph Attention Network 异构图注意力网络 WWW 2019
  16. 算法分析与设计实验报告 ——二分搜索程序算法的实现
  17. zcmu1275: Seeding
  18. 南京邮电大学高级语言程序设计实验五(指针与字符串实验)
  19. [暑假的bzoj刷水记录]
  20. 使用阿里云实现营业执照的查询

热门文章

  1. spyder中绘图无法显示负号_[转载]Matlab常用函数
  2. fckeditor 上传图片 php_fckeditor 上传图片乱码的解决方法_PHP教程
  3. 计算机教室要配备空调吗,教室里不安装空调吗?如何正确安装空调?
  4. 计算机算法设计与分析读后感,算法设计与分析基础经典读后感有感
  5. 菜鸟教程html图片自动播放,HTML img 标签 | 菜鸟教程
  6. java 多态_Java的多态
  7. php psot传值_三种方法教你如何用PHP模拟post提交数据
  8. DAY06-Python入门学习-元组、字典、集合类型
  9. 2018暑假第一周总结(7.9-7.15)
  10. mysql(mariadb)重装