我有一个可以完美地以这种形式工作的模型:
但是我想要的是这样:
我被困在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()