Керас: Невозможно передать значение формы (64, 1) для Тензорного, имеющего форму '(?,)' - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь создать сиамскую сеть, используя 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,). Забавно, я создал сиамскую сеть для классификации изображений, используя почти похожий код, и это сработало.

Буду благодарен за понимание.

Спасибо Анкит Паливал

1 Ответ

0 голосов
/ 18 сентября 2018

Эй, я не знаю, если у вас все еще есть эта проблема. У меня было то же самое со смесью tensorflow и keras. В конце концов, уточнение output_shape последнего лямбда-слоя решило это. Для вас это будет: Lambda(eucl_dist,,output_shape = (1,))([out_1, out_2]) (Если я прав)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...