我正在尝试通过一个简单的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输出的点积与隐藏状态一起使用,并将其用作加权函数即可计算隐藏状态本身。
如何解决该错误?尤其是如何使注意力概念发挥作用?
答案 0 :(得分:1)
您可以在连接之前添加一个Reshape图层以确保兼容性。
请参阅keras文档here。
最好重塑model_2输出(None, 64)
编辑:
基本上,您需要在连接之前添加具有目标形状的Reshape图层:
model_2 = Reshape(new_shape)(model_2)
这将返回(batch_size, (new_shape))
当然,您可以重塑网络的任一分支,只需使用model_2输出,因为它是一个更简单的示例
话虽如此,也许值得重新考虑您的网络结构。特别是,此问题源于第二个点层(仅给您16个标量)。因此,很难重塑形状以使两个分支匹配。
在不知道模型试图预测什么或训练数据看起来如何的情况下,很难评论是否需要两个点,但是潜在的重组将解决这个问题。