我正在将keras
LSTM
用于回归模型。我想对原始输入内容使用一种注意力机制,如本paper所述。
本文介绍了如何构建自定义的Attention层,该层在提供给LSTM
之前为原始输入赋予权重。我想利用新的keras Attention
层。在研究了如何实现这一点之后,我想到了以下模型:
sequence_input = layers.Input(shape=(time_steps, features), dtype='float32')
lstm, state_h, state_c = layers.LSTM(units=50,
dropout=0.1,
activation='tanh',
return_state=True,
kernel_regularizer=1e-6,
recurrent_regularizer=1e-4,
bias_regularizer=1e-6,
return_sequences=True)(sequence_input)
context_vector, attention_weights = layers.Attention()([lstm, state_h])
output = Dense(units=1)(context_vector)
model = tf.keras.Model(inputs=sequence_input, outputs=output)
上面的模型在编译TypeError
层时给出了下面的Attention
:
TypeError: Cannot iterate over a tensor with unknown first dimension.
这是因为sequence_input
,lstm
和state_h
的第一维是None
。我是Attention
层的新手,我很确定自己缺少一些东西。 keras documentation仅具有一个示例,其中Embedding
层紧随Input
层,对于每个样本均为float
的预测回归模型,我不需要这样做。>
PS:注意层之后可能还有其他问题。我尚未能够首先解决该问题。不声称此实现是正确的。
一个问题是我正在将2D张量传递给Attention()。隐藏状态具有形状(无,50)。 LSTM不应为每个功能都具有隐藏状态,即(None,50,10)?,在this question之后,似乎应该将隐藏状态作为值传递。所以我不确定为什么尺寸不正确。