8

Mi sono allenato con successo un modello semplice in Keras di classificare le immagini:Ottenere una previsione in 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']) 

Posso anche prevedere le classi di immagine utilizzando

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

Tuttavia l'uscita di y_pred è sempre binario. Questo sembra essere il caso quando si utilizza predict_proba e predict. Le mie uscite sono in questa forma

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

Questo funziona bene, ma mi piacerebbe avere una percentuale di probabilità per ogni classificazione, ad esempio

[[ 0.8 0.1 0.1 0.4]] 

Come faccio ad avere questo Keras?

risposta

1

Softmax potrebbe produrre output "one-hot". Si consideri il seguente esempio:

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

Poiché la funzione esponenziale cresce molto velocemente softmax inizia producendo un caldo come uscita partendo dall'ordine di grandezza 1. Keras implementation of the softmax function il valore massimo viene sottratto dall'ingresso, ma nel precisato caso precedente non farà alcuna differenza.

possibili modi per risolvere questo:

  1. fare in modo che le immagini di input sono ridimensionati, in modo che i valori sono compresi tra pixel 0 e 1.

  2. Aggiungere un po 'di regularizers al modello.