Предсказание нейронной сети Keras не работает

#tensorflow #keras #scikit-learn #deep-learning

#tensorflow #keras #scikit-учиться #глубокое обучение

Вопрос:

Я создал проект с использованием keras и tensorflow. Я использовал набор данных NSL KDD и закодировал свой проект на python. Я также использовал оптимизатор SGD.

Я хотел бы подогнать модель, затем оценить ее, а затем проверить ее точность. (Поэтому я могу сравнить его с результатами машинного обучения).

Вот мой полный код ниже, пожалуйста, просмотрите его.

 import tensorflow as tf
from keras import backend as K

from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import tag_constants, signature_constants, signature_def_utils_impl

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np
sess = tf.Session()
K.set_session(sess)
K.set_learning_phase(0)
model_version = "2"


import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('KDD_Dataset.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 41:42].values
# Encoding categorical data X
from sklearn.preprocessing import LabelEncoder
labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])
X[:,1] = labelencoder_X.fit_transform(X[:,1])
X[:,2] = labelencoder_X.fit_transform(X[:,2])
#
from sklearn.preprocessing import OneHotEncoder
onehotencoder_0 = OneHotEncoder(categorical_features=[0])
onehotencoder_1 = OneHotEncoder(categorical_features=[1])
onehotencoder_2 = OneHotEncoder(categorical_features=[2])
X = onehotencoder_0.fit_transform(X).toarray()
X = onehotencoder_1.fit_transform(X).toarray()
X = onehotencoder_2.fit_transform(X).toarray()

# Encoding categorical data y
from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)
max(y)

# Splitting the dataset into the Training set and Test set
#from sklearn.cross_validation import train_test_split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size = 0.2, 
                                                    random_state = 0)
# create the model
model = Sequential()
model.add(Dense(41, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(20, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# compile the model

model.compile(loss='binary_crossentropy', optimizer=sgd,metrics=['accuracy'])

model.fit(X_train, y_train, validation_data=(X_test, y_test), nb_epoch=200, batch_size=5, verbose=0)
  

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

1. Вы должны сказать нам, что не работает.

2. model.fit(X_train, y_train, validation_data=(X_test, y_test), nb_epoch= 200, batch_size = 5, verbose = 0) это не работает

3. Нет, вам нужно сказать нам на словах, что означает «не работает». Вы получаете сообщение об ошибке? Неожиданный результат? И т.д.

4. О, я получил: Ошибка при проверке ввода: ожидаемый dense_6_input должен иметь форму (8,), но получил массив с формой (45,)

5. Отредактируйте свой первоначальный вопрос и объясните, что не работает.

Ответ №1:

См. Dense(41, input_dim= 8, init=’uniform’, activation =’relu’) Модель, которую вы определили, содержит 8 функций, однако ваши входные данные содержат 45 функций. Они не совпадают. Вы должны либо создать свою модель с 45 объектами, чтобы соответствовать входным данным, либо сократить длину входного объекта до 8, чтобы соответствовать вашей модели.

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

1. хорошо! Теперь я добавил свою модель с 45 dim .. model = Sequential() model.add(Плотный(input_dim= 45, init= ‘равномерный’, активация = ‘relu’, output_dim = 20)) model.add(Плотный(ouput_dim= 20, init = ‘равномерный’, активация =’relu’)) model.add(плотный(output_dim= 39, init= ‘равномерный’, активация = ‘сигмоид’)) но выдает ошибку __init__() отсутствует 1 требуемый позиционный аргумент: ‘единицы измерения’

2. Вам необходимо сохранить количество узлов для каждого уровня, которое является «единицами измерения» в информации об ошибке. Попробуйте эту модель.добавить(Плотную(41, input_dim=45, init=’uniform’, активация =’relu’)) модель.добавить(Плотную(20, init=’uniform’, активация =’relu’)) модель.добавить(плотную(1, init=’uniform’, активация =’сигмоид’))

Ответ №2:

Изменить строку

model.add(плотный (41, input_dim = 8, init= ‘равномерный’, активация = ‘relu’))

Для

model.add(плотный (42, input_dim=42, init= ‘равномерный’, активация = ‘relu’))

и

оптимизатор = sgd к оптимизатору = ‘sgd’