Gram trochę z konwekcjami. W szczególności korzystam z zestawu danych kaggle koty kontra psy, który składa się z 25 000 obrazów oznaczonych jako kot lub pies (po 12500 każdego).
Udało mi się osiągnąć około 85% dokładności klasyfikacji na moim zestawie testowym, jednak wyznaczyłem sobie cel osiągnięcia 90% dokładności.
Moim głównym problemem jest nadmierne dopasowanie. Jakoś zawsze tak się dzieje (zwykle po epoce 8-10). Architektura mojej sieci jest luźno zainspirowana przez VGG-16, a dokładniej moje obrazy są zmieniane na , a następnie uruchamiam:
Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool 1 64x64x32 (kernel size is 2, strides is 2)
Convolution 3 64x64x64 (kernel size is 3, strides is 1)
Convolution 4 64x64x64 (kernel size is 3, strides is 1)
Max pool 2 32x32x64 (kernel size is 2, strides is 2)
Convolution 5 16x16x128 (kernel size is 3, strides is 1)
Convolution 6 16x16x128 (kernel size is 3, strides is 1)
Max pool 3 8x8x128 (kernel size is 2, strides is 2)
Convolution 7 8x8x256 (kernel size is 3, strides is 1)
Max pool 4 4x4x256 (kernel size is 2, strides is 2)
Convolution 8 4x4x512 (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)
Wszystkie warstwy oprócz ostatniej mają relus jako funkcje aktywacyjne.
Zauważ, że próbowałem różnych kombinacji zwojów (zacząłem od prostszych zwojów).
Ponadto powiększyłem zestaw danych, tworząc kopię lustrzaną obrazów, dzięki czemu mam w sumie 50000 obrazów.
Ponadto normalizuję obrazy przy użyciu normalizacji min max, gdzie X jest obrazem
Kod jest zapisany w tensorflow, a wielkości partii to 128.
Mini-partie danych treningowych kończą się nadmiernym dopasowaniem i mają dokładność 100%, podczas gdy dane walidacyjne wydają się przestać się uczyć na poziomie około 84-85%.
Próbowałem także zwiększyć / zmniejszyć współczynnik rezygnacji.
Stosowanym optymalizatorem jest AdamOptimizer o współczynniku uczenia się 0,0001
W tej chwili gram z tym problemem przez ostatnie 3 tygodnie i wydaje się, że 85% postawiło przede mną barierę.
Dla przypomnienia, wiem, że mógłbym użyć uczenia się transferowego, aby osiągnąć znacznie wyższe wyniki, ale interesuje mnie budowanie tej sieci jako samodzielnego uczenia się.
Aktualizacja:
Używam sieci SAME z inną wielkością partii, w tym przypadku używam dużo mniejszej wielkości partii (16 zamiast 128) do tej pory osiągam 87,5% dokładności (zamiast 85%). To powiedziawszy, sieć i tak kończy się przeregulowaniem. Nadal nie rozumiem, w jaki sposób rezygnacja z 50% jednostek nie pomaga ... oczywiście robię tutaj coś złego. Jakieś pomysły?
Aktualizacja 2:
Wygląda na to, że problem miał związek z rozmiarem partii, ponieważ przy mniejszym rozmiarze (16 zamiast 128) osiągam teraz 92,8% dokładności na moim zestawie testowym, przy mniejszym rozmiarze partii sieć wciąż się przesadza (mini-partie kończą się z dokładnością 100%) strata (błąd) stale maleje i ogólnie jest bardziej stabilna. Wady są DUŻO wolniejsze, ale warto poczekać.