Мой CNN всегда приводит к 0 или 1 и никогда в процентах. Зачем? - PullRequest
0 голосов
/ 13 мая 2019

Я создаю мультиклассовое распознавание объектов с несколькими метками CNN, используя Keras, где это даст процент уверенности в том, к какому классу (ам) относится изображение.К сожалению, я не могу заставить его давать проценты, а просто значение 0 или 1 для каждого класса, когда я запускаю метод model.predict().Что-то не так с моим кодом, или он еще не обучен на достаточном количестве изображений?(Да, я использую новые фотографии, которые модель никогда не видела для прогнозов.)

#building the CNN
classifier = Sequential()

classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 
'relu'))

classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Dropout(0.25))

classifier.add(Flatten())

classifier.add(Dense(units = 128, activation = 'relu'))

classifier.add(Dense(units = 64, activation = 'relu'))

classifier.add(Dense(units = 4, activation = 'sigmoid'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', 
metrics = ['accuracy'])

datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True,
validation_split = 0.1)

training_set = datagen.flow_from_directory('images',
target_size = (64, 64),
batch_size = 32,
class_mode = 'categorical',
subset = 'training')

test_set = datagen.flow_from_directory('images',
target_size = (64, 64),
batch_size = 32,
class_mode = 'categorical',
subset = 'validation')

classifier.fit_generator(training_set,
steps_per_epoch = training_set.samples,
epochs = 10,
validation_data = test_set,
validation_steps = test_set.samples)

#predicting new image class
test_image = image.load_img(r'XXXX', target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict_proba(test_image)
print (result)

Результат обучения:

# Epoch 10/10
# 237/237 [==============================] - 14s 58ms/step - loss: 1.3194e-04 - acc: 1.0000 - val_loss: 0.0312 - val_acc: 0.9860

Это мои потери / неточности.

[[1. 1. 0. 0.]]

Это пример результата предсказания нового изображения.Я даже дал моей модели очень несвязанные изображения, которые все еще возвращаются с похожими результатами.

Я понимаю, что 237 фотографий - это очень маленький тренировочный пул;Я буду увеличивать базу данных изображений в течение следующих нескольких месяцев.

1 Ответ

2 голосов
/ 14 мая 2019

Чтобы получить процентное выходное значение, используйте функцию активации softmax в выходном слое, чтобы получить вероятности. Вы не должны использовать функцию активации сигмовидной формы в любом случае из-за исчезающей проблемы градиента с ними.

classifier = Sequential()

classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 
'relu'))

classifier.add(MaxPooling2D(pool_size = (2, 2)))

classifier.add(Dropout(0.25))

classifier.add(Flatten())

classifier.add(Dense(units = 128, activation = 'relu'))

classifier.add(Dense(units = 64, activation = 'relu'))

classifier.add(Dense(units = 4, activation = 'softmax'))

Другой возможной причиной может быть масштабирование данных. Пожалуйста, обратитесь к Возвращение вероятностей в прогнозе классификации в Керасе? для решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...