这个问题相当抽象,不一定与 tensorflow 或 keras 相关。假设你想训练一个语言模型,并且你想为你的 LSTM 使用不同大小的输入。特别是,我正在关注这篇论文:https ://www.researchgate.net/publication/317379370_A_Neural_Language_Model_for_Query_Auto-Completion 。
除其他外,作者使用词嵌入和字符的单热编码。最有可能的是,这些输入中的每一个的维度都不同。现在,为了将其输入网络,我看到了一些替代方案,但我确定我遗漏了一些东西,我想知道应该如何完成。
- 创建一个形状的 3D 张量(instances, 2, max(embeddings,characters))。也就是说,用 0 填充较小的输入。
- 创建一个形状的 3D 张量(实例、嵌入+字符、1))。也就是说,连接输入。
在我看来,这两种选择都不利于有效地训练模型。那么,解决这个问题的最佳方法是什么?我看到作者为此目的使用了嵌入层,但从技术上讲,这意味着什么?
编辑
这里有更多细节。我们将这些输入称为 X(字符级输入)和 E(字级输入)。在序列(文本)的每个字符上,我计算 x、e 和 y,即标签。
x
: 字符 one-hot 编码。我的字符索引大小为 38,所以这是一个用 37 个零和一个 1 填充的向量。e
:预先计算的 200 维的词嵌入。如果字符是空格,我获取序列中前一个词的词嵌入,否则,我为不完整的词分配向量 (INC
,大小也是 200)。带有“红色汽车”序列的真实示例:r>INC, e>INC, d>INC, _>embeddings["red"], c>INC, a>INC, r>INC
.y
:要预测的标签,即下一个字符,one-hot 编码。此输出具有相同的维度,x
因为它使用相同的字符索引。在上面的示例中,对于“r”,y
是“e”的 one-hot 编码。