2016-08-16 18 views
19

Mam funkcjonalny model w Keras (Resnet50 z przykładów repo). Trenowałem to z danymi ImageDataGenerator i flow_from_directory i zapisałem model do pliku .h5. Kiedy zadzwonię pod numer model.predict otrzymam tablicę prawdopodobieństw klasowych. Ale chcę skojarzyć je z etykietami klas (w moim przypadku - nazwami folderów). Jak mogę je zdobyć? Zauważyłem, że mogę używać model.predict_classes i model.predict_proba, ale nie mam tych funkcji w modelu funkcjonalnym, tylko w Sekwencyjnym.Pobierz etykiety klas z funkcjonalnego modelu Keras

Odpowiedz

7

AKTUALIZACJA: Nie dotyczy to nowszych wersji Keras. Proszę użyć argmax() jak w odpowiedzi od Emilii Apostolovej.

Funkcjonalne modele API mają tylko funkcję predict(), która dla klasyfikacji zwróci prawdopodobieństwo klas. Następnie można wybrać najbardziej prawdopodobne klasy przy użyciu funkcji użytecznej probas_to_classes(). Przykład:

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

Jest to odpowiednik model.predict_classes(x) w modelu sekwencyjnym.

Powodem tego jest to, że funkcjonalny interfejs API obsługuje bardziej ogólną klasę zadań, gdzie predict_classes() nie ma sensu.

Więcej informacji: https://github.com/fchollet/keras/issues/2524

+2

Obecnie kod np.utils.py (patrz https://github.com/fchollet/keras/blob/master/keras/utils/np_utils.py) nie ma metody probas_to_classes. Czy zmienili to na jakąś inną funkcję? Proszę pomóż mi. – noobalert

+1

Mam taki sam problem jak wspomniany @noobalert, nie ma on tej funkcji. –

+4

użyj 'y_classes = y_proba.argmax (axis = -1)' zamiast – Zach

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

Jak sugeruje here.

+1

To daje mi przesunięcie, ale już miałem sposób, żeby to zrozumieć ...jak mogę uzyskać nazwę etykiety? – Trejkaz

3

Gdy używa się katalog_zakresu_przepływu, problem polega na interpretacji wyników prawdopodobieństwa. W jaki sposób odwzorować wyniki prawdopodobieństwa i etykiety klas tak, jak katalog_pliku_przepływu tworzy wektory, które nie są znane w poprzednich wersjach.

Możemy słownika, który mapuje etykiety klasy do indeksu wektora predykcji, które otrzymujemy na wyjściu, gdy używamy

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

Zmienna label_map jest słownikiem jak ten

{'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} 

Następnie można uzyskać zależność między wynikami prawdopodobieństwa a nazwami klas.

Zasadniczo możesz utworzyć ten słownik według tego kodu.

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)))) 

Zmienna name_id_map w powyższym kodu zawiera tego samego słownika jak ten uzyskany z class_indices funkcji flow_from_directory.

Mam nadzieję, że to pomoże!