2016-08-16 6 views
19

Ich habe ein funktionelles Modell in Keras (Resnet50 aus Repo-Beispielen). Ich trainierte es mit ImageDataGenerator und flow_from_directory Daten und speicherte Modell zu .h5 Datei. Wenn ich model.predict rufe, bekomme ich eine Reihe von Klassenwahrscheinlichkeiten. Aber ich möchte sie mit Klassenbezeichnungen assoziieren (in meinem Fall - Ordnernamen). Wie kann ich sie bekommen? Ich fand, dass ich model.predict_classes und model.predict_proba verwenden konnte, aber ich habe diese Funktionen im Funktionsmodell nicht, nur im Sequential.Klassenbezeichnungen erhalten von Keras Funktionsmodell

Antwort

7

UPDATE: Dies gilt nicht für neuere Keras-Versionen. Bitte benutzen Sie argmax() wie in der Antwort von Emilia Apostolova.

Die funktionalen API-Modelle haben nur die predict()-Funktion, die für die Klassifizierung die Klassenwahrscheinlichkeiten zurückgeben würde. Sie können dann die wahrscheinlichsten Klassen mit der Dienstprogrammfunktion probas_to_classes() auswählen. Beispiel:

y_proba = model.predict(x) 
y_classes = keras.np_utils.probas_to_classes(y_proba) 

Dies entspricht model.predict_classes(x) auf dem Sequential-Modell.

Der Grund dafür ist, dass die funktionale API eine allgemeinere Klasse von Aufgaben unterstützt, bei der predict_classes() keinen Sinn ergibt.

Weitere Informationen: https://github.com/fchollet/keras/issues/2524

+2

Momentan hat der Code für np.utils.py (siehe https://github.com/fchollet/keras/blob/master/keras/utils/np_utils.py) keine probas_to_classes-Methode. Haben sie das in eine andere Funktion geändert? Bitte hilf mir. – noobalert

+1

Ich habe das gleiche Problem wie @noobalert erwähnt, es hat nicht die Funktion. –

+4

Verwenden Sie 'y_classes = y_proba.argmax (axis = -1)' stattdessen – Zach

12
y_prob = model.predict(x) 
y_classes = y_prob.argmax(axis=-1) 

Wie vorgeschlagen here.

+1

Das gibt mir den Offset, aber ich hatte schon einen Weg, das herauszufinden ...Wie bekomme ich den Markennamen? – Trejkaz

3

Wenn man flow_from_directory verwendet, besteht das Problem darin, die Wahrscheinlichkeitsausgaben zu interpretieren. Wie man die Wahrscheinlichkeitsausgaben und die Klassenbezeichnungen so abbildet, wie flow_from_directory one-hot-Vektoren erzeugt, ist im Stand der Technik nicht bekannt.

Wir können ein Wörterbuch bekommen, die die Klasse Etiketten auf den Index des Vorhersagevektorkarten, die wir als die Ausgabe erhalten, wenn wir

generator= train_datagen.flow_from_directory("train", batch_size=batch_size) 
label_map = (generator.class_indices) 

Die label_map Variable ist ein Wörterbuch wie dieses

{'class_14': 5, 'class_10': 1, 'class_11': 2, 'class_12': 3, 'class_13': 4, 'class_2': 6, 'class_3': 7, 'class_1': 0, 'class_6': 10, 'class_7': 11, 'class_4': 8, 'class_5': 9, 'class_8': 12, 'class_9': 13} 
verwenden

Daraus kann dann die Beziehung zwischen den Wahrscheinlichkeitswerten und Klassennamen abgeleitet werden.

Grundsätzlich können Sie dieses Wörterbuch nach diesem Code erstellen.

from glob import glob 
class_names = glob("*") # Reads all the folders in which images are present 
class_names = sorted(class_names) # Sorting them 
name_id_map = dict(zip(class_names, range(len(class_names)))) 

Die Variable name_id_map in dem obigen Code enthält auch die gleichen Wörterbücher wie die von class_indices Funktion der flow_from_directory erhalten.

Hoffe, das hilft!

Verwandte Themen