Я создаю 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]))
Я установил случайное начальное число перед тренировкой модели и в сценарии, где я загружаю модель, я что-то упускаю при загрузке модели? Должен ли я размещать свои данные по-другому?