Dlaczego mój model Keras uczy się rozpoznawać tło?


9

Próbuję wyszkolić tę implementację Keras Deeplabv3 + na Pascal VOC2012, używając wstępnie przeszkolonego modelu (który został również przeszkolony w tym zestawie danych).

Mam dziwne wyniki z dokładnością szybko zbliżającą się do 1.0:

5/5 [==============================] - 182s 36s/step - loss: 26864.4418 - acc: 0.7669 - val_loss: 19385.8555 - val_acc: 0.4818
Epoch 2/3
5/5 [==============================] - 77s 15s/step - loss: 42117.3555 - acc: 0.9815 - val_loss: 69088.5469 - val_acc: 0.9948
Epoch 3/3
5/5 [==============================] - 78s 16s/step - loss: 45300.6992 - acc: 1.0000 - val_loss: 44569.9414 - val_acc: 1.0000

Testowanie modelu daje również 100% dokładność.

Postanowiłem wykreślić prognozy na tym samym zestawie losowych obrazów przed i po treningu, i stwierdziłem, że model zachęca się do powiedzenia, że ​​wszystko jest tylko tłem (to pierwsza klasa w Pascal VOC2012).

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Jestem całkiem nowy w głębokim uczeniu się i potrzebuję pomocy, aby dowiedzieć się, skąd to może pochodzić.

Pomyślałem, że być może może to być moja funkcja straty, którą zdefiniowałem jako:

def image_categorical_cross_entropy(y_true, y_pred):
    """
    :param y_true: tensor of shape (batch_size, height, width) representing the ground truth.
    :param y_pred: tensor of shape (batch_size, height, width) representing the prediction.
    :return: The mean cross-entropy on softmaxed tensors.
    """
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true))

Nie jestem pewien, czy moje tensory mają odpowiedni kształt. Korzystam z interfejsu API zestawu danych TF do ładowania .tfrecordplików, a mój tensor adnotacji ma kształt (batch_size, height, width). Byłoby (batch_size, height, width, 21)to, co jest potrzebne? Inne błędy z modelu pojawiają się, gdy próbuję rozdzielić obraz adnotacji na tensor zawierający 21 obrazów (po jednym dla każdej klasy):

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12,512,512,21] vs. [12,512,512]
         [[Node: metrics/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/ArgMax, metrics/acc/ArgMax_1)]]
         [[Node: training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1/_13277 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:1", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_62151_training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:1"]()]]

Dziękuję za pomoc!


5
Sporo tu rzeczy do rozważenia, prawie nie wiem od czego zacząć (1) czy używasz próbki o wielkości 5 do treningu ??? (2) Co, jeśli w ogóle, przygotowujesz do swoich zdjęć? Mam wrażenie, że odpowiedź leży w tym i (3) musisz podać o wiele więcej informacji na temat swojego modelu. Ile masz oznaczonych próbek? Ile możliwych kategorii? Czy masz zrównoważony zestaw treningowy? (4) twoja dokładność 1,0 w zasadzie nic nie znaczy, ponieważ twoja strata jest bardzo wysoka i rośnie. Twoja strata powinna się zmniejszyć wraz ze wzrostem dokładności.
I_Play_With_Data

(1) Używam partii wielkości 12, ale myślę, że jest to trochę nieistotne. Pokazałem tu tylko 3 małe epoki po zaledwie 5 kroków, ponieważ tak szybko się zbiega. (2) Moje przetwarzanie wstępne polega na pewnym rozszerzeniu i przeskalowaniu (ewentualnie przycięciu) do 512 x 512 dla każdego obrazu i związanej z nim adnotacji. (3) w Pascal VOC 2012 znajduje się około 11 500 zdjęć z etykietami. Przyznaję, że większość dokumentów osiąga 85% + mIOU w tym zestawie danych, zakładam, że jest zrównoważony. W tym zestawie danych znajduje się 20 różnych kategorii plus jedna dla tła lub „dwuznaczna”, w sumie 21.
Matt

Jestem ciekawostką. Czy znalazłeś przyczynę wyników swojego modelu?
Mark.F,

3
Jeśli podzieliłeś się swoim kodem, możliwe byłoby znalezienie błędu.
Dmytro Prylipko

1
Fakt, że wstępnie wyszkolony model znajduje sposób na uzyskanie 100% dokładności w ciągu 3 epok, przy użyciu tych samych danych, które były pierwotnie użyte, sprawia, że ​​myślę, że błąd polega na tym, że twoje etykiety treningowe są błędne, być może wszystkie ustawione na etykietę, która odpowiada tło. W każdym razie zapoznaj się z tym wątkiem , w którym ludzie omawiają swoje problemy i rozwiązania dotyczące dostrajania modelu. Model niekoniecznie jest zepsuty, a błąd wsadowy w Tensorflow można rozwiązać.
n1k31t4

Odpowiedzi:


1

Twój model jest zbyt dobry. Każda epoka ma tylko 5 obrazów. Model „zapamiętuje” odpowiedź dla każdego obrazu.

Aby zminimalizować ryzyko nadmiernego dopasowania, zwiększ liczbę zdjęć. Dla każdej kategorii obiektu powinno być kilka tysięcy przykładowych obrazów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.