Нейронная сеть предсказывает очень плохо, хотя и обладает высокой точностью

#deep-learning #neural-network #lstm #recurrent-neural-network #prediction

#глубокое обучение #нейронная сеть #lstm #рекуррентная-нейронная сеть #прогнозирование

Вопрос:

Я работаю над RNN. После обучения я получил высокую точность набора тестовых данных. Однако, когда я делаю прогноз с некоторыми внешними данными, он предсказывает так плохо. Кроме того, я использовал тот же набор данных, который содержит более 300 000 текстов и 57 классов, в искусственных нейронных сетях, он по-прежнему очень плохо предсказывает. Когда я попробовал тот же набор данных в модели машинного обучения, он работал нормально.

Вот мой код:

 import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from keras.preprocessing.text import Tokenizer
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, LSTM, BatchNormalization
from keras.layers.embeddings import Embedding
from sklearn.model_selection import train_test_split

df = pd.read_excel("data.xlsx", usecols=["X", "y"])

df = df.sample(frac = 1)

X = np.array(df["X"])
y = np.array(df["y"])

le = LabelEncoder()
y = le.fit_transform(y)
y = y.reshape(-1,1)
encoder = OneHotEncoder(sparse=False)
y = encoder.fit_transform(y)

num_words = 100000
token = Tokenizer(num_words=num_words)
token.fit_on_texts(X)
seq = token.texts_to_sequences(X)
X = sequence.pad_sequences(seq, padding = "pre", truncating = "pre")

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = Sequential()
model.add(Embedding(num_words, 96, input_length = X.shape[1]))
model.add(LSTM(108, activation='relu', dropout=0.1, recurrent_dropout = 0.2))
model.add(BatchNormalization())
model.add(Dense(y.shape[1], activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer="rmsprop", metrics=['accuracy'])
model.summary()

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

loss, accuracy = model.evaluate(X_test, y_test)
 

Вот графики истории модели:

введите описание изображения здесь
введите описание изображения здесь

Комментарии:

1. Ваша модель, похоже, переоснащается. Попробуйте увеличить количество отсевов и посмотреть, поможет ли это.

2. Я тоже так думал, и я значительно увеличил отсев, но, к сожалению, все тот же.

Ответ №1:

После проведения некоторых исследований я понял, что модель на самом деле работает нормально. Проблема заключалась Keras Tokenizer в неправильном использовании.

В конце кода я использовал следующий код:

 sentence = ["Example Sentence to Make Prediction."]
token.fit_on_texts(sentence) # <- This row is redundant.
seq = token.texts_to_sequences(sentence)
cx = sequence.pad_sequences(seq, maxlen = X.shape[1])
sx = np.argmax(model.predict(cx), axis=1)
 

Проблема возникает, когда я хочу снова настроить токенизатор на новые данные. Итак, удаление этой строки кода решило проблему для меня.