W zasadzie każde podejście ma swoje zalety i wady. Chodźmy throught te, które przewidziane, a następnie inne, aby znaleźć najlepsze podejście:
LSTM
: Wśród swoich największych zalet jest zdolność do uczenia się długoterminowy dependiencies wzorców w danych. Zostały one zaprojektowane w celu umożliwienia analizy długich sekwencji, np. mowa lub tekst. Może to również powodować problemy z powodu parametrów liczbowych, które mogą być naprawdę wysokie. Inne typowe powtarzające się architektury sieciowe, takie jak GRU
, mogą przezwyciężyć te problemy. Główną wadą jest to, że w ich standardowej (sekwencyjnej implementacji) nie można dopasować go do danych wideo z tego samego powodu, dla którego gęste warstwy są złe dla danych zdjęciowych - mnóstwo czasu i przestrzennych niezmienności musi się nauczyć dzięki topologii, która jest całkowicie nieodpowiedni do złapania ich w efektywny sposób. Przesunięcie wideo o piksel po prawej może całkowicie zmienić wydajność sieci.
Inne rzeczy, które warto wspomnieć, że szkolenie LSTM
jest belived być podobna do znalezienia równowagi pomiędzy dwoma procesami rywalizacja - znalezienie dobrej ciężarów przez gęstej jak obliczeń wyjściowych i znalezienie dobrego wewnętrznej pamięci dynamicznej w przetwórstwie sekwencje. Znalezienie tej równowagi może trwać bardzo długo, ale gdy już się jej znajdzie - zwykle jest dość stabilna i daje naprawdę dobre wyniki.
Conv3D
: Wśród ich największych zalet można łatwo znaleźć zdolność do wychwytywania przestrzennych i czasowych niezmienników w taki sam sposób, jak Conv2D
w przypadku obrazowania. To sprawia, że przekleństwo wymiarowości jest o wiele mniej szkodliwe. Z drugiej strony - w ten sam sposób, w jaki Conv1D
może nie dawać dobrych wyników przy dłuższych sekwencjach - w ten sam sposób brak jakiejkolwiek pamięci może utrudnić uczenie się długiej sekwencji.
Oczywiście jeden może korzystać z różnych metod, takich jak:
TimeDistributed + Conv2D
: stosując TimeDistributed
opakowania - można stosować pewne pretrained convnet jak np Inception
przeglądaj i kolejno analizuj mapy obiektów. Naprawdę ogromną zaletą tego podejścia jest możliwość uczenia się transferu. Jako wadę - można pomyśleć o tym jako o Conv2.5D
- brakuje w nim czasowej analizy danych.
ConvLSTM
: architektura ta nie jest jeszcze obsługiwany przez najnowszą wersją Keras
(6 marca 2017), ale jak można zobaczyć here należy przewidzieć w przyszłości. Jest to mieszanka LSTM
i Conv2D
i uważa się, że jest lepsza niż układanie w stosy Conv2D
i LSTM
.
Oczywiście nie są jedynym sposobem, aby rozwiązać ten problem, będę wspomnieć jeszcze jeden, który może być przydatny:
- Stacking: jeden może łatwo układać górne metody w celu zbudowania ostatecznego rozwiązania. Na przykład. można zbudować sieć, w której na początku wideo jest przekształcane przy użyciu
TimeDistributed(ResNet)
, a następnie dane wyjściowe są przesyłane do Conv3D
z wielokrotnym i agresywnym przestrzennym łączeniem i ostatecznie przekształcane przez warstwę GRU/LSTM
.
PS:
Jeszcze jedna rzecz, która jest również warto wspomnieć, że kształt danych wideo jest rzeczywiście 4D
z (frames, width, height, channels
).
PS2:
W przypadku, gdy dane są faktycznie 3D
z (frames, width, hieght)
faktycznie przydałby klasyczny Conv2D
(zmieniając channels
do frames
) analiza tych danych (które faktycznie może bardziej efektywny obliczeniowo). W przypadku uczenia transferu transferu powinieneś dodać dodatkowy wymiar, ponieważ większość modeli CNN
została przeszkolona na danych o kształcie (width, height, 3)
. Można zauważyć, że twoje dane nie mają 3 kanałów. W tym przypadku zwykle stosowana technika polega na trzykrotnym powtórzeniu macierzy przestrzennej.
PS3:
Przykładem tego 2.5D
podejścia jest:
input = Input(shape=input_shape)
base_cnn_model = InceptionV3(include_top=False, ..)
temporal_analysis = TimeDistributed(base_cnn_model)(input)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(temporal_analysis)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(conv3d_analysis)
output = Flatten()(conv3d_analysis)
output = Dense(nb_of_classes, activation="softmax")(output)
bardzo przydatne informacje, zwłaszcza warstwę TimeDistributed. Kształt moich danych wideo to 3D, ponieważ istnieje tylko jeden kanał, czy powinienem go zmienić? A może mógłbyś podać jakiś (pseudo) kod dla 5. podejścia do łączenia warstw? Wymiary wciąż mnie mylą. Dziękuję Ci bardzo! – Isa
Nadal mam kilka dodatkowych pytań. Pseudokod odnosi się do nb_of_classes, ale nie potrzebuję klasyfikacji, ale ramki w następnym takcie. Czy nie ma prostszego rozwiązania? Nie potrzebuję nauki transferu (jeszcze), tylko prostej sieci, która zabrała N poprzednich ramek i przepowiedziała następną. – Isa
Chciałbym odpowiedzieć jutro? Ok? –