Dlaczego moja prognoza Keras jest zawsze bliska 100% dla jednej klasy obrazu?
Używam Keras (oprócz TF 2.3), aby wytrenować klasyfikator obrazu. W niektórych przypadkach mam więcej niż dwie klasy, ale często są tylko dwie klasy („dobra” lub „zła”). Używam tensorflow.keras.applications.VGG16
klasy jako modelu podstawowego z niestandardowym klasyfikatorem na górze, na przykład:
input_layer = layers.Input(shape=(self.image_size, self.image_size, 3), name="model_input")
base_model = VGG16(weights="imagenet", include_top=False, input_tensor=input_layer)
model_head = base_model.output
model_head = layers.AveragePooling2D(pool_size=(4, 4))(model_head)
model_head = layers.Flatten()(model_head)
model_head = layers.Dense(256, activation="relu")(model_head)
model_head = layers.Dropout(0.5)(model_head)
model_head = layers.Dense(len(self.image_classes), activation="softmax")(model_head)
Jak widać w ostatniej warstwie (wyjściowej) używam softmax
funkcji aktywacji. Następnie kompiluję cały model z categorical_crossentropy
funkcją utraty i trenuję z jednym zakodowanymi na gorąco danymi obrazu (etykietami).
Podsumowując, model działa całkiem dobrze, jestem zadowolony z wyników, osiągam ponad 99% dokładności testów i walidacji z naszym zestawem danych. Jest jednak jedna rzecz, której nie rozumiem:
Kiedy predict()
wywołuję model Keras i patrzę na wyniki prognozy, to zawsze są one 0 lub 1 (lub przynajmniej bardzo, bardzo blisko tego, jak 0,000001 i 0,9999999). Tak więc mój klasyfikator wydaje się być całkiem pewien, czy obraz należy do klasy „dobra” czy „zła” (na przykład, jeśli używam tylko dwóch klas). Miałem jednak założenie, że przeważnie te przewidywania nie są tak jasne, bardziej w kategoriach „model uważa z 80% prawdopodobieństwem, że ten obraz należy do klasy A” - ale jak powiedziałem w moim przypadku zawsze jest to 100% pewnie.
Jakieś pomysły, dlaczego tak się dzieje?
Odpowiedzi
Tradycyjne sieci neuronowe mogą być zbyt pewne (tj. Dawać prawdopodobieństwo bliskie$0$ lub $1$), Nawet gdy są złe, więc należy nie interpretować prawdopodobieństwo, że wytwarza ona jako miara niepewności (czyli jako miara ile jest przekonany, że wiąże się przewidzieć klasa jest prawidłowa), jako że jest zasadniczo błędne . Zobacz te i te odpowiedzi, aby uzyskać więcej informacji na ten temat.
Biorąc pod uwagę, że ta nadmierna pewność siebie nie jest pożądana w wielu scenariuszach (takich jak opieka zdrowotna, gdzie lekarze również chcą wiedzieć, na ile pewny jest model w odniesieniu do swoich prognoz, aby zdecydować, czy podać pacjentowi określony lek, czy nie), społeczność ML próbował uwzględnić kwantyfikację / szacowanie niepewności w sieciach neuronowych. Jeśli jesteś zainteresowany tym tematem, możesz przeczytać artykuł Weight Uncertainty in Neural Network (2015) autorstwa Blundell et al., W którym zaproponowano określony typ sieci neuronowej bayesowskiej, tj. Sieć neuronową modelującą niepewność rzeczywistych wartości wagi, na podstawie których możemy również określić ilościowo / oszacować niepewność dotyczącą danych wejściowych. Ten artykuł nie powinien być zbyt trudny do przeczytania, jeśli znasz już szczegóły wariacyjnych autoenkoderów.
Tak więc odpowiedź na twoje pytanie brzmi: tak, możliwe, że prawdopodobieństwo wyjściowe jest bliskie $1$ponieważ sieci neuronowe mogą być zbyt pewne. (Jestem przy założeniu, że wartości zwracane przez tf.keras
„s predict
metody prawdopodobieństwa: Nie pamiętam już, więc zakłada się, że nie popełnić żadnego błędu).
Podobne pytanie padło już tutaj w przeszłości . Przyjęta odpowiedź powinna zawierać więcej szczegółów na temat różnych rodzajów niepewności i rozwiązań.
Bez szczegółowych informacji na temat charakteru zbioru danych nie można mieć pewności. Oto kilka prawdopodobnych przyczyn:
Dzwoniłeś do przewidywania danych treningowych, a nie do testowania danych. Sieć będzie o wiele bardziej pewna co do obrazów, na których się uczyła, niż w przypadku obrazów, których nigdy wcześniej nie widziała.
Twój model przesadza z danymi. Może się to zdarzyć, gdy używasz zbyt złożonego modelu na małym zestawie danych. Możesz poeksperymentować z regularyzacją.
Patrzyłeś na zbyt małą próbkę obrazów. Czy przewidywałeś każdy obraz, czy tylko kilka? Jeśli to drugie, możliwe, że właśnie wybrałeś próbkę, co do której sieć jest bardzo pewna.