“将 CNN 的特征更改为网格以馈入 RNN 编码器?” 这是什么意思?

数据挖掘 机器学习 神经网络 深度学习 nlp 美国有线电视新闻网
2022-03-02 23:58:58

因此,在从图像中提取 OCR pr LaTex 公式的论文What You Get Is What You See: A Visual Markup Decompiler中,他们将 CNN 的特征传递给 RNN 编码器。但存在的问题是,他们没有直接传递特征,而是提出了一种解决方案,将其更改为网格。

从 CNN 中提取特征,然后将这些提取的特征排列在网格中以传递给 RNN 编码器。这是他们使用的确切语言。

这是什么意思?从理论上讲,如果我有一个CNN没有任何密集/全连接层并产生一个输出[batch,m*n*C],那么我怎样才能以grid??的形式更改它?请看下面的图片。因此,在从 . 获取输出后CNN,他们在将其传递给RNN. 可以使用什么方法来实现这种转换?

在此处输入图像描述

所以如果我必须传递一些东西keras.layers.RNN()(that_desired_grid_format),这个网格格式应该是什么,我该如何改变它?

1个回答

他们似乎使用了一个共享的 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)