Модель Keras LSTM, дающая разные прогнозы для одного и того же ввода, когда размер ввода изменился? - PullRequest
0 голосов
/ 05 марта 2019

Я создаю LSTM для классификации текста в Keras и играю с различными входными предложениями, чтобы понять, что происходит, но я получаю странные результаты. Например:

Предложение 1 = "Во вторник 51-летняя г-жа [Мэри] Барра завершила замечательную личную одиссею, когда ее назвали следующим главным исполнительным директором GM, и первой женщиной, которая поднялась на высшую должность в крупной школе. Автокомпания. "

Приговор 2 = "Во вторник 51-летнюю г-жу [Мэри] Барру назвали следующим главным исполнительным директором G.M. - и первой женщиной, которая взойдет на высшую должность в крупной автомобильной компании."

Модель предсказывает класс «цель» (0), выводит 0,4242, когда Предложение 2 является единственным элементом во входном массиве. Он предсказывает «субъективный» (1), выводит 0,9061 для предложения 1. Если они оба (как отдельные строки) подаются как входные данные в одном и том же массиве, оба классифицируются как «субъективные» (1) - но предложение 1 выдает 0,8689 и 2 выходы 0.5607. Кажется, что они влияют на результаты друг друга. Неважно, какой индекс во входном массиве каждого предложения.

Вот код:

max_length = 500

from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=5000, lower=True,split=' ')
tokenizer.fit_on_texts(dataset["sentence"].values)
#print(tokenizer.word_index)  # To see the dicstionary
X = tokenizer.texts_to_sequences(dataset["sentence"].values)
X = pad_sequences(X, maxlen=max_length)

y = np.array(dataset["label"])

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)

import numpy
from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
# fix random seed for reproducibility
numpy.random.seed(7)


X_train = sequence.pad_sequences(X_train, maxlen=max_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_length)
embedding_vector_length = 32

###LSTM
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
model = Sequential()
model.add(Embedding(5000, embedding_vector_length, input_length=max_length))
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='sigmoid'))
model.add(MaxPooling1D(pool_size=2))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
from keras import optimizers
sgd = optimizers.SGD(lr=0.9)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
print(model.summary())

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=3, batch_size=64)

# save model
model.save('LSTM.h5')

Затем я перезагружаю модель отдельным скриптом и передаю ей жестко закодированные предложения:

model = load_model('LSTM.h5')

max_length = 500

from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=5000, lower=True,split=' ')
tokenizer.fit_on_texts(article_sentences)
#print(tokenizer.word_index)  # To see the dicstionary
X = tokenizer.texts_to_sequences(article_sentences)
X = pad_sequences(X, maxlen=max_length)

prediction = model.predict(X)
print(prediction)
for i in range(len(X)):
    print('%s\nLabel:%d' % (article_sentences[i], prediction[i]))

Я установил случайное начальное число перед тренировкой модели и в сценарии, где я загружаю модель, я что-то упускаю при загрузке модели? Должен ли я размещать свои данные по-другому?

1 Ответ

0 голосов
/ 06 марта 2019

При прогнозировании вы всегда должны соответствовать tokenizer тексту прогноза, поэтому выведите X, возможно, вы найдете разницу между двойным прогнозом.

Значение tokenizer в прогнозировании должно быть таким же, как и при обучении. Но в вашем коде вы подходите tokenizer с текстом прогноза.

...