Architektury CNN do regresji?

32

Pracowałem nad problemem regresji, w którym dane wejściowe to obraz, a etykieta ma wartość ciągłą od 80 do 350. Obrazy mają związek chemiczny po zajściu reakcji. Kolor, który się okazuje, wskazuje stężenie innej chemikaliów, która pozostała, i to właśnie model ma wytworzyć - stężenie tej substancji chemicznej. Obrazy można obracać, odwracać, kopiować, a oczekiwany wynik powinien być taki sam. Tego rodzaju analiza jest przeprowadzana w prawdziwych laboratoriach (bardzo wyspecjalizowane maszyny generują stężenie chemikaliów za pomocą analizy kolorów, tak jak trenuję ten model).

Do tej pory eksperymentowałem tylko z modelami z grubsza opartymi na VGG (wiele sekwencji bloków konw. Konw. Konw. Konw.). Przed eksperymentowaniem z nowszymi architekturami (Inception, ResNets itp.) Pomyślałem, że zbadam, czy istnieją inne architektury częściej używane do regresji przy użyciu obrazów.

Zestaw danych wygląda następująco:

wprowadź opis zdjęcia tutaj

Zestaw danych zawiera około 5000 próbek 250 x 250, których rozmiar zmieniłem na 64 x 64, więc trening jest łatwiejszy. Gdy znajdę obiecującą architekturę, eksperymentuję z obrazami o większej rozdzielczości.

Jak dotąd moje najlepsze modele mają średni błąd kwadratowy zarówno w zestawach szkoleniowych, jak i walidacyjnych wynoszący około 0,3, co jest dalekie od akceptowalnego w moim przypadku użycia.

Mój najlepszy model do tej pory wygląda następująco:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Pytanie

Jaka jest odpowiednia architektura dla wyjścia regresji z wejścia obrazu?

Edytować

Przeformułowałem moje wyjaśnienie i usunąłem wzmiankę o dokładności.

Edytuj 2

Przekształciłem moje pytanie, więc mam nadzieję, że jasne jest, o co mi chodzi

rodrigo-silveira
źródło
4
Dokładność nie jest miarą, którą można bezpośrednio zastosować do problemów z regresją. Co masz na myśli mówiąc, że twoja dokładność wynosi 30%? Dokładność naprawdę dotyczy tylko zadań klasyfikacyjnych, a nie regresji.
Nuclear Wang
1
Co rozumiesz przez „poprawnie przewiduje 30% czasu” ? Czy naprawdę robisz regresję?
Firebug
1
Dlaczego nazywacie to regresją problemu? Nie próbujesz zaklasyfikować do etykiet? czy etykiety są kardynalne?
Aksakal
2
Nie chcę dokładnie tego samego, co vgg. Robię coś w stylu vgg, co oznacza serię konwek, po których następuje maksymalne połączenie, a następnie pełne połączenie. Wygląda na ogólne podejście do pracy z obrazami. Ale z drugiej strony, to jest sedno mojego pierwotnego pytania. Wydaje się, że wszystkie te komentarze, choć dla mnie wnikliwe, całkowicie pomijają sens tego, o co przede wszystkim pytam.
rodrigo-silveira
1
y[80,350]θy

Odpowiedzi:

42

Przede wszystkim ogólna sugestia: przeszukaj literaturę, zanim zaczniesz eksperymentować na nieznany Ci temat. Zaoszczędzisz sobie dużo czasu.

W tym przypadku, patrząc na istniejące dokumenty, możesz to zauważyć

  1. CNNs były wykorzystywane wielokrotnie do regresji: to jest klasyczny, ale to stary (tak, 3 lata stary jest w DL). Bardziej nowoczesny papier nie wykorzystałby AlexNet do tego zadania. To jest nowsze, ale dotyczy znacznie bardziej skomplikowanego problemu (obrót 3D), a zresztą nie jestem z nim zaznajomiony.
  2. Regresja z CNN nie jest trywialnym problemem. Patrząc ponownie na pierwszy artykuł, zobaczysz, że mają problem z generowaniem nieskończonych danych. Ich celem jest przewidzenie kąta obrotu potrzebnego do skorygowania zdjęć 2D. Oznacza to, że mogę w zasadzie wziąć mój zestaw treningowy i go powiększyć, obracając każdy obraz o dowolne kąty, i uzyskam ważny, większy zestaw treningowy. Problem wydaje się więc stosunkowo prosty, jeśli chodzi o problemy z głębokim uczeniem się. Przy okazji zwróć uwagę na inne sztuczki związane z rozszerzaniem danych:

    Używamy translacji (do 5% szerokości obrazu), regulacji jasności w zakresie [−0,2, 0,2], regulacji gamma za pomocą γ ∈ [−0,5, 0,1] i szumu pikseli Gaussa ze standardowym odchyleniem w zakresie [0 , 0,02].

    k

    yxα=atan2(y,x)>11%[180°,90°],[90°,0°],[0°,90°][90°,180°][45°,45°]

    2.6%

Czego możemy się z tego nauczyć? Przede wszystkim 5000 obrazów to niewielki zestaw danych do twojego zadania. W pierwszym artykule wykorzystano sieć, która została wstępnie przeszkolona na obrazach podobnych do tych, dla których chcieli nauczyć się zadania regresji: nie tylko musisz nauczyć się innego zadania niż to, dla którego architektura została zaprojektowana (klasyfikacja), ale twój zestaw treningowy nie w ogóle nie wyglądają jak zestawy szkoleniowe, na których zwykle trenowane są te sieci (CIFAR-10/100 lub ImageNet). Prawdopodobnie nie uzyskasz żadnych korzyści z nauki transferu. Przykład MATLAB miał 5000 obrazów, ale były czarno-białe i semantycznie wszystkie bardzo podobne (cóż, to może być również twój przypadek).

W takim razie, jak realistycznie jest lepiej niż 0,3? Musimy przede wszystkim zrozumieć, co rozumiesz przez średnią stratę 0,3. Czy masz na myśli, że błąd RMSE wynosi 0,3,

1Ni=1N(h(xi)yi)2

NN<5000h(xi)xiyiyi[80,350]0.12%

Spróbuj też obliczyć liczbę parametrów w twojej sieci: spieszę się i być może popełniam głupie błędy, więc zdecydowanie sprawdź moje obliczenia za pomocą jakiejkolwiek summaryfunkcji z jakiejkolwiek struktury, której używasz. Z grubsza jednak powiedziałbym, że masz

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(uwaga: pominąłem parametry warstw normy wsadowej, ale są to tylko 4 parametry dla warstwy, więc nie mają znaczenia). Masz pół miliona parametrów i 5000 przykładów ... czego byś oczekiwał? Jasne, liczba parametrów nie jest dobrym wskaźnikiem wydajności sieci neuronowej (jest to model niemożliwy do zidentyfikowania), ale nadal ... Nie sądzę, że możesz zrobić znacznie więcej niż to, ale możesz spróbować kilka rzeczy:

  • znormalizuj wszystkie wejścia (na przykład przeskaluj intensywność RGB każdego piksela od -1 do 1 lub użyj standaryzacji) i wszystkich wyjść. Pomoże to zwłaszcza w przypadku problemów z konwergencją.
  • y
  • powiększenie dane: skoro powiedział, że przerzucanie, obracanie o dowolnym kątem lub dublowanie Twoje zdjęcia powinny doprowadzić do tego samego wyjścia, można zwiększyć wielkość swoich danych ustawić wiele . Zauważ, że przy większym zestawie danych błąd zestawu treningowego wzrośnie: szukamy tutaj mniejszej luki między utratą zestawu treningowego a utratą zestawu testowego. Ponadto, jeśli utrata zestawu treningowego znacznie wzrośnie, może to być dobra wiadomość: może to oznaczać, że możesz trenować głębszą sieć na tym większym zestawie treningowym bez ryzyka nadmiernego dopasowania. Spróbuj dodać więcej warstw i sprawdź, czy teraz otrzymujesz mniejszy zestaw treningowy i utratę zestawu testowego. Na koniec możesz wypróbować również inne sztuczki związane z rozszerzaniem danych, które cytowałem powyżej, jeśli mają one sens w kontekście Twojej aplikacji.
  • y[80,97],[97,124][0,27]
  • spróbuj użyć nowoczesnej architektury (Inception lub ResNet) zamiast klasycznej. ResNet ma właściwie mniej parametrów niż VGG-net. Oczywiście chcesz tutaj użyć małych sieci ResNets - nie sądzę, aby ResNet-101 mógł pomóc w zestawie danych 5000 obrazów. Możesz jednak znacznie zwiększyć zestaw danych ....
  • Ponieważ dane wyjściowe są niezmienne w stosunku do rotacji, innym świetnym pomysłem byłoby użycie albo równorzędnych grup CNN , których wynik (gdy jest stosowany jako klasyfikator) jest niezmienny dla dyskretnych obrotów, lub sterowanych CNNktórego wynik jest niezmienny dla ciągłych obrotów. Właściwość niezmienniczości pozwoliłaby uzyskać dobre wyniki przy znacznie mniejszym rozszerzeniu danych lub, w idealnym przypadku, wcale (w przypadku rotacji: oczywiście nadal potrzebujesz innych typów da). Równoważne grupowo CNN są bardziej dojrzałe niż sterowalne CNN z punktu widzenia implementacji, więc najpierw spróbuję zgrupować CNN. Możesz wypróbować klasyfikację, a następnie regresję, używając G-CNN jako części klasyfikacji lub możesz eksperymentować z czystą regresją. Pamiętaj, aby odpowiednio zmienić górną warstwę.
  • eksperymentuj z rozmiarem partii (tak, tak, wiem, że hakowanie hiperparametrów nie jest fajne, ale jest to najlepsze, z czym mogłem przyjść w ograniczonym czasie i za darmo :-)
  • wreszcie istnieją architektury, które zostały specjalnie opracowane w celu dokładnego przewidywania przy użyciu małych zestawów danych. Większość z nich używała rozszerzonych zwojów : jednym ze znanych przykładów jest gęsta sieć neuronowa zwojowa o mieszanej skali . Wdrożenie nie jest jednak trywialne.
DeltaIV
źródło
3
Dziękuję za szczegółową odpowiedź. Już robiłem znaczące powiększanie danych. Próbowałem kilka wariantów modelu początkowego (gdzie wariant oznacza, że ​​liczba filtrów jest równomiernie skalowana w całym modelu). Zobaczyłem niesamowite ulepszenia. Wciąż mam wiele do zrobienia. Spróbuję kilku twoich sugestii. Dzięki jeszcze raz.
rodrigo-silveira
@ rodrigo-silveira nie ma za co, daj mi znać jak to idzie. Może będziemy mogli porozmawiać na czacie, gdy tylko uzyskasz wyniki.
DeltaIV
1
Świetna odpowiedź, zasługuje na więcej ^
Gilly,
1
Bardzo dobrze skomponowany!
Karthik Thiagarajan,
1
Dałbym ci za to 10 000 punktów, gdybym mógł. Niesamowita odpowiedź
Boppity Bop