Я пытаюсь реализовать внимание в кератах с помощью простой lstm:
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: Для слоя Concatenate
требуются входные данные с соответствующими формами, за исключением оси concat.Получил входные формы: [(None, 64), (16, 1)]
Реализация очень проста, достаточно взять точечное произведение вывода lstm и со скрытыми состояниями и использовать его в качестве функции взвешиваниявычислить само скрытое состояние.
Как устранить ошибку?Особенно, как заставить работать концепцию внимания?