相关参考:
训练后的LSTM模型在进行预测时的初始h_n和c_n是什么或应该怎么设置?
Keras中对RNN网络的statefull和stateless设置:
链接:https://keras.io/zh/getting-started/faq/#how-can-i-use-stateful-rnns
===============================================
必须要承认,由于平时很少用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在每个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。
===============================================
标签:stateless,模型,初始值,stateful,batch,sample,LSTM From: https://blog.51cto.com/u_15642578/8598594