Mam problem z interpretacją różnicy kodowania Keras dla znakowania sekwencji jeden do wielu (np. Klasyfikacja pojedynczych obrazów) i wiele do wielu (np. Klasyfikacja sekwencji obrazów). Często widzę dwa różne rodzaje kodów:
Typ 1 to miejsce, w którym nie zastosowano takiego podziału czasu:
model=Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode="valid", input_shape=[1, 56,14]))
model.add(Activation("relu"))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Reshape((56*14,)))
model.add(Dropout(0.25))
model.add(LSTM(5))
model.add(Dense(50))
model.add(Dense(nb_classes))
model.add(Activation("softmax"))
Typ 2 polega na zastosowaniu TimeDistribution w następujący sposób:
model = Sequential()
model.add(InputLayer(input_shape=(5, 224, 224, 3)))
model.add(TimeDistributed(Convolution2D(64, (3, 3))))
model.add(TimeDistributed(MaxPooling2D((2,2), strides=(2,2))))
model.add(LSTM(10))
model.add(Dense(3))
Moje pytania to:
Czy moje założenie jest prawidłowe, że typ 1 jest rodzajem jeden do wielu, a typ 2 jest rodzajem wiele do wielu? Czy
TimeDistributed
nie ma to znaczenia w tym aspekcie?W obu przypadkach jeden do wielu lub wiele do wielu ostatnia gęsta warstwa powinna mieć 1 węzeł „długi” (emitując tylko jedną wartość z kolei), a
poprzednia warstwa cykliczna jest odpowiedzialna za określenie, ile
1-długości wartość do emisji? Czy ostatnia gęsta warstwa powinna składać się z N węzłów, gdzieN=max sequence length
? Jeśli tak, to po co
używać RNN tutaj, kiedy możemy wytworzyć podobny wkład z wieloma
wyjściami z równoległymi estymatorami „waniliowymi” równoległymi?Jak zdefiniować liczbę kroków czasowych w RNN? Czy jest to w jakiś sposób
skorelowane z długością sekwencji wyjściowej, czy jest to tylko
hiperparametr do dostrojenia?Przykład przypadku mojego przykładu typu 1 powyżej, jaki jest sens stosowania
LSTM, gdy model emituje tylko jedną prognozę klasy (możliwą
nb_classes
)? Co jeśli pominie się warstwę LSTM?
Odpowiedzi:
Celem użycia dowolnej cyklicznej warstwy jest uzyskanie wyniku nie tylko pojedynczego elementu niezależnego od innych elementów, ale raczej sekwencji elementów, tak aby wynik operacji warstwy na jednym elemencie w sekwencji był wynikiem zarówno tego elementu, jak i dowolnego elementu przed nim w sekwencji. Liczba kroków czasowych określa czas trwania takiej sekwencji. Oznacza to, ile elementów należy obsługiwać w sekwencji i wpływać na wynik końcowy.
Warstwa LSTM działa w taki sposób, że akceptuje dane wejściowe w formularzu numer_czasów, wymiary_kategorii. Jeśli parametr return_sequences jest ustawiony na False, którym jest domyślnie, warstwa „łączy” dane wejściowe wszystkich kroków czasowych w jedno wyjście. Jeśli weźmiesz pod uwagę sekwencję, powiedzmy 10 elementów, warstwa LSTM z ciągami return_sequences ustawionymi na False spowoduje, że z takiej sekwencji powstanie pojedynczy element wyjściowy, a atrybuty tego pojedynczego elementu będą wynikiem wszystkich elementów (znaczników czasu) w sekwencja. Tego właśnie potrzebujesz w przypadku projektu typu „jeden do jednego”.
Warstwa LSTM z ciągami return_sequences ustawionymi na True będzie dla każdego elementu (timepep) w sekwencji wejściowej wygenerować wynik. Odbywa się to w taki sposób, że w dowolnym momencie wyjście będzie zależeć nie tylko od elementu, który jest obecnie obsługiwany, ale także od poprzednich elementów w sekwencji. Tego właśnie potrzebujesz w przypadku projektu „wiele do wielu”.
Ponieważ warstwa LSTM pobiera sekwencję elementów jako dane wejściowe, każda warstwa przed warstwą LSTM w twoim modelu będzie musiała utworzyć sekwencję jako wynik. W przypadku modelu typu 1 pierwsze kilka warstw nie działa na sekwencjach, ale na pojedynczym elemencie na raz. Nie tworzy to zatem sekwencji elementów, które będą działać dla LSTM.
Korzystanie z TimeDistribution pozwala na działanie warstwy na każdym elemencie w sekwencji bez wpływu na siebie elementów. W ten sposób warstwy TimeDistorted działają na sekwencjach elementów, ale nie ma rekurencji.
W przypadku modelu typu 2 pierwsze warstwy wygenerują sekwencję o długości 5 kroków czasowych, a operacje wykonane na każdym elemencie w sekwencji będą od siebie niezależne, ponieważ warstwy owinięte w TimeDistribution nie są powtarzalne. Ponieważ warstwa LSTM korzysta z ustawień domyślnych, return_sequences = False, warstwa LSTM wygeneruje jeden wynik dla każdej takiej sekwencji 5 elementów.
Ostateczna liczba węzłów wyjściowych w twoim modelu zależy całkowicie od przypadku użycia. Pojedynczy węzeł nadaje się do czegoś takiego jak klasyfikacja binarna lub do generowania jakiegoś wyniku.
źródło
Myślę, że możesz skorzystać z mojej poprzedniej pracy. W tym kodzie tworzę fale sinusoidalne (o losowych długościach fal i fazach) i trenuję LSTM do sekwencji punktów z tych fal sinusoidalnych i generuję sekwencję 150 punktów kończącą każdą falę sinusoidalną.
To jest model:
A to jest cały skrypt:
źródło