有没有一种方法可以在TensorFlow Keras中从3D输入数据转换为2D输出数据(从LSTM(x,y,z)到返回序列的顺序是density(1,1))

时间:2020-06-23 21:01:51

标签: python tensorflow keras lstm attention-model

我有一个可以完美地以这种形式工作的模型:

enter image description here

但是我想要的是这样:

enter image description here

我被困在catch-22中,如果我将输出数据保留为3D(在第一个示例中有效),Tensorflow会抱怨“ ValueError:传递了形状为(85,400,1)的目标数组作为输出(1、1)的形状。”如果我将输出数据更改为2D,则Tensorflow会抱怨“ ValueError:输入数组应与目标数组具有相同数量的样本。”

注意力层是一个自定义层,它会做应该做的注意力(据我所知)。它从LSTM获取完整的序列集(将返回序列设置为true),并将它们“压缩”为一个单一的集合,就像将返回序列设置为false一样,然后将其传递给下一层。默认情况下,下一层是2D。抛开这是否一个好主意,我想我只需要一个通用的答案,即允许从3D到允许训练的2D。我觉得答案是如何计算损失,但我找不到答案。另一个可能的答案是内置TF2内置注意机制与嵌入层配合使用的方式,其中嵌入层在关注LSTM的情况下处理从2D到3D,然后再处理到输出层的2d。因此,允许2D到3D到2D的通用解决方案可能会起作用,但这似乎令人怀疑,而且不符合我要尝试做的事情。

我想做的是在时态二进制分类问题中使用带有LSTM的注意机制,按照定义,注意需要将所有序列作为输入,但是仅返回单个序列(即像设置了返回序列的LSTM一样)错误)。所以以某种方式我需要输入为3D,输出为2D。

这有效...

    model = tf.keras.models.Sequential()
    model.add(layers.LSTM(cfg.LSTM, batch_input_shape=(BATCH_SIZE,
              cfg.TIMESTEPS,
              cfg.FEATURES),
              stateful=True,
              return_sequences=True))
    model.add(layers.TimeDistributed(layers.Dense(cfg.DENSE)))
    model.add(layers.Dense(OUTPUT, activation='sigmoid'))
    model.compile(loss="mse", optimizer='adam', metrics=['accuracy'])
    model.summary()

这不是...

    model = tf.keras.models.Sequential()
    model.add(layers.LSTM(cfg.LSTM, batch_input_shape=(BATCH_SIZE,
              cfg.TIMESTEPS,
              cfg.FEATURES),
              stateful=True,
              return_sequences=True))
    model.add(AttentionLayer())
    model.add(layers.Dense(OUTPUT, activation='sigmoid'))
    model.compile(loss="mse", optimizer='adam', metrics=['accuracy'])
    model.summary()

0 个答案:

没有答案