Co oznacza wynik działania funkcji model.predict z Keras?

14

Zbudowałem model LSTM, aby przewidzieć duplikaty pytań w oficjalnym zbiorze danych Quora. Etykiety testowe mają wartość 0 lub 1. 1 oznacza, że ​​para pytań jest zduplikowana. Po zbudowaniu modelu za pomocą model.fit, testuję model za pomocą model.predictdanych testowych. Dane wyjściowe to tablica wartości, takich jak poniżej:

 [ 0.00514298]
 [ 0.15161049]
 [ 0.27588326]
 [ 0.00236167]
 [ 1.80067325]
 [ 0.01048524]
 [ 1.43425131]
 [ 1.99202418]
 [ 0.54853892]
 [ 0.02514757]

Pokazuję tylko pierwsze 10 wartości w tablicy. Nie rozumiem, co oznaczają te wartości i jaka jest przewidywana etykieta dla każdej pary pytań?

Dookoto_Sea
źródło
1
Myślę, że masz problem w swojej sieci .. prawdopodobieństwo powinno być w skali 0-1 ... ale masz 1,99! Myślę, że masz coś złego ...
Ghanem

Odpowiedzi:

8

Wyjście sieci neuronowej nigdy domyślnie nie będzie binarne - tzn. Zera lub jedynek. Sieć pracuje z wartościami ciągłymi (nie dyskretnymi), aby bardziej swobodnie optymalizować straty w ramach spadku gradientu.

Spójrz tutaj na podobne pytanie, które pokazuje także trochę kodu.

Bez jakiegokolwiek udoskonalania i skalowania, wydajność sieci prawdopodobnie spadnie gdzieś w zakresie twojego wejścia, pod względem jej wartości nominalnej. W twoim przypadku wydaje się to mniej więcej od 0 do 2.

Możesz teraz napisać funkcję, która zamienia powyższe wartości na 0 lub 1, w oparciu o pewien próg. Na przykład przeskaluj wartości, aby zawierały się w zakresie [0, 1], a następnie, jeśli wartość jest poniżej 0,5, zwróć 0, jeśli powyżej 0,5, zwróć 1.

n1k31t4
źródło
Dzięki, ja też pomyślałem o użyciu wartości progowej do klasyfikacji etykiet. Ale na jakiej podstawie powinna decydować wartość progowa?
Dookoto_Sea
@Dookoto_Sea musisz sam zdecydować
Jérémy Blain
@Dookoto_Sea Należy pamiętać, że jeśli etykieta ma wartość 0 lub 1, wartość powinna znajdować się w tym zakresie, a skala wartości prognoz [0, 2] jest intrygująca, musisz zmienić dane wyjściowe modelu
Jérémy Blain
7

Jeśli jest to problem z klasyfikacją, powinieneś zmienić swoją sieć na 2 neurony wyjściowe.

Możesz przekonwertować etykiety na wektory kodowane na gorąco za pomocą

y_train_binary = keras.utils.to_categorical(y_train, num_classes)
y_test_binary = keras.utils.to_categorical(y_test, num_classes)

Następnie upewnij się, że twoja warstwa wyjściowa ma dwa neurony z funkcją aktywacji softmax.

model.add(Dense(num_classes, activation='softmax'))

Spowoduje to, że model.predict(x_test_reshaped)będziesz tablicą list. Gdzie wewnętrzna lista jest prawdopodobieństwem wystąpienia instancji należącej do każdej klasy. Dodaje to do 1 i najwyraźniej zdecydowanym znacznikiem powinien być neuron wyjściowy o najwyższym prawdopodobieństwie.

Keras ma to w swojej bibliotece, więc nie musisz robić tego porównania samodzielnie. Możesz uzyskać etykietę klasy bezpośrednio, używając model.predict_classes(x_test_reshaped).

JahKnows
źródło
3
„Jeśli jest to problem z klasyfikacją, powinieneś zmienić sieć, aby mieć 2 neurony wyjściowe.” .. przepraszam Jah, ale nie powinien, może to zrobić z jednym neuronem i sigmoidem zamiast funkcji softmax.
Ghanem,
@ Minion, obie metody są zasadniczo równoważne, próg, który w innym przypadku musiałbyś zrobić z jednym neuronem wyjściowym, jest domyślnie osadzony w sieci. Zapewniając w ten sposób wyjście binarne.
JahKnows
1
Tak, ja skomentowałem tylko dlatego, że wspomniał: „powinien zmienić sieć, aby mieć 2 neurony wyjściowe”. .. dzięki
Ghanem
1

Prognozy są oparte na tym, co podajesz jako wyniki treningu i funkcję aktywacji.

Na przykład przy wejściu 0-1 i sigmoidalnej funkcji aktywacji wyjścia z binarną stratą crossentropii uzyskałbyś prawdopodobieństwo 1. W zależności od kosztu błędnego podjęcia decyzji w obu kierunkach możesz następnie zdecydować, w jaki sposób radzić sobie z tymi prawdopodobieństwami (np. przewidzieć kategorię „1”, jeśli prawdopodobieństwo wynosi> 0,5 lub być może już, gdy jest> 0,1).

(-,

Björn
źródło