керас мпл точность ноль - PullRequest
0 голосов
/ 23 мая 2018

Ниже приведена моя модель MLP,

layers = [10,20,30,40,50]
model = keras.models.Sequential()
#Stacking Layers
model.add(keras.layers.Dense(layers[0], input_dim = input_dim, activation='relu'))
#Defining the shape of input
for layer in layers[1:]:
    model.add(keras.layers.Dense(layer, activation='relu'))
    #Layer activation function
# Output layer
model.add(keras.layers.Dense(1, activation='sigmoid'))
#Pre-training
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
#Training
model.fit(train_set, test_set, validation_split = 0.10, epochs = 50, batch_size = 10, shuffle = True, verbose = 2)
# evaluate the network
loss, accuracy = model.evaluate(train_set, test_set)
print("\nLoss: %.2f, Accuracy: %.2f%%" % (loss, accuracy*100))
#predictions
predt = model.predict(final_test)
print(predt)

Проблема в том, что точность всегда равна 0, журнал ошибок, как показано,

Epoch 48/50 - 0s - loss: 1.0578 - acc: 0.0000e+00 - val_loss: 0.4885 - val_acc: 0.0000e+00 
Epoch 49/50 - 0s - loss: 1.0578 - acc: 0.0000e+00 - val_loss: 0.4885 - val_acc: 0.0000e+00 
Epoch 50/50 - 0s - loss: 1.0578 - acc: 0.0000e+00 - val_loss: 0.4885 - val_acc: 0.0000e+00 
2422/2422 [==============================] - 0s 17us/step

Потеря: 1,00,Точность: 0,00%

Как и предполагалось, я изменил свой обучающий сигнал с -1,1 до 0,1, и все же, вот журнал ошибок

Epoch 48/50 - 0s - loss: 8.5879 - acc: 0.4672 - val_loss: 8.2912 - val_acc: 0.4856 
Epoch 49/50 - 0s - loss: 8.5879 - acc: 0.4672 - val_loss: 8.2912 - val_acc: 0.4856 
Epoch 50/50 - 0s - loss: 8.5879 - acc: 0.4672 - val_loss: 8.2912 - val_acc: 0.4856 
2422/2422 [==============================] - 0s 19us/step

1 Ответ

0 голосов
/ 23 мая 2018

Ваш код очень трудно читать.Это не рекомендуемый стандарт для написания модели 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...