У меня есть рабочий код, использующий GRU, создающий ввод вручную в виде трехмерного массива (нет, 10,64). Код:
model = Sequential()
model.add(GRU(300, return_sequences=False, input_shape=(None, 64)))
model.add(Dropout(0.8))
model.add(Dense(64, input_dim=300))
model.add(Activation("linear"))
Возвращает прогнозируемое вложение с учетом окна ввода. Теперь я хочу использовать слой встраивания keras поверх GRU. Моя идея состоит в том, чтобы ввести двумерный массив (None, 10) и использовать слой внедрения, чтобы преобразовать каждый образец в соответствующий вектор внедрения.
Так что теперь у меня есть это:
model = Sequential()
model.add(Embedding(vocab_size, 64, weights=[embedding_matrix], input_length=10, trainable=False))
model.add(GRU(300, return_sequences=False))
model.add(Dropout(0.8))
model.add(Dense(64))
model.add(Activation("linear"))
Из сводки видно, что выходной слой для встраивания:
embedding_2 (Embedding) (None, 10, 64)
что я и ожидал. Но когда я пытаюсь соответствовать модели, я получаю эту ошибку:
expected activation_2 to have shape (64,) but got array with shape (1,)
Если я прокомментирую другие слои и оставлю только вложение и gru, я получу:
expected gru_5 to have shape (300,) but got array with shape (1,)
Итак, мой вопрос: в чем разница между подгонкой трехмерного массива, созданного вручную, и созданного слоя встраивания?.