Załóżmy, że masz dane szeregów czasowych z rzędami i kolumnami, które chcesz przesłać do warstwy w Keras. Zanim podasz to do RNN, musisz przekształcić poprzednie dane w tensor 3D. Staje się więc .N700SimpleRNN(200, return_sequence=True)
N×700×1
Zdjęcie pochodzi z https://colah.github.io/posts/2015-08-Understanding-LSTMs
W RNN twoje kolumny („700 kolumn”) są znakami czasowymi RNN. Twoje dane są przetwarzane od . Po wprowadzeniu danych do RNN ma teraz 700 wyjść, które są w od do , a nie od do . Pamiętaj, że teraz kształt twoich danych to co oznacza próbki (wiersze) x kroki czasu (kolumny) x kanały .t=1 to 700h1h700h1h200N×700×200
A następnie, gdy zastosujesz a TimeDistributedDense
, nakładasz Dense
warstwę na każdym kroku czasu, co oznacza, że nakładasz Dense
warstwę odpowiednio na każdym , , ..., . Co oznacza: w rzeczywistości stosujesz w pełni połączoną operację na każdym z kanałów (odpowiednio „200”), od do . Pierwsze „ ” aż do 700. „ ”.h1h2hth1h7001×1×2001×1×200
Dlaczego to robimy? Ponieważ nie chcesz spłaszczać wyjścia RNN.
Dlaczego nie spłaszczyć wyjścia RNN? Ponieważ chcesz zachować osobne wartości timepep.
Dlaczego warto przechowywać osobne wartości timepep? Dlatego:
- chcesz tylko oddziaływać na wartości między swoim czasem
- nie chcesz mieć przypadkowej interakcji między różnymi krokami czasowymi i kanałami.