8

Mam powodzeniem szkolony prosty model w Keras klasyfikowania zdjęć:Uzyskanie przewidywania w 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']) 

Mogę również przewidzieć zajęcia obraz za pomocą

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

Jednak wyjście y_pred jest zawsze dwójkowy. Wydaje się tak również w przypadku korzystania z predict_proba i predict. Moi wyjścia są w tej formie

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

To działa OK, ale chciałbym mieć procent prawdopodobieństwa dla każdej klasyfikacji, na przykład

[[ 0.8 0.1 0.1 0.4]] 

jak mogę to w Keras?

Odpowiedz

1

Softmax może dać "jedno gorące" wyjście. Rozważmy następujący przykład:

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

Ponieważ funkcja wykładnicza rośnie bardzo szybko softmax zaczyna uzyskując jeden gorący jak wyjście wychodząc z rzędu 1. W Keras implementation of the softmax function maksymalna wartość jest odejmowana od wejścia, ale w podanym powyższy przypadek nie robi żadnej różnicy.

możliwych sposobów rozwiązania tego problemu:

  1. Upewnij się, że obrazy wejściowe są przeskalowane tak, że piksele są wartości pomiędzy 0 i 1.

  2. Dodaj niektóre regularizers do swojego modelu.