Python 如何在Pytorch(lightning)中使用截断反向传播在非常长的序列上运行LSTM?
我有一个很长的时间序列,我想输入一个LSTM,用于每帧的分类 我的数据是按帧标记的,我知道一些罕见的事件自发生以来对分类产生了重大影响 因此,我必须输入整个序列以获得有意义的预测 众所周知,向LSTM中输入很长的序列是次优的,因为梯度像正常RNN一样消失或爆炸Python 如何在Pytorch(lightning)中使用截断反向传播在非常长的序列上运行LSTM?,python,deep-learning,pytorch,lstm,pytorch-lightning,Python,Deep Learning,Pytorch,Lstm,Pytorch Lightning,我有一个很长的时间序列,我想输入一个LSTM,用于每帧的分类 我的数据是按帧标记的,我知道一些罕见的事件自发生以来对分类产生了重大影响 因此,我必须输入整个序列以获得有意义的预测 众所周知,向LSTM中输入很长的序列是次优的,因为梯度像正常RNN一样消失或爆炸 我想使用一种简单的技术,将序列切割为较短(比如,100长)的序列,并在每个序列上运行LSTM,然后传递最终的LSTM隐藏和单元状态,作为下一个正向传递的开始隐藏和单元状态 是我发现的一个这样做的人的例子。在那里它被称为“经过时间的截断反
我想使用一种简单的技术,将序列切割为较短(比如,100长)的序列,并在每个序列上运行LSTM,然后传递最终的LSTM隐藏和单元状态,作为下一个正向传递的开始隐藏和单元状态 是我发现的一个这样做的人的例子。在那里它被称为“经过时间的截断反向传播”。我不能为自己做同样的工作
我尝试Pytorch lightning(去掉不相关的部分): 运行此代码会出现以下错误: 如果我加上
def on_after_backward(self) -> None:
self._last_h_n.detach()
self._last_c_n.detach()
如果我使用
lstm_out, (self._last_h_n, self._last_c_n) = self._lstm1(orig_batch,)
但显然这是无用的,因为当前帧批的输出不会转发到下一个帧批
是什么导致了这个错误?我认为分离输出
h\u n
和c\u n
应该足够了
如何将上一个帧批的输出传递到下一个帧批,并让火炬分别反向传播每个帧批?显然,我错过了
分离()的尾随:
使用
工作
问题出在self上。_last_h_n.detach()
不会更新对detach()分配的新内存的引用,因此图形仍在反引用backprop经过的旧变量。
通过H=H.detach()
解决了这个问题
清理器(可能更快)是self.\u last\u h\u n.detach()
,它执行适当的操作
def on_after_backward(self) -> None:
self._last_h_n.detach()
self._last_c_n.detach()
lstm_out, (self._last_h_n, self._last_c_n) = self._lstm1(orig_batch,)
def on_after_backward(self) -> None:
self._last_h_n.detach_()
self._last_c_n.detach_()