pytorch实现rnn并且对mnist进行分类

1.RNN简介

rnn,相比很多人都已经听腻,但是真正用代码操练起来,其中还是有很多细节值得琢磨。

虽然大家都在说,我还是要强调一次,rnn实际上是处理的是序列问题,与之形成对比的是cnn,cnn不能够处理序列问题,因为它没有记忆能力,那为什么rnn能够处理序列问题以及有记忆能力呢?

首先简单介绍一下rnn以及lstm的背景,这里给出两个链接,链接1链接2

以最简单的rnn为例,如下图

 

上面是rnn展开成3个单元的结构示意图,h_t是上一个时刻的输出,这个输出送到下一个时刻的输入;x_t是当前时刻的输入,h_t是当前时刻的输出,这个输出有两个用途,第一个当然还是作为当前时刻的输出,另外一个作用是作为下一个时刻的输出,所以你不难理解,为什么rnn有记忆能力,因为,下一个单元的输入是综合当前时刻的输入x_t与上一个时刻的输出h_t-1啊,所以rnn的记忆功能体现在这个地方

h_t-1与x_t经过concatenate之后经过一个权重相乘,然后加上一个偏执bias,经过一个tanh函数,就成了h_t,非常简单

公式如下

非常简单,那么问题来了

大家经常所说的是rnn展开之后像上面这一个图一样,那么不展开呢?

大概是像这样

 

 实际上这是非常合理的,为什么呢?因为其实对于一层的rnn而言,看上面的公式,确实是只有一个w_ih,b_ih,w_hh,b_hh.记住这个是非常重要的,因为一开始的时候大家都可能会有一个误解说,为什么应该是同一个权重,为什么不是不同的权重?

我觉得,在nlp领域,假如你输入的是一个序列,就是一个句子,每个句子中的每个单词经过word2vec变换成一个向量,这个句子有长有短,而对不不同长度的句子,难不成rnn上面展开的单元的个数还是变换的?这显然是不可能的!如果这还说服不了你,那稍后看pytorch代码

刚刚还说到,关于rnn的层数的问题,这个层数很容易误解为第一个图那样展开,实际上和展开没有半毛钱关系,展开的长度随着输入的序列的长短决定,层数的定义实际上是如下这样

即是往上延伸的,输出的h_t还是会网上继续输入,t时刻的输出是h_t^',而不是h_t。

2.pytorch实现rnn

考虑到rnn的记忆特性,即rnn能够记住前面的东西,这样是否可行:即我每一时刻输入的是一个vector,这个vector对应的是图像的某一列,有多少列就对应多少时刻,那最后一个时刻输入的是最后一列,rnn最后输出的h_t实际上就是对应的哪一个类别,实际上这样是行得通的

说干就干

 1 # -*-coding: utf-8 -*-
 2 import torch
 3 import torch.nn as nn
 4 import torchvision.datasets as dsets
 5 import torchvision.transforms as transforms
 6 from torch.autograd import Variable
 7 
 8 
 9 <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值