上次通过pytorch实现了RNN模型,简易的完成了使用RNN完成mnist的手写数字识别,但是里面的参数有点不了解,所以对问题进行总结归纳来解决。

总述:
第一次看到这个函数时,脑袋有点懵,总结了下总共有五个问题:

1.这个input_size是啥?要输入啥?feature num又是啥?

2.这个hidden_size是啥?要输入啥?feature num又是啥?

3.不是说RNN会有很多个节点连在一起的吗?这怎么定义连接的节点数呢?

4.num_layer中说的stack是怎么stack的?

5.怎么输出会有两个东西呀output,hn

pytorch中RNN的一些参数,并且解决以上五个问题

1.Pytorch中的RNN

2.input_size是啥?
说白了input_size无非就是你输入RNN的维度,比如说NLP中你需要把一个单词输入到RNN中,这个单词的编码是300维的,那么这个input_size就是300.这里的input_size其实就是规定了你的输入变量的维度。用f(wX+b)来类比的话,这里输入的就是X的维度。

3.hidden_size是啥?
和最简单的BP网络一样的,每个RNN的节点实际上就是一个BP嘛,包含输入层,隐含层,输出层。这里的hidden_size呢,你可以看做是隐含层中,隐含节点的个数。

那个输入层的三个节点代表输入维度为3,也就是input_size=3,然后这个hidden_size就是5了。当然这是是对于RNN某一个节点而言的,那么如何规定RNN的节点个数呢?

4.如何规定节点个数?

事实上,节点个数并不需要规定,你的输入序列是这样子的,[x1,x2,x3,x4,x5],那么input_size呢就是你的xi的维度,而你的RNN的节点数呢,就是由你的序列长度决定的,在这里我们的序列长度是5,所以会有5个节点。那么问题来了,我咋知道你的序列长度呢?pytorch里面不是只有input_size的参数吗?实际上,你声明RNN是这样声明的

self.encoder = nn.RNN(input_size=300,hidden_size=128,dropout=0.5)
但是你用的时候;

output,hn = self.encoder(encoder_input,encoder_hidden)
你会把你的数据丢进去吧,也就是你把encoder_input这一整个序列丢进去了,那么序列长度他不就知道了?

5.num_layers是啥?
一开始你是不是以为这个就是RNN的节点数呀,hhh,然而并不是:),如果num_layer=2的话,表示两个RNN堆叠在一起。那么怎么堆叠的呢?

如果是num_layer==1的话:

如果num_layer==2的话:

ok了~最后再来看看最后一个问题

6.hn,output分别是啥?

  hidden的输出size为[ num_layers* num_directions, batch_size, n_hidden].

  说白了,hidden就是每个方向,每个层的 隐藏单元的输出,所以是n_hidden个。

  output的size(如果RNN设定的batch_first=True),那么就是[batch_size,seq_len,n_hidden],对于分类任务如果要取得最后一个output,只需添加下标  [ :,-1,:]

看图找答案:

hn就是RNN的最后一个隐含状态,output就是RNN最终得到的结果。

pytorch之 RNN 参数解释的更多相关文章

  1. pytorch之 RNN regression

    关于RNN模型参数的解释,可以参看RNN参数解释 1 import torch from torch import nn import numpy as np import matplotlib.py ...

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

    1.RNN简介 rnn,相比很多人都已经听腻,但是真正用代码操练起来,其中还是有很多细节值得琢磨. 虽然大家都在说,我还是要强调一次,rnn实际上是处理的是序列问题,与之形成对比的是cnn,cnn不能 ...

  3. http load 的使用以及参数解释

    http load 的使用以及参数解释   1.参数含义 参数     全称      含义 -p        -parallel     并发的用户进程数.-f        -fetches   ...

  4. /etc/sysctl.conf参数解释

    /etc/sysctl.conf参数解释: fs.file max = 999999 #表示进程(例如一个worker进程)可能同时打开的最大句柄数,直接限制最大并发连接数 net.ipv4.tcp_ ...

  5. lcd参数解释及刷新率计算,LCD时序

    一.LCD显示图像的过程如下: 其中,VSYNC和HSYNC是有宽度的,加上后如下: 参数解释: HBP(Horizontal Back Porch)水平后沿:在每行或每列的象素数据开始输出时要插入的 ...

  6. Yolov3参数解释以及答疑

    目录 参数解析 训练答疑 ​ 参数解析 [net] #Testing #batch=1 //test:一次一个图片 #subdivisions=1 #Training batch=32 //一次迭代送 ...

  7. angular-cli.json配置参数解释,以及依稀常用命令的通用关键参数解释

    一. angular-cli.json常见配置 { "project": { "name": "ng-admin", //项目名称 &quo ...

  8. mysql命令行各个参数解释

    mysql命令行各个参数解释 http://blog.51yip.com/mysql/1056.html Usage: mysql [OPTIONS] [database]   //命令方式 -?, ...

  9. Wget用法、参数解释

    wget功能的强大就不用多说了,在高手手里,它就像是个无往不利的杀人利器,下面是转载的一篇Wget用法.参数解释的比较好的一个文章,当然最好的老师还是man wget 是一个从网络上自动下载文件的自由 ...

随机推荐

  1. SpringCloud之Ribbon(四)

    一:Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接 ...

  2. 常用crud

    增:@Insert("insert into  t_user (`last_name`, `sex`) values(#{lastName}, #{sex})")   删:@Del ...

  3. 前端笔记6-js2

    1.break 和continue用法 break结束本次循环,如果想结束外层循环,可以通过这个label来指定要结束的循环. continue可以用来跳过当次循环,如果想跳过外次循环,也可以通过这个 ...

  4. 一道简单到爆 Java面试题,居然挂了一票人

    很多时候bug往往都是出在,我们觉得非常简单,不起眼的基础知识上 年前公司最后一波招人,为年后项目做技术储备,主要招聘对象初中级Java开发,要求也并没有多苛刻,唯一一点基础稍好,快速上手做项目就行. ...

  5. MVEL2.0的使用实例(一)

    本文是对java整合mvel2.0的一点示例: 如果表达式中有变量,解析表达式时必须传一个map MVEL.eval(expression, vars); /** * 基本解析表达式 */@Testp ...

  6. ORM基础2 字段及其参数和meta

    一.ORM简介 1.概念:ORM(Object Relational Mappingt ),对象关系映射 2.实质:类与数据库之间的映射 3.优点: 开发人员不用写数据库 4.缺点: 开发人员,数据库 ...

  7. Elasticsearch 开箱指南

    内容概要 ES 基础介绍,重点是其中的核心概念. 基础 API 实践操作. 1. 基础介绍 Elasticsearch (ES) 是一个数据库,提供了分布式的.准实时搜索和分析. 基于 Apache ...

  8. Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name

    目前有发现的两种情况 第一种:是在继承jpa的时候检查实体类@id和@Entity引进的包是否是 import javax.persistence.Id imprt javax.persistence ...

  9. leetcode 全解(python版)

    本着blabla的精神,在这里(可能会)给出leetcode的全部习题答案 --持续更新中... 1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整 ...

  10. python输出结果后面带着一个“None”

    执行代码的时候,输出的结果中含有一个“None”   只要将最后一行代码的print() 去掉即可 改成 my_range.get_range() 或者是将 函数中的print(range) 改成 r ...