0
点赞
收藏
分享

微信扫一扫

循环神经网络 —— LSTM 有状态模型(stateful LSTM)和无状态模型(stateless LSTM)

 

相关参考:

训练后的LSTM模型在进行预测时的初始h_n和c_n是什么或应该怎么设置?


 

 

Keras中对RNN网络的statefull和stateless设置:

链接:https://keras.io/zh/getting-started/faq/#how-can-i-use-stateful-rnns

 

循环神经网络 —— LSTM 有状态模型(stateful LSTM)和无状态模型(stateless LSTM)_赋值

循环神经网络 —— LSTM 有状态模型(stateful LSTM)和无状态模型(stateless LSTM)_默认值_02

 

 

===============================================

 

 

必须要承认,由于平时很少用RNN,所以对于LSTM的stateful和stateless这两者的区别也是头一次听说。

 

 

首先我们要知道LSTM的初始值这个概念,LSTM在初始时框架一般默认对初始值h_0和c_0赋值为0,具体见pytorch官方文档:

https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html#torch.nn.LSTM

 

循环神经网络 —— LSTM 有状态模型(stateful LSTM)和无状态模型(stateless LSTM)_赋值_03

 

 

知道了这个初始值的概念后我们可以知道LSTM在每个batch的训练和预测时都是会使用这个默认值的,也就是说每个batch时h_0和c_0都是被设置为0的,由于在LSTM这样的RNN网络中每个sample都是一个时序类型的数据,因此在一个batch的计算中每个sample在计算不同时间步时上一时间步计算得到的h_t和c_t会作为t+1步时的h_0和c_0的输入值,但是当每个batch计算结束后计算下个batch数据时默认都是将h_0和c_0默认赋值为0的。但是,有时候可能sample过长,我们可以把原本的一个sample切分成前后两个sample,也可能本身sample之间就具备时序关系,这时候在一个epoch中计算上下两个batch时如果将上一个batch计算结束时的h_0和c_0作为下个batch计算时的初始值会提升模型的性能,而这种方式的LSTM则被称为stateful,而默认的那种前后batch都将初始值设置为0的默认方式被称为stateless。

 

框架中使用staleful的LSTM时需要保证上下batch中batch_size是相同的,并且batch内的sample不能shuffle;而且要知道只有少数的情况,如前后batch的数据有时序关联的情况下才适合使用stateful的LSTM,否则适用于默认的stateless的LSTM。

 

 

 

 

===============================================

 

 

 

 

 

举报

相关推荐

0 条评论