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:
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
źródło
Odpowiedzi:
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ć
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:
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,
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
summary
funkcji z jakiejkolwiek struktury, której używasz. Z grubsza jednak powiedziałbym, że masz(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:
źródło