Я пытаюсь создать сиамскую сеть, используя Keras (tf в качестве бэкэнда), для поиска повторяющихся вопросов. Но я сталкиваюсь с проблемой несоответствия формы в выходном слое, показывая выходную форму как (64, 1), даже если выходные данные имеют форму (64,).
Вот так выглядит моя модель:
inp_layer_1 = Input((maxlen,))
embed_1 = Embedding(n_feat_1+1, embed_size, input_length=maxlen)(inp_layer_1)
bi_layer_1 = Bidirectional(LSTM(128, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))(embed_1)
avg_pool_1 = GlobalAveragePooling1D()(bi_layer_1)
drop_1 = Dropout(0.2)(avg_pool_1)
dense_1 = Dense(256, activation='relu')(drop_1)
out_1 = Lambda(lambda x: K.l2_normalize(x, axis=1))(dense_1)
inp_layer_2 = Input((maxlen,))
embed_2 = Embedding(n_feat_2+1, embed_size, input_length=maxlen)(inp_layer_2)
bi_layer_2 = Bidirectional(LSTM(128, return_sequences=True, dropout=0.2, recurrent_dropout=0.2))(embed_2)
avg_pool_2 = GlobalAveragePooling1D()(bi_layer_2)
drop_2 = Dropout(0.2)(avg_pool_2)
dense_2 = Dense(256, activation='relu')(drop_2)
out_2 = Lambda(lambda x: K.l2_normalize(x, axis=1))(dense_2)
lambda_merge = Lambda(eucl_dist)([out_1, out_2])
final_model = Model(inputs=[inp_layer_1, inp_layer_2], outputs=lambda_merge)
Итак, в основном я пытаюсь найти евклидово расстояние между выходами из двух моделей, представляющее два вопроса. Кроме того, maxlen = 100 , n_feat_1 и n_feat_2 - это число функций (токенов) для всех вопросов1 и вопросов2 соответственно.
Вот как я создаю партии образцов:
def _get_train_batch(batch_size=64):
X = []
idx = np.random.choice(404290, batch_size)
X.append(ques1_train[idx])
X.append(ques2_train[idx])
X = np.asarray(X)
y = train_df.iloc[idx, 5].values
return [X[0, :, :], X[1, :, :]], y
В приведенном выше коде ques1_train - это массив фигур (404290, maxlen = 100), состоящий из последовательностей токенов из словаря вопроса 1 из обучающего набора. Аналогичный случай для Ques2_train . train_df - это тренировочный кадр данных формы (404290, 6), из которого я беру результат (1 или 0), для того, являются ли два вопроса одинаковыми (1) или нет (0).
Вот мой тренировочный код:
loss = []
for ep in range(1):
for it in range(404290 // 64):
X, y = _get_train_batch()
print (y.shape)
loss.append(final_model.train_on_batch(X, y))
И вот ошибка, которую я получаю (изображение):
valuerror
Как вы можете видеть, фигура, напечатанная в первой строке, является формой моего вывода (64,). Забавно, я создал сиамскую сеть для классификации изображений, используя почти похожий код, и это сработало.
Буду благодарен за понимание.
Спасибо
Анкит Паливал