RNN:timestep、inputsize、Batchsize的区别「建议收藏」

近期读了一些关于LSTM的文章,但仍旧很难理解,关键就是不懂输入、输出是什么,相比于图像处理的CNN,RNN特别抽象。昨晚花了很大的精力去理解“遗留状态”这个概念,现在终于明白了一些,关键在timestep这个概念。关于timestep我们看到的所有的RNN结构图,其实都是在一个timestep中的,而不是整个序列。(这句话很简单,但真的是花了很长时间才领悟到的)以下引用自知乎回答:[我的…

大家好,又见面了,我是你们的朋友全栈君。

近期读了一些关于LSTM的文章,但仍旧很难理解,关键就是不懂输入、输出是什么,相比于图像处理的CNN,RNN特别抽象。
昨晚花了很大的精力去理解“遗留状态”这个概念,现在终于明白了一些,关键在timestep这个概念。

一、深入理解timestep

我们看到的所有的RNN结构图,其实都是在一个timestep中的,而不是整个序列。(这句话很简单,但真的是花了很长时间才领悟到的)
以下引用自知乎回答:
我的RNN理解
用动图讲RCNN
对于常用的cnn模型,它只能单独处理每个输入,每个输入之间完全没有联系,但是现实中很多情况是需要考虑数据的前后之间的联系的,比如:视频的每一帧都是有联系的,一段话中每个词也都是离不开上下文的,那么可不可以在神经网络输入的时候把之前的信息加进去呢?因此提出了RNN模型。

在提到RNN时,总会遇到这个抽象的图:

在这里插入图片描述
这个图总是让人一脸蒙蔽阿,说白了这就是rnn的一个抽象流程。x代表输入,o代表输出,s代表隐藏层。如果把W这个环去掉,就是最普通的网络结构,把这个环扩展开,如下图所示:

在这里插入图片描述
其实x向量并不是一下子全都输进去的,是每次输入一个Xt,并且每次输出一个Ot。具体公式如下:
在这里插入图片描述
其中,f、g都是激活函数,Ot由隐藏层决定,相当于是一个全连接。St是由当前的输入Xt以及上一个隐藏层共同决定的。这里介绍的比较简单,任何一个rnn教程都会对该过程做一个详细的说明。看到这里我就不太理解,我这个W的环到底要循环多少次?这是由timestep决定的。timestep的值决定了该rnn的结构,如果timestep为20,那么这个W的环要循环20次,每一步t都需要一个输入,同时也会有一个输出,共有20次输入和对应的20个输出。
在这里插入图片描述
所以说,造成我理解最大的困难就是没有懂上面的那句话:我们看到的所有的RNN结构,其实是对一个timestep内部来说的,而不是timestep之间。RNN所谓的t-1的遗留状态也是在一个timestep里面的事情,t多少取决于timestep的值。

二、timestep示例理解

这一个实战操作的解释会有助于理解这一过程:
简单粗暴LSTM:LSTM进行时间序列预测

LSTM进行预测需要的是时序数据 根据前timestep步预测后面的数据
假定给一个数据集
{

A,B,C->D
B,C,D->E
C,D,E->F
D,E,F->G
E,F,G->H
}
这时timestep为3,即根据前三个的数据预测后一个数据的值。我们所谓的隐藏状态是这样的:把A输入进去,得到隐藏状态h(1),然后h(1)与B一起输入,得到h(2),然后h(2)与C一起输入…
而不是过去以为的[ABC—D]训练完,得到h(1),再把[BCD—E]和h(1)训练得到h(2)…
举一个简单的情况 假设一个list为[1,2,3,4,5],timestep = 2
我们转化之后要达到的效果是
在这里插入图片描述
这部分就需要自己编程实现,按照自己设定的timestep构建训练集:

def create_dataset(dataset, look_back):
#这里的look_back与timestep相同
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back)]
        dataX.append(a)
        dataY.append(dataset[i + look_back])
    return numpy.array(dataX),numpy.array(dataY)
#训练数据太少 look_back并不能过大
look_back = 1
trainX,trainY  = create_dataset(trainlist,look_back)
testX,testY = create_dataset(testlist,look_back)

所以说,timestep的值为n,就意味着我们认为每一个值都和它前n个值有关系。拿来预测时也是如此,如果timestep=n,训练之后,为了预测第m个值,就要把m的前n个值做输入。

三、示例:timestep与Batchsize的区别

个人看法:给定一个长序列,序列中的每一个值,也都由一个很长的向量(或矩阵)表示。把序列从前往后理解为时间维度,那么timestep就是指的这个维度中的值,如果timestep=n,就是用序列内的n个向量(或矩阵)预测一个值。
而对于每一个向量来说,它本身有一个空间维度(如长度),那么Batchsize就是这个空间维度上的概念。
比如一共有5个字母ABCDE,它们分别如此表示:
A:1 1 1 1 1
B:2 2 2 2 2
C:3 3 3 3 3
D:4 4 4 4 4
E:5 5 5 5 5
如果timestep为2,那么在训练过程中就是:

X Y
AB C
BC D
CD E

下面我们只看第一对数据:AB-C
t=0,A进入训练,生成h(0)
t=1,B进入训练,生成h(1)
下面我们只看t=0,由于A的序列可能也很长(在本例子中是5),所以也不能一次全都带进去。这就需要分批次了(和过去的所有网络就一样了),所以设定Batchsize为2,则就是分成三批次:11、11、1

四、示例:timestep、batchsize、inputsize的区别

下面的例子来自动图看懂RNN
我们用碎纸做个比方。有一张A4纸,长宽分别为297*210 mm,现在要把纸塞进碎纸机里。

在这里插入图片描述
在这个例子中,

A4纸就是数据,总数据量为297*210,
碎纸机是神经网络
输出的结果是粉碎的纸,这里我们先不管输出是什么样,只关注输入。
每次塞纸时,都要正拿A4纸,把210的一边冲着碎纸机的口塞入。

现在开始考虑各个参数的意义。

下图代表input_size=1,batch=1,喂给碎纸机的是一个1*1的小纸片,训练1000次代表喂1000次纸;
在这里插入图片描述
下图代表数据维度input_size=210,batch=1,也就说,数据本身发生了变化——增加维度了;
在这里插入图片描述
下图代表input_size=1,批次batch=297,数据本身没变,每次训练时进的数据量多了

在这里插入图片描述
相应的,下图就代表input_size=210,batch=297,一共只需要1次就能训练完所有数据。
在这里插入图片描述
以上是我们之前学习的全连接神经网络。

现在引入RNN。RNN保留了之前所有参数,并增加了参数time_step(时间步),对于这个例子,我们应该怎么理解这个新参数呢?

此刻你手中的纸突然有了厚度(10297210),碎纸机还是那台,纸变厚了,就必须切片才能塞进去,在这个例子中,纸被切成了10层。

1、RNN要求你,每次塞纸时,不管纸是什么形状(不管batch等于多少),都必须把10层纸依次、先后、全塞进去,才算一次完整的喂纸,中间不许停(time_step=10)
2、同时,每层纸在进纸时,还需要跟上层产生的碎纸片一起塞进去(h_{t-1}+x_{t})
至此,我们看到,batch依然保留,与time_step分别代表不同意义。
在这里插入图片描述
其实,从另一个角度也可以区分,time_step是神经网络的参数,网络建好了便不会改变;batch是训练参数,在训练时可根据效果随时调整。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128435.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一看就懂:正则表达式[通俗易懂]

    一看就懂:正则表达式[通俗易懂]案例引入在讲正则表达式前,我们不妨先从一个场景来逐渐引入。你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图)。根据上图,我们将密码设置规则可以描述为两个条件:(1)长度为6-16位;(2)密码中必须包含数字,大写字母,小写字母,特殊字符(指定字符);现在假设我们不知道正则表达式,作为程序员的你,该如何去实现这样一个密码验证呢?下面是我写的一个校验方法(样本):/***校验用户密码是否满足..

    2022年5月13日
    59
  • linux防火墙配置命令_linux防火墙规则设置

    linux防火墙配置命令_linux防火墙规则设置一、实验要求1.不允许外网不经过防火墙与内网进行通信2.允许内网用户通过防火墙访问外部HTTP、HTTPS服务器3.允许内网用户通过防火墙访问外部FTP服务器二、实验环境1.使用两台Linux虚拟机和一台win10物理机。一台Linux主机作为网关(需要双网卡),另一台Linux主机作为内网,使用物理机作为外网。2.我使用的是RedHat6.5版本。RedHat7及…

    2022年9月22日
    2
  • java io常用类总结

    java io常用类总结读写数据是java开发过程中经常需要做的,本篇文章将我们平时常用的javaio处理类做个总结,同时给出相关demo。可以看得出来,JAVAIO主要有这四个类InputStream、OutputStream、Reader、Writer来处理,要处理字节流的就用InputStream、OutputStream,要处理字符流,就用Reader、Writer,现实中根据需要,我们选择他们的相关子类进行…

    2022年5月9日
    42
  • winnet winhttp

    winnet winhttp//HttpPost.cppwrittenbyl_zhaohui@163.com//2007/11/30#include<windows.h>#include<stdio.h>#include<stdlib.h>#define_ATL_CSTRING_EXPLICIT_CONSTRUCTORS#includ…

    2022年7月11日
    36
  • python社交网络分析_python编程:从入门到实践

    python社交网络分析_python编程:从入门到实践NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)输出结果1、测试对象data1=’今天上海的天气真好!我的心情非常高兴!如果去旅游的话我会非常兴奋!和你一起去旅游我会更加幸福!’data2=’今天上海天气真差,非常讨厌下雨,把我冻坏了,心情太不高兴了,不高兴,我真的很生气!’data3=’美国华裔科学家,祖籍江苏扬州市高邮县,…

    2022年8月10日
    7
  • tcping在linux用法,tcping的安装和使用[通俗易懂]

    tcping在linux用法,tcping的安装和使用[通俗易懂]Tcping网上比较少资料是关于linux对tcp端口ping测试的方法,我这里简单介绍2种方法:1.yum安装,编译安装方法1-1.wgethttp://linuxco.de/tcping/tcping-1.3.5.tar.gz###下载tcping1-2tarzxvftcping-1.3.5.tar.gz####解压缩tcping-1.3.51-3cdtcping-1….

    2022年6月23日
    106

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号