他们似乎使用了一个共享的 RNN,它在单个像素的串联通道序列上按顺序处理每一行。从纸上

最后使用渠道实施
让 ConvNet 的输出大小为(batch_size, height, width, channels)。RNN 需要一个大小为 (batch_size, sequence_length, input_size) 的输入。因此,您必须使用以下对应关系对其进行重塑。
batch_size*height -> batch_size
channels -> input_size
width -> sequence_length
并使用相同的 RNN 处理每一行(沿height维度)并连接结果。
为此,我们只需重塑以将批次和高度轴合并为一个维度,以便我们的 RNN 将独立处理列。
rnn_input = keras.layers.Reshape((batch_size*height, width, channels))(convnet_output)
rnn_output = keras.layers.RNN(hidden_dim, return_sequences=True)(rnn_input)
rnn_output会有形状(batch_size*height, width, hidden_dim)。然后,您可以使用带有 tanh 激活的密集层将此张量组合到上下文向量中,正如论文中所写的那样。
本文还使用 RNN 的可训练初始状态,您可能对这个库感兴趣来实现它。
先用渠道实现
如果您使用 设置Conv2D图层"channels_first",则输出convnet_output的大小为(batch_size, channels, height, width)。因此,您需要先置换尺寸,然后再进行整形。
convnet_output = keras.layers.Permute((0, 2, 3, 1))(convnet_output)
经过这一步,convnet_output就有了维度(batch_size, height, width, channels)。然后,您可以像以前一样继续,重塑并馈送到 RNN。
rnn_input = keras.layers.Reshape((batch_size*height, width, channels))(convnet_output)
rnn_output = keras.layers.RNN(hidden_dim, return_sequences=True)(rnn_input)