Keras - неправильная форма ввода в плотном слое lstm

Я пытаюсь создать классификатор текста lstm, используя Keras.

Это структура модели:

model_word2vec = Sequential()
model_word2vec.add(Embedding(input_dim=vocabulary_dimension,
                    output_dim=embedding_dim,
                    weights=[word2vec_weights,
                    input_length=longest_sentence,
                    mask_zero=True,
                    trainable=False))
model_word2vec.add(LSTM(units=embedding_dim, dropout=0.25, recurrent_dropout=0.25, return_sequences=True))
model_word2vec.add(Dense(3, activation='softmax'))
model_word2vec.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


results = model_word2vec.fit(X_tr_word2vec, y_tr_word2vec, validation_split=0.16, epochs=3, batch_size=128, verbose=0)

Где y_tr_word2vec - это трехмерная кодированная переменная one-hot.

Когда я запускаю приведенный выше код, я получаю такую ​​ошибку:

ValueError: Error when checking model target: expected dense_2 to have 3 dimensions, but got array with shape (15663, 3)

Я предполагаю, что проблема может быть в форме y_tr_word2vec или размере batch size, но я не уверен.

Обновлять:

Я заменил return_sequences=False, y_tr_word2vec с one-hot на categorical, нейрон 1 в плотном слое, и теперь я использую sparse_categorical_crossentropy вместо categorical_crossentropy.

Теперь я получаю эту ошибку: ValueError: invalid literal for int() with base 10: 'countess'.

Поэтому теперь я предполагаю, что во время fit() что-то не так с входным вектором X_tr_word2vec, который содержит предложения.

вы пробовали keras.utils.to_categorical (y_tr_word2vec, num_classes = 3)? Кажется, ваш ввод в модель неверен.

Amir 13.09.2018 19:08

Количество нейронов в ваших моделях определяется переменными, которые мы не можем видеть, пожалуйста, опубликуйте их. Я имею в виду vocabulary_dimension, embedding_dim и, если есть, другие. Также dim_embedding и embedding_dim - две разные вещи, это предназначено?

Daneel R. 13.09.2018 20:05

@DanielR. Это та же переменная, тест я обновил.

Simone 14.09.2018 12:15

@AmirHadifar Я пробовал, как писал в обновлениях. Теперь я получаю эту ошибку: ValueError: invalid literal for int() with base 10: 'countess'.

Simone 14.09.2018 12:45
1
4
280
1

Ответы 1

Проблема в этом коде

model_word2vec.add(LSTM(units=dim_embedding, dropout=0.25, recurrent_dropout=0.25, return_sequences=True))
model_word2vec.add(Dense(3, activation='softmax'))

Вы установили return_sequences=True, что означает, что LSTM вернет трехмерный массив в плотный слой, тогда как для плотного не требуются трехмерные данные ... поэтому удалите return_sequences = True

model_word2vec.add(LSTM(units=dim_embedding, dropout=0.25, recurrent_dropout=0.25))
model_word2vec.add(Dense(3, activation='softmax'))

почему вы установили return_sequences = True?

Я пробовал, но теперь у меня '[12406 9070 6608 9899 7373 5589 ......] are not in index.

Simone 14.09.2018 12:20

Другие вопросы по теме