Jaka jest rola warstwy TimeDistributed w Keras?

82

Próbuję zrozumieć, co robi opakowanie TimeDistributed w Keras.

Dostaję, że TimeDistributed „stosuje warstwę do każdego czasowego wycinka danych wejściowych”.

Ale przeprowadziłem pewien eksperyment i otrzymałem wyniki, których nie mogę zrozumieć.

Krótko mówiąc, w połączeniu z warstwą LSTM, TimeDistributed i po prostu Dense dają takie same wyniki.

model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add(TimeDistributed(Dense(1)))
print(model.output_shape)

model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add((Dense(1)))
print(model.output_shape)

Dla obu modeli otrzymałem kształt wyjściowy (Brak, 10, 1) .

Czy ktoś może wyjaśnić różnicę między warstwą TimeDistributed i Dense po warstwie RNN?

Buomsoo Kim
źródło
1
Obecnie wydaje się, że nie ma różnicy, tutaj dyskusja na ten temat. Myślę, że pierwotnym zamiarem było dokonanie rozróżnienia między Densewarstwą spłaszczającą dane wejściowe, a następnie przekształcającą, a więc łączącą różne kroki czasowe i posiadającą więcej parametrów, oraz TimeDistributedutrzymującą przedziały czasowe oddzielone (stąd mniej parametrów). W twoim przypadku Densepowinien był mieć 500 parametrów, TimeDistributedtylko 50
gionni
@gionni Nie, ma taką samą liczbę parametrów (oba 6). Więc nie ma praktycznie żadnej różnicy w atm?
Buomsoo Kim
Dokładnie tak, to jest liczba parametrów, które mieliby, gdyby była różnica. W tej chwili nie ma
gionni

Odpowiedzi:

84

W keras- przy budowaniu modelu sekwencyjnego - zwykle drugi wymiar (jeden po wymiarze przykładowym) - jest powiązany z timewymiarem. Oznacza to, że jeśli na przykład dane są 5-dimz (sample, time, width, length, channel)tobą, możesz zastosować warstwę splotową przy użyciu TimeDistributed(co ma zastosowanie do 4-dimwith (sample, width, length, channel)) wzdłuż wymiaru czasu (nakładając tę ​​samą warstwę na każdy wycinek czasu) w celu uzyskania 5-dwyniku.

Przypadek Densejest taki, że kerasod wersji 2.0 Densejest domyślnie stosowany tylko do ostatniego wymiaru (np. Jeśli zastosujesz Dense(10)dane wejściowe z kształtem (n, m, o, p), otrzymasz dane wyjściowe z kształtem (n, m, o, 10)), więc w twoim przypadku Densei TimeDistributed(Dense)są równoważne.

Marcin Możejko
źródło
3
Istnieje przykład użycia TimeDistributed do pakowania samego modelu. Kiedy jest to zastosowane do Inputtensora, czy jest jakaś różnica w porównaniu z wykonaniem mapmodelu zastosowanego do listy zawierającej każdy wycinek Input?
CMCDragonkai