【问题标题】:How can I adapt my working tensorflow model to use bidirectional LSTM?如何调整我的工作张量流模型以使用双向 LSTM?
【发布时间】:2020-01-21 16:24:11
【问题描述】:

目前我有一个模型可以达到大约 81% 的准确率。我正在处理的数据是连续的,所以我想尝试包含一个双向 LSTM 层,看看这是否可以提高性能。

我的数据是字母序列,例如ABCD。为了通过我的模型传递序列,我使用 one-hot 编码。所以ABCD 可能会变成:

[ [1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0] ]

注意 - 序列实际上有 300 个字符长,但为了这个问题,我想让前面的示例保持简单。

所以目前我的模型看起来像这样:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(300, 6)),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(128, activation='tanh'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(64, activation='tanh'),
    keras.layers.Dense(1, activation='sigmoid')
])

所以输入形状显示每个序列有 300 个字母长,有 6 个字母可供选择。这个模型有效。

现在我想调整我的模型以使用双向 LSTM 层,据我了解,这可能会为我提供更好的序列数据性能。但是,我很难理解如何调整这个模型来实现这一点。我尝试了各种不同的图层排列,但我遇到了与维度有关的错误。

我想要一些类似的东西:

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(300, 6)),
    keras.layers.Bidirectional(LSTM(64)),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(128, activation='tanh'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(64, activation='tanh'),
    keras.layers.Dense(1, activation='sigmoid')
])

我希望对双向 LSTM 有更好理解的人能够就如何做到这一点提供一些指导。谢谢。

【问题讨论】:

    标签: python tensorflow lstm recurrent-neural-network one-hot-encoding


    【解决方案1】:

    TL;DR:删除Flatten

    一旦你做了Flatten 层,你的输入就会失去顺序结构。它将形状 b × 300 × 6 变成 b × 1800,其中 b 是您的批量大小。每个训练样例都由一个 1800 维的向量表示,没有维度,LSTM 会不断迭代。

    我还会考虑将tanh 激活替换为relu,这样您至少可以部分避免渐变消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2020-04-09
      • 2017-12-20
      相关资源
      最近更新 更多