Как преобразовать вывод нейронной сети в вероятности? - PullRequest
0 голосов
/ 25 апреля 2019

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

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

  1. Я написал классификатор CNN, который состоит из обычных извилистых слоев с максимальным количеством пулов;
  2. затем я использовал функцию Keras ImageDataGenerator, чтобы использовать увеличение изображения.Я применил это к тренировочному набору, а также изменил масштаб моего тестового набора.
  3. Затем я протестировал алгоритм с некоторыми случайными изображениями.Но мне нужно некоторое представление о том, как точно я могу сопоставить изображение, имеющее максимальный процент совпадения, из пула изображений с заданными входными тестовыми изображениями.
  4. В данный момент я просто передаю одно изображение в качестве входных данных и алгоритмвозвращается ли это кошка или собака или любой материал.

Пожалуйста, дайте мне знать, если требование неясно, я предоставлю все подробности.

             classifier = Sequential()
             classifier.add(Conv2D(32,(3,3), input_shape =(600,200,3), 
                                                     activation ='relu')) 
             classifier.add(MaxPooling2D(pool_size = (2,2)))

             classifier.add(Conv2D(32,(3,3), activation ='relu')) 
             classifier.add(MaxPooling2D(pool_size = (2,2)))
             classifier.add(Flatten())
             classifier.add(Dense(units = 128, activation ='relu'))
             classifier.add(Dropout(0.4))
             classifier.add(Dense(units = 64, activation ='relu'))
             classifier.add(Dense(units = 3, activation ='softmax'))
             classifier.compile(optimizer = 'adam', loss = 
             'categorical_crossentropy', metrics =['accuracy'])  

             #Testing
              img_width, img_height = 600, 200

              def prediction(file):
                    x = load_img(file, target_size=(img_width,img_height))
                    x = img_to_array(x)
                    x = np.expand_dims(x, axis=0)
                    array = classifier.predict(x)
                    result = array[0]
                    #print(result)
                    answer = np.argmax(result)
                    if answer == 1:
                       print("Predicted: Dog")
                    elif answer == 0:
                       print("Predicted: Cat")
                    elif answer == 2:
                       print("Predicted: Materials")         

Я хочу вывод, подобный этому, учитывая изображение, оно должно показатьмне вероятность, к какой категории он относится, например, собака: 23%, кошка: 2%, материалы: 75%

1 Ответ

0 голосов
/ 25 апреля 2019

Что вы можете сделать, это использовать функцию передачи сигмоида на узлах выходного слоя (которая принимает диапазоны данных (-inf, inf) и выводит значение в [-1,1]). Затем, используя выходную кодировку 1-из-n (один узел для каждого класса), вы можете отобразить диапазон [-1,1] на [0,1] и использовать его в качестве вероятности для каждого значения класса (обратите внимание, что это работает естественно, для более чем двух классов).

Вы можете прочитать больше, включая доказательства вероятностной интерпретации здесь:

[1] Бишоп, Кристофер М. Нейронные сети для распознавания образов. Издательство Оксфордского университета, 1995 г.

Простой пример

Если вы хотите получить вероятности в качестве выходных данных сети, вы можете использовать softmax после слоя Dense.

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# probability array
probabilities = model.predict(image)[0]

# get predicted classes
pred_classes = np.argmax(probabilities)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...