在Keras中实施注意力

时间:2019-03-14 14:25:44

标签: python tensorflow machine-learning keras deep-learning

我正在尝试通过一个简单的lstm在keras中实现关注:

model_2_input = Input(shape=(500,))
#model_2 = Conv1D(100, 10, activation='relu')(model_2_input)
model_2 = Dense(64, activation='sigmoid')(model_2_input)
model_2 = Dense(64, activation='sigmoid')(model_2)

model_1_input = Input(shape=(None, 2048))
model_1 = LSTM(64, dropout_U = 0.2, dropout_W = 0.2, return_sequences=True)(model_1_input)
model_1, state_h, state_c = LSTM(16, dropout_U = 0.2, dropout_W = 0.2, return_sequences=True, return_state=True)(model_1) # dropout_U = 0.2, dropout_W = 0.2,


#print(state_c.shape)
match = dot([model_1, state_h], axes=(0, 0))
match = Activation('softmax')(match)
match = dot([match, state_h], axes=(0, 0))
print(match.shape)

merged = concatenate([model_2, match], axis=1)
print(merged.shape)
merged = Dense(4, activation='softmax')(merged)
print(merged.shape)
model = Model(inputs=[model_2_input , model_1_input], outputs=merged)
adam = Adam()
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])

我遇到了以下错误:

merged = concatenate([model_2, match], axis=1)
  

'输入了形状:%s'%(input_shape))ValueError:A Concatenate   图层需要输入的形状与concat轴一致,但concat轴除外。   得到了输入形状:[[None,64),(16,1)]

实现非常简单,只需将lstm输出的点积与隐藏状态一起使用,并将其用作加权函数即可计算隐藏状态本身。

如何解决该错误?尤其是如何使注意力概念发挥作用?

1 个答案:

答案 0 :(得分:1)

您可以在连接之前添加一个Reshape图层以确保兼容性。 请参阅keras文档here。 最好重塑model_2输出(None, 64)

编辑:

基本上,您需要在连接之前添加具有目标形状的Reshape图层:

model_2 = Reshape(new_shape)(model_2)

这将返回(batch_size, (new_shape)) 当然,您可以重塑网络的任一分支,只需使用model_2输出,因为它是一个更简单的示例

话虽如此,也许值得重新考虑您的网络结构。特别是,此问题源于第二个点层(仅给您16个标量)。因此,很难重塑形状以使两个分支匹配。

在不知道模型试图预测什么或训练数据看起来如何的情况下,很难评论是否需要两个点,但是潜在的重组将解决这个问题。