Модель Keras имеет высокую точность (~ 90%), но прогноз полностью отключен - PullRequest
0 голосов
/ 11 июля 2019

Я использую модель Keras, чтобы классифицировать около 50 классов, и получаю точность около 90%. Однако прогнозы полностью сбились! Я также использую SVM, и я могу ввести строку и получить прогноз, который является очень разумным, нейронные сети кажутся проблемой.

Я просмотрел следующие ссылки:

Модель Кераса с высокой точностью, но плохими прогнозами

хорошая точность, но плохой прогноз с керасом

Но они не привели к каким-либо решениям.

def kerasModel(df):
train_size = int(len(df) * .7)

print ("Train size: %d" % train_size)
print ("Test size: %d" % (len(df) - train_size))

train_posts = df['text'][:train_size]
train_tags = df['classes'][:train_size]

test_posts = df['text'][train_size:]
test_tags = df['classes'][train_size:]

tag = df['classes'].tolist()
my_tags2 = set(tag)
print(my_tags2)

max_words = 2000
tokenize = text.Tokenizer(num_words=max_words, char_level=False)

tokenize.fit_on_texts(train_posts) # only fit on train
x_train = tokenize.texts_to_matrix(train_posts)
x_test = tokenize.texts_to_matrix(test_posts)

encoder = LabelEncoder()
encoder.fit(train_tags)
y_train = encoder.transform(train_tags)
y_test = encoder.transform(test_tags)

num_classes = np.max(y_train) + 1
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)
print('y_train shape:', y_train.shape)
print('y_test shape:', y_test.shape)

batch_size = 50
epochs = 3

# Build the model
model = Sequential()
model.add(Dense(256, input_shape=(max_words,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
          optimizer='adam',
          metrics=['accuracy'])

history = model.fit(x_train, y_train,
                batch_size=batch_size,
                epochs=epochs,
                verbose=1,
                validation_split=0.1)

score = model.evaluate(x_test, y_test,
                   batch_size=batch_size, verbose=1)
print('Test accuracy:', score[1])

# define Tokenizer with Vocab Size
tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(train_posts)

# creates a HDF5 file 'my_model.h5'
model.model.save('my_model.h5')

# Save Tokenizer i.e. Vocabulary
with open('tokenizer.pickle', 'wb') as handle:
    pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)

Тогда в основной части:

X = df.text
y = df.classes
X_train, X_test, y_train, y_test = train_test_split(X, y,               test_size=0.25, random_state = 42)

# Fun Stuff
kerasModel(df)

# load our saved model
model = load_model('my_model.h5')

# load tokenizer
tokenizer = Tokenizer()
with open('tokenizer.pickle', 'rb') as handle:
tokenizer = pickle.load(handle)

while True:
    inp = input()
    x_data = [inp]

    x_data_series = pd.Series(inp)
    x_tokenized = tokenizer.texts_to_matrix(x_data, mode='tfidf')
    # print(x_tokenized)
# print(type(x_tokenized))
    prediction = model.predict(np.array(x_tokenized))
    print(prediction)
    predicted_label = my_tags[np.argmax(prediction[0])]
    idxs = np.argsort(prediction)[::-1][:1]
# print("Predicted label: " + predicted_label)
    for item in idxs[0]:
        print(my_tags[item])

Я печатаю достоверность, вывод и прогноз очень плохой! Я получаю повторения, так как то же самое дает мне тот же результат, но X может отображаться на 1 класс за один раз, а затем за другой класс, когда я переучиваюсь.

Я чувствую, что мои теги перепутаны? Но я напечатал теги, и это имеет смысл, я чувствую, что я очень близок, но бился об этом около двух часов.

Спасибо, и хорошего дня!

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