tensorflow RNN中如何正确处理one-hot-encoding和多维数据

How to correctly deal with one-hot-encoding and multi-dimensional data in tensorflow RNN

我正在创建一个二元分类器来分类字母序列,例如 'BA'。

每个序列由编码为单热向量的 2 个字母组成。例如,序列 'BA' 是 [[0, 1, 0, 0], [1, 0, 0, 0]]

(我的原始代码中的序列较长,但我想让我的问题保持简单)

我是机器学习的新手,我以前做过一些事情,但只使用了平面输入。我正在努力了解如何将多维输入传递到我的网络中。我需要以某种方式将其压平吗?

我在这里创建了一个最小可重现的示例 - https://www.dropbox.com/s/dhg3huw6bh7dfjd/Example.py?dl=0Sequences 仅包含 3 个训练数据示例以保持简单。我只需要帮助解决如何将 3d 输入传递到我的模型中。

在我提供的代码中,整个数据集如下:

Sequences = [  [[0, 1, 0, 0], [1, 0, 0, 0]]   ,  [[0, 1, 0, 0], [1, 0, 0, 0]]  ,   [[0, 0, 0, 1], [0, 1, 0, 0]]  ]

这是一个二元分类器,这些序列的目标是:

Targets = [1.0, 1.0, 0.0]

如果你运行我提供的代码你应该得到这个错误:

ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 2, 2, 4]

如果有人可以帮助弄清楚如何将序列正确传递到我的网络中,那就太好了。谢谢:)

这一行是罪魁祸首。 LSTM 需要 3 维输入。在您的情况下,您正在尝试传递一个 4 维输入(请记住,Keras 向输入形状添加了一个额外的批处理维度)。因此,去掉第一个 2 将解决您的问题。

model.add(LSTM(128,
                   input_shape=(2, 2, 4), return_sequences=True))

只需将其更改为,

model.add(LSTM(128,
                   input_shape=(2, 4), return_sequences=True))