Использование встраивания слоя с GRU - PullRequest
0 голосов
/ 23 января 2019

У меня есть рабочий код, использующий 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,)

Итак, мой вопрос: в чем разница между подгонкой трехмерного массива, созданного вручную, и созданного слоя встраивания?.

1 Ответ

0 голосов
/ 23 января 2019

Ваша модель отражает желаемые вычисления;однако ошибка - Y, которую вы передаете модели.Вы передаете скалярную цель вместо массива размером (64,).Чтобы уточнить, ваши входные данные должны быть последовательностью целых чисел, но вашими целями по-прежнему должны быть векторы.

Кроме того, Dense по умолчанию имеет линейную активацию, поэтому вам не нужно Activation('linear') после Dense(64).

...