Funkcja straty dla segmentacji semantycznej

10

Przeprasza za niewłaściwe użycie terminów technicznych. Pracuję nad projektem segmentacji semantycznej za pośrednictwem splotowych sieci neuronowych (CNN); próbuje zaimplementować architekturę typu Enkoder-Dekoder, dlatego wyjście ma ten sam rozmiar co wejście.

Jak projektujesz etykiety? Jaką funkcję utraty należy zastosować? Zwłaszcza w sytuacji dużej nierównowagi klas (ale stosunek między klasami jest zmienny w zależności od obrazu).

Problem dotyczy dwóch klas (przedmiotów zainteresowania i tła). Używam Keras z backendem tensorflow.

Do tej pory zajmowałem się projektowaniem oczekiwanych wyników o takich samych wymiarach jak obrazy wejściowe, stosując etykietowanie pikselowe. Ostatnia warstwa modelu ma albo aktywację softmax (dla 2 klas), albo aktywację sigmoidalną (aby wyrazić prawdopodobieństwo, że piksele należą do klasy obiektów). Mam problem z zaprojektowaniem odpowiedniej funkcji celu dla takiego zadania typu:

function(y_pred,y_true),

w porozumieniu z Keras .

Proszę starać się być konkretnym w odniesieniu do wymiarów zaangażowanych tensorów (wejście / wyjście modelu). Wszelkie uwagi i sugestie są mile widziane. Dziękuję Ci !

Florin Lucaciu
źródło
Przeczytaj ten arxiv.org/pdf/1511.00561.pdf „Wykorzystujemy utratę entropii jako funkcję celu w szkoleniu sieci.”
Miss Palmer

Odpowiedzi:

6

Cross entropia to zdecydowanie najlepsza droga. Nie znam Keras, ale TF ma to: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Oto papier bezpośrednio realizacji to: Całkowicie splotowy Sieci semantycznej Segmentacja przez Shelhamer et al.

Dokument U-Net jest również bardzo udaną realizacją pomysłu, wykorzystując pomijanie połączeń, aby uniknąć utraty rozdzielczości przestrzennej. Wiele implementacji tego można znaleźć w sieci.

Z mojego osobistego doświadczenia możesz zacząć od prostej sieci kodera-dekodera, ale nie używaj kroków (lub kroków = 1), w przeciwnym razie tracisz dużo rozdzielczości, ponieważ upsampling nie jest idealny. Idź z małymi rozmiarami jądra. Nie znam twojej konkretnej aplikacji, ale nawet sieć 2-3 warstw ukrytych da bardzo dobre wyniki. Użyj 32-64 kanałów na każdej warstwie. Rozpocznij proste, 2 ukryte warstwy, 32 kanały każdy, jądra 3x3, krok = 1 i eksperymentuj z parametrami w sposób izolowany, aby zobaczyć ich efekt. Zachowaj wymiary zawsze równe wymiarowi wejściowemu dla starterów, aby uniknąć utraty rozdzielczości. Następnie możesz włączyć kroki i upsamplowanie oraz wdrożyć pomysły takie jak U-Net. U-Net działa bardzo dobrze do segmentacji obrazów medycznych.

Aby dowiedzieć się więcej na temat nierównowagi klas, patrz https://swarbrickjones.wordpress.com/2017/03/28/cross-entropy-and-training-test-class-imbalance/ Tutaj chodzi o ważenie różnych klas za pomocą i parametryαβ


źródło
Nie jestem ekspertem w tej dziedzinie, ale czy zajęcia nie powinny być wyłączne w tym otoczeniu? Jeśli tak, czy nie byłoby lepszym rozwiązaniem utrata softmax? tensorflow.org/api_docs/python/tf/nn/…
Harald Thomson
1
@HaraldThomson, Segmentacja jest problemem binarnym. Wiele osób używa softmax do rozwiązywania problemów binarnych, ale jest to całkowicie niepotrzebne i przesada. Zamiast mieć dwa węzły wyjściowe, należy mieć jeden węzeł wyjściowy reprezentujący P (y = 1), a następnie użyć entropii krzyżowej.
Ricardo Cruz,
2

Użyj ważonej utraty kości i ważonej utraty entropii krzyżowej. Utrata kości jest bardzo dobra do segmentacji. Wagi, od których można zacząć, powinny być odwróconymi częstotliwościami klasy, tj. Pobrać próbkę, powiedzmy 50-100, znaleźć średnią liczbę pikseli należących do każdej klasy i sprawić, aby klasa miała wagę 1 / średnią. Być może będziesz musiał zaimplementować kości samodzielnie, ale to proste. Dodatkowo możesz sprawdzić odwrotną utratę kości i utratę ogniskowej

Rahul Deora
źródło
-1

Pozwól, że na początku będę bardziej szczegółowy, a następnie bardziej ogólny. Przepraszam, jeśli cię źle zrozumiałem.

Myślę, że mówisz o potrzebie sieci neuronowej autoencodera, ponieważ wspomniałeś o kodowaniu i dekodowaniu, a także o rozmiarze wejściowym takim samym jak rozmiar wyjściowy. Jeśli tak, to twoja funkcja utraty polega na odtworzeniu wektora wejściowego, ale także na kompresji danych do krótszego wektora w środkowej ukrytej warstwie. Można wybrać minimalny błąd średniokwadratowy (dla regresji) lub współczynnik utraty logów lub błędnej klasyfikacji (dla klasyfikacji). Jednak CNN nie są czymś, co widziałem w autoenkoderze, ale myślę, że byłoby to zarówno możliwe, jak i użyteczne, w przypadkach, gdy ważna jest niezmienność translacyjna, taka jak wykrywanie krawędzi i obiektów w obrazach.

Mówiąc bardziej ogólnie, wydaje się, że budujesz bardzo złożony model uczenia maszynowego, odkąd wspomniałeś o CNN. CNN i inne modele głębokiego uczenia są jednymi z najbardziej złożonych modeli uczenia maszynowego.

Wybór wymiarów, etykiet i funkcji utraty przypomina raczej elementarne uczenie maszynowe. Myślę, że możesz mieć kłopoty z głębokim uczeniem się. Czy najpierw wziąłeś lekcje na temat zwykłego uczenia maszynowego?

Geoffrey Anderson
źródło
Czy to w ogóle konieczne? Na przykład zobacz metodę Pixon .
Carl
jest to prawidłowe podejście: arxiv.org/pdf/1511.00561.pdf
Miss Palmer
„Sieci CNN i inne modele głębokiego uczenia są jednymi z najbardziej złożonych modeli uczenia maszynowego, jakie istnieją.”. Nie zgadzam się. Model sam w sobie może być złożony, ale w rzeczywistości jest niezwykle prosty w użyciu, z bardzo niewielkim zrozumieniem teoretycznym. To jest powód całego szumu na temat DL, małej teorii, łatwych do pisania modeli i bardzo wysokich dokładności ...