Jak uzyskać prognozy za pomocą prognozy_generatora na temat transmisji danych testowych w Keras?

16

Na blogu Keras o konwencjach szkoleniowych od zera kod pokazuje tylko sieć działającą na danych szkoleniowych i walidacyjnych. Co z danymi testowymi? Czy dane walidacyjne są takie same jak dane testowe (nie sądzę). Jeśli istniał oddzielny folder testowy na podobnych liniach jak folder pociągu i sprawdzania poprawności, w jaki sposób otrzymujemy macierz nieporozumień dla danych testowych. Wiem, że do tego celu musimy użyć scikit learn lub jakiegoś innego pakietu, ale jak mogę uzyskać coś podobnego do klasowych prawdopodobieństw dla danych testowych? Mam nadzieję, że użyję tego do macierzy pomieszania.

Raghuram
źródło
1
Możesz wywołać funkcję model.predict_generator (...) z generatorem, który odczytuje dane z katalogu zawierającego zestaw testowy. Zwraca prognozy, których można użyć do obliczenia macierzy nieporozumień. Czy tego szukasz? Zobacz tutaj dokumentację: keras.io/models/sequential
stmax
1
Tak, widziałem to. przewidywanie_generatora zwraca listę prognoz, która jest listą wartości zmiennoprzecinkowych od 0 do 1. Jak to interpretować? Nie można go używać bezpośrednio z macierzą pomieszania.
Raghuram
2
Nie próbowałem jeszcze predykcji_generatora (jest raczej nowy), ale wydaje się, że zwraca prawdopodobieństwo klasy. Spróbuj przekonwertować wartości <= 0,5 na 0 i> 0,5 na 1. Gdy masz listę składającą się z 0 i 1 s, możesz podać ją do funkcji obliczania macierzy pomieszania.
stmax
2
Nawiasem mówiąc, będzie to dobrze działać w przypadku problemów z dwiema klasami, ale co, jeśli są więcej niż dwie klasy?
Raghuram
1
Jeśli są więcej niż dwie klasy, twoja sieć potrzebuje więcej niż jednego wyjścia. Dla n klas masz n wyników i przewidujesz klasę, która ma najwyższą wydajność. Zobacz funkcję softmax ( en.wikipedia.org/wiki/Softmax_function ).
stmax

Odpowiedzi:

15

Aby uzyskać macierz nieporozumień z danych testowych, należy przejść przez dwa kroki:

  1. Wykonaj prognozy dla danych testowych

Na przykład użyj, model.predict_generatoraby przewidzieć pierwsze 2000 prawdopodobieństw z generatora testowego.

generator = datagen.flow_from_directory(
        'data/test',
        target_size=(150, 150),
        batch_size=16,
        class_mode=None,  # only data, no labels
        shuffle=False)  # keep data in same order as labels

probabilities = model.predict_generator(generator, 2000)
  1. Oblicz macierz nieporozumień na podstawie prognoz etykiet

Na przykład porównaj prawdopodobieństwo z przypadkiem, że odpowiednio jest 1000 kotów i 1000 psów.

from sklearn.metrics import confusion_matrix

y_true = np.array([0] * 1000 + [1] * 1000)
y_pred = probabilities > 0.5

confusion_matrix(y_true, y_pred)

Dodatkowa uwaga na temat danych testowych i walidacyjnych

Dokumentacja Keras wykorzystuje trzy różne zestawy danych: dane treningowe, dane walidacyjne i dane testowe. Dane treningowe służą do optymalizacji parametrów modelu. Dane walidacyjne służą do dokonywania wyborów dotyczących meta-parametrów, np. Liczby epok. Po zoptymalizowaniu modelu z optymalnymi meta-parametrami dane testowe są wykorzystywane do uzyskania rzetelnego oszacowania wydajności modelu.

Pieter
źródło
2
Dzięki za fragmenty kodu. Czy możesz połączyć te dwa? W twoim przykładzie y_true wydaje się być zapełnione danymi zastępczymi. Czy użyłbyś generator.classes do wypełnienia tablicy?
Gegenwind,
Nie jestem pewien, ale myślę, że zamiast tego np.array([0] * 1000 + [1] * 1000)możesz uzyskać ten sam zestaw, wykonującgenerator.classes
Mehdi Nellen
2

Oto kod, który próbowałem i pracował dla mnie:

pred= model.predict_generator(validation_generator, nb_validation_samples // batch_size)
predicted_class_indices=np.argmax(pred,axis=1)
labels = (validation_generator.class_indices)
labels2 = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
print(predicted_class_indices)
print (labels)
print (predictions)

Następnie możesz użyć:

print (confusion matrix(predicted_class_indices,labels)

Upewnij się, że używasz shuffle=Falsew swoim generatorze testów (w moim przypadku jest to generator sprawdzania poprawności) i zresetuj go za pomocą validation_generator.reset()przed dokonaniem prognoz.

ranahd
źródło
0

W przypadku macierzy pomieszania musisz użyć pakietu sklearn. Nie sądzę, że Keras może zapewnić macierz dezorientacji. Aby przewidzieć wartości w zestawie testowym, wystarczy wywołać metodę model.predict () w celu wygenerowania prognoz dla zestawu testowego. Rodzaj wartości wyjściowych zależy od typu modelu, tj. Dyskretnego lub prawdopodobieństwa.

enterML
źródło
Dziękuję za odpowiedź. Wiem, że Keras nie ma własnego pakietu macierzy pomyłek. Moje pytanie brzmi: model.predict_generator zwraca listę wartości zmiennoprzecinkowych, których nie można użyć do obliczenia macierzy pomyłek.
Raghuram
Na jakich danych eksperymentujesz?
wprowadź ML
Pracuję nad obrazami.
Raghuram