8

Я успешно обучил простую модель в Keras для классификации изображений:Получение предсказания в Keras

model = Sequential() 

model.add(Convolution2D(32, 3, 3, border_mode='valid', input_shape=(img_channels, img_rows, img_cols), 
         activation='relu', name='conv1_1')) 
model.add(Convolution2D(32, 3, 3, activation='relu', name='conv1_2')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 

model.add(Convolution2D(64, 3, 3, border_mode='valid', activation='relu', name='conv2_1')) 
model.add(Convolution2D(64, 3, 3, activation='relu', name='conv2_2')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 

model.add(Flatten()) 
model.add(Dense(512, activation='relu')) 
model.add(Dropout(0.5)) 

model.add(Dense(nb_classes, activation='softmax')) 

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

Я также могу предсказать классы изображений с использованием

y_pred = model.predict_classes(img, 1, verbose=0) 

Однако выход y_pred всегда двоичный файл. Это также имеет место при использовании predict_proba и predict. Мои выходы в этой форме

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

Это работает нормально, но я хотел бы иметь вероятностный процент для каждой классификации, например

[[ 0.8 0.1 0.1 0.4]] 

Как получить это в Keras?

ответ

1

Softmax может выдавать «один горячий» выход. Рассмотрим следующий пример:

# Input; Exponent; Softmax value 
20 485165195 0.99994 
9   8103 0.00002 
5   148 0.00000 
10  22026 0.00005 
------------------------ 
# Sum 485195473 1 

Поскольку экспоненциальная функция растет очень быстро начинает softmax получая один горячий, как выход, начиная с порядка 1. В Keras implementation of the softmax function максимальное значение вычитается из входного, но в указанном выше, это не будет иметь никакого значения.

Возможные способы исправить это:

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

  2. Добавить модель regularizers в свою модель.