Keras-- низкая точность со слоем LSTM, но точность хорошая без LSTM - PullRequest
0 голосов
/ 18 ноября 2018

Я тренирую модель в Керасе с набором данных IMDB. Для этой модели со слоем LSTM точность составляет около 50%:

 model = Sequential()
 model.add(Embedding(max_features, 32))
 model.add(LSTM(32, return_sequences=True))
 model.add(LSTM(32, return_sequences=True))
 model.add(LSTM(32))
 model.add(Dense(1, activation='sigmoid'))

Точность:

loss: 0.6933 - acc: 0.5007 - val_loss: 0.6932 - val_acc: 0.4947

Я также пробовал с одним слоем LSTM, но он также дает аналогичную точность.

Однако, если я не использую слой LSTM, точность достигает примерно 82%

model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l1(0.001), activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l1(0.001), activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

Точность:

 loss: 0.6738 - acc: 0.8214 - val_loss: 0.6250 - val_acc: 0.8320

Вот как я собираю и подгоняю модель:

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.fit(partial_x_train, partial_y_train, epochs=Numepochs, batch_size=Batchsize, validation_data=(x_val, y_val))

Как это можно объяснить? Я думал, что LSTM отлично работает для последовательных текстовых данных?

1 Ответ

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

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

Теперь проблема в вашем случае заключается в том, что используемый вами этап предварительной обработки не является подходящим для модели LSTM.Вы кодируете каждое предложение как вектор, где каждый из его элементов представляет наличие или отсутствие определенного слова.Таким образом, вы полностью игнорируете порядок появления слов в предложении, какой уровень LSTM хорош для его моделирования.Существует также другая проблема в вашей модели LSTM, учитывая использованную вами схему предварительной обработки, а именно тот факт, что уровень Embedded принимает индексы слов в качестве входных данных, а не вектор с нулем и единицей (т. Е. С выходной информацией этапа предварительной обработки).

Поскольку данные IMDB уже хранятся в виде последовательностей индексов слов, для решения этой проблемы вам просто нужно предварительно обработать данные IMDB, только дополняя / обрезая последовательности определенной длины, чтобы иметь возможность использовать пакетную обработку.Например:

from keras.preprocessing.sequences import pad_sequences

vocab_size = 10000 # only consider the 10000 most frequent words
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=vocab_size)

x_train = pad_sequences(x_train, maxlen=500)  # truncate or pad sequences to make them all have a length of 500

Теперь x_train будет иметь форму (25000, 500) и состоит из 25000 последовательностей длиной 500, закодированных в виде целочисленных индексов слов.Теперь вы можете использовать его для обучения, передав его методу fit.Я полагаю, что вы можете достичь как минимум 80% точности обучения со слоем Embedded и одним слоем LSTM.Не забывайте, что использовать схему проверки для отслеживания переоснащения (один простой вариант - установить аргумент validation_split при вызове метода fit).

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