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
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
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!
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
Mam taki sam problem jak wspomniany @noobalert, nie ma on tej funkcji. –
użyj 'y_classes = y_proba.argmax (axis = -1)' zamiast – Zach