Как построить модель нейронных сетей для классификации данных в Python

#python #tensorflow #machine-learning #keras #neural-network

#python #tensorflow #машинное обучение #keras #нейронная сеть

Вопрос:

Я пытаюсь построить модель для классификации некоторых данных (4 класса).
вот что я опробовал:

 from keras.models import Sequential
from keras.layers import Dense


# dividing X, y into train and test data
X_train, X_test, y_train, y_test = train_test_split(X_data, y_target, random_state=0)

# define the keras model
model = Sequential()
model.add(Dense(64, input_dim=9, activation='relu'))
model.add(Dense(4, activation='softmax')) 
# compile model
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit the model on the dataset
train_history = model.fit(X_train, y_train, epochs=100, batch_size=20, verbose=0, validation_data=(X_test, y_test))
# evaluate the keras model
_, accuracy = model.evaluate(X_data, y_target, verbose=0)
print('Accuracy: %.3f' % (accuracy*100))
  

Я получаю эту ошибку :

 Received a label value of 4 which is outside the valid range of [0, 4).
  

Может кто-нибудь, пожалуйста, помочь мне понять, что не так с моей моделью?

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

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Traceback») в вопрос (не комментарий) в виде текста (не скриншота). Есть и другая полезная информация.

2. какие данные вы используете? Вы используете метки 0,1,2,3 или 1,2,3,4 ? Модель ожидает метки 0,1,2,3 , но она получает 4

3. Спасибо @furas . Это работает, когда я меняю последний слой на 5. Что означает, я полагаю, что он начинает отсчет от 0 до 4. (1) Как я могу получить из него матрицу путаницы, чтобы я мог видеть выходной массив? (2) Если бы это был один класс, я бы дал 1 на последнем уровне, а не 0. Итак, почему это работает с последним слоем, имеющим значение 5, когда у меня есть 4 класса?

4. Я использовал метки 1, 2, 3, 4

5. вам придется сменить на 0,1,2,4 но с пандами это не проблема — df["label"] = df["label"] - 1

Ответ №1:

Благодаря @furas я решил свою проблему, изменив метки с [1 2 3 4] на [0 1 2 3] с помощью pandas: df["label"] = df["label"] - 1

Ответ №2:

На самом деле, если бы вы разделили данные из одного и того же фрейма с помощью train_test_split , то эта ошибка не должна была возникнуть. Пожалуйста, проверьте данные еще раз. Также обязательно используйте stratify опцию в train_test_split .