我正在尝试用Pytorch实现Pixel RNN,但似乎找不到任何相关文档。Pixel RNN的主要部分是行LSTM和双对角LSTM,所以我在寻找这些算法的代码,以便更好地理解它们的运作原理。特别是,我对这些算法如何分别计算一行和一个对角线感到困惑。任何帮助都将不胜感激。
回答:
总结
这里是一个正在进行中的部分实现:
https://github.com/carpedm20/pixel-rnn-tensorflow
这里是Google DeepMind对行LSTM和双对角LSTM的描述:
https://towardsdatascience.com/summary-of-pixelrnn-by-google-deepmind-7-min-read-938d9871d6d9
行LSTM
来自链接的DeepMind博客:
一个像素的隐藏状态,如下图中的红色,是基于它之前的三个像素的“记忆”。因为它们位于同一“行”中,我们可以并行计算,加速计算。我们牺牲了一些上下文信息(使用更多的历史或记忆),以换取这种并行计算的能力,从而加速训练。
实际实现依赖于其他几种优化,并且相当复杂。来自原始论文:
计算过程如下。一个LSTM层有一个输入到状态的组件和一个循环状态到状态的组件,它们一起决定LSTM核内的四个门。为了增强行LSTM的并行化,首先计算整个二维输入图的输入到状态组件;为此使用k × 1卷积来跟随LSTM本身的行方向。卷积被掩盖以仅包括有效的上下文(见第3.4节),并产生一个大小为4h × n × n的张量,表示输入图中每个位置的四个门向量,其中h是输出特征图的数量。为了计算LSTM层的状态到状态组件的一步,给定前一个隐藏和细胞状态hi−1和ci−1,每个大小为h × n × 1。新的隐藏和细胞状态hi , ci如下获得:
其中xi大小为h × n × 1,是输入图的第i行,~表示卷积操作和逐元素乘法。权重Kss和Kis是状态到状态和输入到状态组件的核权重,后者如上所述预先计算。对于输出、遗忘和输入门oi , fi和ii,激活函数σ是逻辑Sigmoid函数,而对于内容门gi,σ是tanh函数。每一步一次计算输入图整行的新状态
对角BLSTM
对角BLSTM的开发是为了利用并行化的加速,而不牺牲太多上下文信息。DBLSTM中的一个节点会查看其左侧和上方;由于这些节点也查看左侧和上方,一个给定节点的条件概率在某种意义上依赖于它的所有祖先。否则,架构非常相似。来自DeepMind博客: