我有一个由一个 LSTM 和两个 Dense 层组成的简单网络,如下所示:
model = tf.keras.Sequential()
model.add(layers.LSTM(20, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(layers.Dense(20, activation='sigmoid'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error')
它对具有 3 个输入(标准化 0 到 1.0)和 1 个输出(二进制)的数据进行训练,以进行分类。数据是时间序列数据,其中时间步之间存在关系。
var1(t) var2(t) var3(t) var4(t)
0 0.448850 0.503847 0.498571 0.0
1 0.450992 0.503480 0.501215 0.0
2 0.451011 0.506655 0.503049 0.0
该模型的训练方式如下:
history = model.fit(train_X, train_y, epochs=2800, batch_size=40, validation_data=(test_X, test_y), verbose=2, shuffle=False)
model.summary()
给出模型摘要:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, 20) 1920
_________________________________________________________________
dense (Dense) (None, 20) 420
_________________________________________________________________
dense_1 (Dense) (None, 1) 21
=================================================================
Total params: 2,361
Trainable params: 2,361
Non-trainable params: 0
该模型运行得相当好。现在我尝试用注意力层替换 Dense(20) 层。所有在线示例、教程等(包括 TF 文档)都是针对在输入层具有嵌入层的 seq2seq 模型。我了解 TF v1.x 中的 seq2seq 实现,但我找不到任何有关我正在尝试执行的操作的文档。我相信新的 API (v2.0) 我需要做这样的事情:
lstm = layers.LSTM(20, input_shape=(train_X.shape[1], train_X.shape[2]), return_sequences=True)
lstm = tf.keras.layers.Bidirectional(lstm)
attention = layers.Attention() # this does not work
model = tf.keras.Sequential()
model.add(lstm)
model.add(attention)
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error')
当然我得到了错误“注意力层必须在输入列表上调用,即 [query, value] 或 [query, value, key]"
我不明白版本(2.0)和这种情况(具有固定长度输入的时间序列数据)的解决方案。欢迎任何关于增加对此类问题的关注的想法。