Как исправить отсутствие точности проверки?

#python #numpy #tensorflow #keras #neural-network

Вопрос:

Я работаю над нейронной сетью и недавно обучал ее, и она имеет точность примерно 93% по данным обучения и точность 0% по данным проверки. Моей первой мыслью было переобучение, но модель не экономит между тренировками, и я получаю эти результаты в первую эпоху. Я использую keras на python со следующим кодом модели:

 model = Sequential(  [  Conv1D(320, 8, input_shape=(560, 560), activation="relu"),  # Conv1D(320, 8, activation="relu"),  # Conv1D(320, 8, activation="relu"),  # Dense(750, activation="relu"),  # Dropout(0.6),  Dense(1500, activation="relu"),  Dropout(0.6),  Dense(750, activation="relu"),  Dropout(0.6),  GlobalMaxPooling1D(keepdims=True),  Dense(1, activation='softmax')  ] )  model.compile(optimizer=Adam(learning_rate=0.00001), loss="binary_crossentropy", metrics=['accuracy']) earlystopping = callbacks.EarlyStopping(monitor="val_accuracy",  mode="max", patience=2,  restore_best_weights=True) model1 = model.fit(x=training_x, y=training_y, batch_size=150, epochs=5, shuffle=True, verbose=1, callbacks=[earlystopping], validation_data=(val_x, val_y))  

Результаты, которые я получаю, выглядят так:

Эпоха 1/5 167/167 [==============================] — 1266 с 8 с/шаг — потеря: 6,4154 — точность: 0,9262 — val_loss: 0,0054 — val_accuracy: 0,0000 e 00

Я пытался изменить почти все гиперпараметры и изменить архитектуру модели, но я продолжаю получать аналогичные результаты. Это как-то связано с данными? Данные, которые я использую, — это массив 3d NumPy, содержащий пиксельные данные из группы изображений. Любая помощь здесь была бы очень признательна.

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

1. Подумайте об этом, какое выходное значение будет иметь активация softmax одним нейроном?

2. @Dr. Snoopy Я не слишком хорошо знаком с тем, что он делает, но мне его рекомендовали, что он делает и что я должен использовать вместо этого?

3. Вы не можете использовать softmax с одним нейроном, это не имеет никакого смысла, так как это был бы один класс (то есть без классификации), и он выдает постоянный вывод 1.0.

4. @Dr. Snoopy Я изменил его на 2, но у меня все еще та же проблема

5. Я не говорил, что это единственная проблема, только самая очевидная, вам нужно настроить активацию вывода в соответствии с вашими метками (возможно, активация сигмовидной формы), и я также предполагаю, что ваши данные сильно несбалансированы в сторону положительного класса, что тоже может быть проблемой.

Ответ №1:

Вам нужно использовать activation='sigmoid' и optimizers.RMSprop(lr=1e-4) для двоичной классификации.