Keras - неправильная форма ввода в плотном слое LSTM - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь построить текстовый классификатор 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, который содержит предложения.

1 Ответ

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

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

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_sequence = True

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

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

...