Ваш код очень трудно читать.Это не рекомендуемый стандарт для написания модели Keras.Попробуйте это и дайте нам знать, что вы получаете.Предполагая, что X - это матрица, где строки - это экземпляры, а столбцы - объекты.И Y - это метки
Вам необходимо добавить канал в качестве последнего измерения, как объяснено при использовании бэкэнда TensorFlow.Кроме того, метки должны быть разделены на 2 узла для большей вероятности успеха.Отображение одного нейрона часто бывает менее успешным, чем использование вероятностного вывода с 2 узлами.
n = 1000 # Number of instances
m = 4 # Number of features
num_classes = 2 # Number of output classes
... # Your code for loading the data
X = X.reshape(n, m,)
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.33)
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
Постройте свою модель.Последний слой должен использовать либо сигмоид, либо softmax для задачи классификации.Попробуйте использовать оптимизатор Adadelta, который, как было показано, дает лучшие результаты за счет более эффективного обхода градиента и уменьшения колебаний.Мы также будем использовать кросс-энтропию в качестве нашей функции потерь, как это стандартно для задач классификации.Двоичная кросс-энтропия тоже подойдет.
Попробуйте использовать стандартную конфигурацию модели.Увеличение числа узлов не имеет особого смысла.Модель должна выглядеть как призма, небольшой набор входных объектов, множество скрытых узлов и небольшой набор выходных узлов.Вы должны стремиться к наименьшему количеству скрытых слоев, сделать слои толще, а не добавлять слои.
input_shape = (m,)
model = Sequential()
model.add(Dense(32, activation='relu', input_shape=input_shape))
model.add(Dense(64, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
Вы можете получить сводную информацию о вашей модели, используя
model.summary()
Тренируйте своимодель
epochs = 100
batch_size = 128
# Fit the model weights.
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
Для просмотра того, что произошло во время тренировки
plt.figure(figsize=(8,10))
plt.subplot(2,1,1)
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='lower right')
plt.subplot(2,1,2)
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper right')
plt.show()