Прогноз Keras возвращает такие маленькие значения - PullRequest
0 голосов
/ 08 июня 2019

Я новичок в нейронных сетях.Я создал нейронную сеть для распознавания ушей 15 целей (классов).Набор данных состоит из 300 изображений и разделен на «обучение», «проверка» и «тест».Для каждого класса в обучении есть 13 изображений, для проверки 3 и для теста 4.

Это структура сети

input_shape = (128, 128, 3)
NUM_CLASSES = 15
BATCH_SIZE = 32
NUM_EPOCHE = 50

classifier = Sequential()
classifier.add(Convolution2D(32, 3, 3, input_shape = input_shape, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Flatten())
classifier.add(Dropout(.5))
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dropout(.5))
classifier.add(Dense(output_dim = NUM_CLASSES, activation = 'softmax'))

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

classifier.fit_generator(
training_set,
steps_per_epoch = 6,  
epochs = NUM_EPOCHE,
validation_data = validation_set,
validation_steps = 2, 
) 

Я считаю, что количество эпох составляеточень высокий, но если я пытаюсь уменьшить его, точность уменьшается.В любом случае, когда я пытаюсь предсказать изображение, взятое из тестового набора, в результате я получаю очень маленькие значения.Я не знаю, почему это происходит.Мне нужны значения от 0 до 1. Я не знаю, если это проблема из-за структуры модели или что.

x = image.load_img('dataset_biometria/ear/test_set/15/02_15_06.jpg',      target_size=(128,128))
x = image.img_to_array(x)
x = x.reshape((1,) + x.shape)
x = x/255
predictions = classifier.predict_proba(x, batch_size=32, verbose=1)
print(predictions)

Это результат прогноза:

[[5.6861238e-05 2.6912585e-02 5.8105786e-04 1.7117772e-03 1.5182612e-03
1.5271029e-01 3.7086603e-01 3.7264896e-03 1.0833447e-03 8.4272223e-03
2.5183004e-03 5.6781149e-03 3.8425636e-02 3.8328120e-01 2.5028707e-03]]

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

То, что вы получили, - это вероятность каждого класса.И если вы суммируете значения, результат будет 1.0, который ожидается.Например:

per_class_probabilities = [[5.6861238e-05, 2.6912585e-02, 5.8105786e-04, 1.7117772e-03, 1.5182612e-03, 1.5271029e-01, 3.7086603e-01, 3.7264896e-03, 1.0833447e-03, 8.4272223e-03, 2.5183004e-03, 5.6781149e-03, 3.8425636e-02, 3.8328120e-01, 2.5028707e-03]]
print(np.sum(per_class_probabilities))
# 1.0

Тогда, если вы хотите получить наиболее вероятный класс, т.е. прогноз:

class_prediction = np.argmax(per_class_probabilities)
print(class_prediction)
# 13 
0 голосов
/ 08 июня 2019

Так и должно быть, все значения находятся в диапазоне от нуля до единицы, и сумма равна единице, это получается функцией softmax, поэтому здесь нет проблем, просто недоразумение.

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