在 Pytorch 中实现有状态 LSTM/ConvLSTM 的最佳方式是啥?

Posted

技术标签:

【中文标题】在 Pytorch 中实现有状态 LSTM/ConvLSTM 的最佳方式是啥?【英文标题】:The best way to implement stateful LSTM/ConvLSTM in Pytorch?在 Pytorch 中实现有状态 LSTM/ConvLSTM 的最佳方式是什么? 【发布时间】:2021-07-02 21:04:54 【问题描述】:

我正在尝试使用 ConvLSTM 来提高具有顺序信息的对象检测任务的性能。

典型的 ConvLSTM 模型采用形状为 (samples, time_steps, channels, rows, cols) 的 5D 张量作为输入。

as stated in this post,需要在 Pytorch ConvLSTM 层中将 500 张图像的长序列拆分成更小的片段。例如,它可以分成 10 个片段,每个片段有 50 个时间步。


我有两个目标:

    我希望网络记住 10 个片段序列的状态。 IE。如何在片段之间传递隐藏状态?

    我想一张一张地输入(视频的)图像。 IE。 500 张图像的长序列被分成 500 个片段,每个片段只有一张图像。输入应该类似于(all_samples, channels, rows, cols)。这只有在 1.goal 能够实现的情况下才有意义。


我为 Tensorflow 找到了一些好的答案,但我正在使用 Pytorch。

TensorFlow: Remember LSTM state for next batch (stateful LSTM)

The best way to pass the LSTM state between batches

在 Pytorch 中实现有状态 LSTM/ConvLSTM 的最佳方式是什么?

【问题讨论】:

为什么不做一个 3d 卷积? 我认为只保存当前图像和隐藏状态可能比保存一堆图像更有效。因此,我不想在将它们输入 convLSTM 或 3d 卷积之前将它们连接起来,而是要一张一张地输入图像。 【参考方案1】:

我发现this post 有一个很好的例子

model = nn.LSTM(input_size = 20, hidden_size = h_size)
out1, (h1,c1) = model(x1)
out2, (h2,c2) = model(x2, (h1,c1))

【讨论】:

以上是关于在 Pytorch 中实现有状态 LSTM/ConvLSTM 的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在Pytorch中实现WNGrad?

如何在pytorch中实现可微的汉明损失?

如何在 Keras 模型中实现一些可训练的参数,例如 Pytorch 中的 nn.Parameters()?

如何在 Pytorch 中实现 dropout,以及在哪里应用它

在Pytorch中实现相同的卷积

修改现有 Pytorch 代码以在多个 GPU 上运行