Python 如何在Pytorch(lightning)中使用截断反向传播在非常长的序列上运行LSTM?

Python 如何在Pytorch(lightning)中使用截断反向传播在非常长的序列上运行LSTM?,python,deep-learning,pytorch,lstm,pytorch-lightning,Python,Deep Learning,Pytorch,Lstm,Pytorch Lightning,我有一个很长的时间序列,我想输入一个LSTM,用于每帧的分类 我的数据是按帧标记的,我知道一些罕见的事件自发生以来对分类产生了重大影响 因此,我必须输入整个序列以获得有意义的预测 众所周知,向LSTM中输入很长的序列是次优的,因为梯度像正常RNN一样消失或爆炸 我想使用一种简单的技术,将序列切割为较短(比如,100长)的序列,并在每个序列上运行LSTM,然后传递最终的LSTM隐藏和单元状态,作为下一个正向传递的开始隐藏和单元状态 是我发现的一个这样做的人的例子。在那里它被称为“经过时间的截断反

我有一个很长的时间序列,我想输入一个LSTM,用于每帧的分类

我的数据是按帧标记的,我知道一些罕见的事件自发生以来对分类产生了重大影响

因此,我必须输入整个序列以获得有意义的预测

众所周知,向LSTM中输入很长的序列是次优的,因为梯度像正常RNN一样消失或爆炸


我想使用一种简单的技术,将序列切割为较短(比如,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_()