其中参数layer就是RNN的类型,可以使简单的SimpleRNN , LSTM , 或者是GRU等等。merge_mode = ‘ concat’表示最后前向的输出和后向输出的连接方式,concat表示直接连接,类似于列表直接加上去的那种。
和普通LSTM的输入类似,input还是为【batch_size,time_step,num】其中num表示单个时间点上向量的长度,此处搭建的双向LSTM模型的隐藏层的向量维度为5,输入的向量维度为4,每一个时间点都返回一个维度为【batch_size,5】的结果,最后的输出的连接方式为直接像列表那样堆叠。其中400个参数怎么来的:
前向循环过程中,输入层和循环层之间之间的权重 其维度为 ,因为这里集成了单个LSTM的3个门控结构和一个输入单元状态的权重,在前向计算的时候,每个时间点的权重是复用的,即不同时间点输入和循环层的权重都是一样的(但前向和后向计算时权重不能复用),具体解释详见: keras中LSTM流程的验证 ,前向计算过程中,循环成之间的权重 ,其权重维度为 ,因为隐藏层的向量维度为5,所以,权重为5*20,其也是将3个门控结构和单元状态都集成在了一个权重参数中,最后加上偏置 ,也是集成了3个门控结构和输入单元状态的参数。
反向循环过程中,输入层和反向循环层之间的权重 ,其维度和前向循环的维度一样,都为 ,反向循环层之间的权重和前向循环层维度一样 【这里说的只是维度,但数据不同,反向循环不能复用前向循环的参数】,偏置长度也为 。所以整个参数的个数为: 。
前向计算结果一致
结果一致,整个双向LSTM验证通过,存储和计算的流程验证和我想象中的一样。
一般的前馈网络就是:输入->处理->输出,但是对于序列或者依赖于时间的信号,比如音乐,视频,传感器数据等,就不是很适用。循环神经网络能把整个序列的行为在模型内建模出来。最初的循环神经网络模型在1970到1980年提出来的,简单的循环神经网络或者叫Elamn network是由Jeff Elman在1990年于 Finding Structure in Time 中提出来的。当前时刻的输入乘以权重之后,加上额外的来自上一个时间的隐藏状态(hidden state),得到当前时刻的输出以及传向下一个时刻的隐藏状态。循环的圈的意思就是,用现在和不久之前的信息得到现在的输出。展开之后的每一个单元都有着相同的权重(其实就是同一个)。
那么隐藏状态是怎么计算的,输入和隐藏状态又是怎么得到输出的?
隐藏状态:
输出:
序列之间的关系有:一对一(图片分类),一对多(图片说明),多对一(语义分析),多对多(视频分类)。
深度RNN多个单元叠加在一起,在每个时间上可以有更深层的网络。
参考:
[1] https://stackoverflow.com/questions/43034960/many-to-one-and-many-to-many-lstm-examples-in-keras
[2] How to Scale Data for Long Short-Term Memory Networks in Python
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)