循环神经网络 —— 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
===============================================
必须要承认,由于平时很少用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。
===============================================
posted on 2023-11-02 15:53 Angry_Panda 阅读(169) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2022-11-02 阿里应该不应该给公众一个交代——教师使用钉钉上网课“遭黑客攻击网暴”后死亡
2022-11-02 国产深度学习框架MindSpore的高校发展之旅——“样本点”计划