Ручные прогнозы нейронной сети не работают - PullRequest
2 голосов
/ 29 октября 2019

У меня есть набор данных (csv) в формате, показанном ниже:

Первый столбец : случайные целые числа

Второй столбец : Класс каждого целого числа (называемого bins )

enter image description here

Ячейки были созданы после предварительной обработки, для целых чисел экзаменамежду 1000 и 1005 принадлежат ячейки с номерами 0, 1006 и 1011 в ячейке с номером 1 и продолжаются.

Целевым столбцом для моей нейронной сети является столбец bin (второй столбец).

Я использую OneHotEncoding для моего целевого столбца и преобразую каждый номер бина в двоичный вектор. У меня 3557 различных корзин (классов).

Я обучил его и в результате оценил его с точностью 99,7%.

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import OneHotEncoder
from keras import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split

df = pd.read_csv("/dbfs/FileStore/tables/export78.csv")

onehotencoder = OneHotEncoder(categorical_features = [1])
data2 = onehotencoder.fit_transform(df).toarray()
dataset = pd.DataFrame(data2)

X= dataset.iloc[:,3557].astype(float)
y= dataset.iloc[:,0:3557].astype(int)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)


classifier = Sequential()
#First Hidden Layer
classifier.add(Dense(3557, activation='sigmoid', kernel_initializer='random_normal', input_dim=1))
#Second  Hidden Layer
classifier.add(Dense(3557, activation='sigmoid', kernel_initializer='random_normal'))
#Output Layer
classifier.add(Dense(3557, activation='sigmoid', kernel_initializer='random_normal'))

#Compiling the neural network
classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics=['accuracy'])

#Fitting the data to the training dataset
classifier.fit(X_train,y_train, batch_size=50, epochs=10)

accr = classifier.evaluate(X_test, y_test)
print('Test set\n  Loss: {:0.3f}\n  Accuracy: {:0.3f}'.format(accr[0] ,accr[1]))

classifier.save("model.h67")


data1 = np.array(X_test)
List = [data1]
model = tf.keras.models.load_model("model.h67")
prediction = model.predict([(data1)])
target = (np.argmax(prediction, axis=0))
dataset1 = pd.DataFrame(target)
display(dataset1)

ПРОБЛЕМА:

Когда я пытаюсь прогнозировать вручную, используя мою модель, я не могу получить правильные результаты. В качестве входных данных для прогнозирования введите csv только с одним столбцом со случайными целыми числами, и я хочу, чтобы в результате находились ячейки. enter image description here

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Есть несколько проблем с вашим кодом.

Для начала:

Я обучил его и в результате оценил его с точностью 99,7%.

Это известная проблема (ложная высокая точность), когда ошибочно используется потеря binary_crossentropy для задачи классификации multi -класса;см .:

Во-вторых, вы также ошибочно используете activation='sigmoid' в своем последнем слое, где оно должно быть activation='softmax'.

В-третьих, избавьтесь от всех этих activation='sigmoid' в остальной частиваши слои и замените их на relu.

Наконец, вы должны избавиться от всех этих kernel_initializer='random_normal' операторов в слоях вашей модели;оставьте аргумент неопределенным, чтобы по умолчанию он был (очень превосходным) glorot_uniform ( docs ).

В целом, вот как должна выглядеть ваша модель:

classifier = Sequential()
classifier.add(Dense(3557, activation='relu', input_dim=1))
classifier.add(Dense(3557, activation='relu'))
classifier.add(Dense(3557, activation='softmax'))

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

Это очень общий совет, только для начала;проблема класса 3557 не является тривиальной, и не ясно, почему вы решили использовать 3 слоя, все из которых имеют одинаковое количество (3557) узлов. Поэкспериментируйте с архитектурой, учитывая вышеперечисленные пункты ...

1 голос
/ 29 октября 2019

Получаете ли вы сообщение об ошибке или просто неправильные прогнозы? Это не ясно из вашего вопроса.

Попробуйте:

prediction = model.predict(data1)

Редактировать:

У меня 3557 различных корзин (классов).

classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics=['accuracy'])

Тогда binary_crossentropy, поскольку функция потерь не является правильным выбором, попробуйте categorical_crossentropy.

...