2017-08-22 60 views
9

Kształt p_input w this LSTM Autoencoder dla "test.py" to (128,8,1); co oznacza 128 zestawów po 8 cyfr. Próbuję dostosować ten model do danych opartych na szeregach czasowych z 4 zestawami po 25000 kroków czasowych (w zasadzie od 0 sekund do 25 000 sekund). Próbowałem wprowadzić ten zestaw danych do p_input o kształcie (4,25000,1) i nie wystąpiły żadne błędy. Jednak po uruchomieniu skryptu, zamiast uzyskać iter 1: 0.01727, iter 2: 0.00983, ..., nie otrzymuję wydrukowanych komentarzy ze skryptu, więc zakładam, że coś trzyma skrypt. Próbowałem również zmienić tylko batch_num na 4 i step_num na 25 000 bezpośrednio na nieedytowany plik "test.py" i taki sam wynik, jak brak wydrukowanej informacji zwrotnej.Autoencoder LSTM bez postępu, gdy skrypt działa na większym zestawie danych

Moje myśli są takie, że w "test.py", zbyt długo trwa przetwarzanie tf.split i tf.squeeze operacji. Inną myślą jest, że potrzebuję zwiększyć liczbę ukrytych jednostek LSTM w hidden_num i/lub zwiększyć liczbę epok (iteration). Ponadto może być tak, że batch_num musi być większy niż step_num. Próbowałem tego z "test.py" z step_num = 4 i batch_num = 25000, a skrypt działał normalnie z wydrukowanymi informacjami zwrotnymi.

Poinformuj mnie, jakie są twoje przemyślenia na temat tego, w jaki sposób problem może powstrzymać działanie skryptu.

Odpowiedz

4

Drugi wymiar danych wejściowych to liczba przypadków, gdy sieć zostanie rozwinięta w celu obliczenia gradientów za pomocą algorytmu BPTT.

Chodzi o to, że sieć powtarzalna (taka jak LSTM) jest przekształcana w sieć z możliwością indeksowania poprzez "rozwijanie" za każdym razem, gdy jest to nowa warstwa sieci.

Gdy podajesz całą serię czasową razem (czyli 25000 kroków czasowych), rozwijasz swoją sieć 25000 razy, to znaczy, że uzyskasz rozwiniętą sieć z 25000 warstwami !!

Tak więc, chociaż nie wiem, dlaczego nie otrzymałeś żadnego błędu, problem prawdopodobnie związany jest z problemem OUT OF MEMORY. Nie można dopasować zmiennych 25000 warstw do pamięci.

Kiedy musisz radzić sobie z długimi seriami czasu, musisz podzielić swoje dane na porcje (powiedzmy 20 kroków). Zapewniasz pojedynczy kawałek na przebieg. Następnie przy każdym następnym uruchomieniu należy przywrócić początkowy stan sieci z ostatnim stanem poprzedniego uruchomienia.

Mogę podać Ci przykład. Co masz teraz (I zaniedbuje trzeci wymiar ze względów praktycznych) jest wektorem 4x25000, który jest ukształtowany tak:

--------------------- 25000---------------------- 
| 
| 
4 
| 
| 
-------------------------------------------------- 

Teraz trzeba podzielić go na kawałki, takie jak:

----20----- ----20----- ----20----- 
|   | |   | |   | 
|   | |   | |   | 
4   | 4   | 4   | [...] 
|   | |   | |   | 
|   | |   | |   | 
----------- ----------- ----------- 

Za każdym razem zapewniasz pojedynczą porcję 4x20. Następnie ostateczny stan twojego LSTM po każdym uchwycie musi zostać dostarczony jako dane wejściowe z następnym uchwytem.

więc feed_dict musi być coś takiego:

feed_dict ={x: input_4_20}, 
      state.c = previous_state.c, 
      state.h=previous_state.h} 

Zobacz LM tutorial z Tensorflow na przykład o tym, jak zapewnić stan na LSTM do następnego biegu.

Tensorflow zapewnia funkcję automatycznego robienia tego. Sprawdź Tensorflow DevSummit Tutorial na RNN API, aby uzyskać więcej informacji. Połączyłem dokładną sekundę, w której wyjaśniono pożądane funkcje. Ta funkcja jest ostatnią wskazówką, sugeruję, abyś przemyślał swoje zadanie. W rzeczywistości seria 25000 jest naprawdę długa i martwię się tym, że nawet LSTM nie jest w stanie zarządzać tak długimi przeszłymi zależnościami. Chodzi mi o to, że kiedy przetwarzasz 24000. element serii, stan LSTM prawdopodobnie zapomniał wszystkiego o pierwszym elemencie. W takich przypadkach spróbuj spojrzeć na swoje dane, aby zobaczyć, jaka jest skala twoich zjawisk. Jeśli nie potrzebujesz ziarnistości jednej sekundy (tzn. Twoja seria jest bardzo zbędna, ponieważ funkcje nie zmieniają się bardzo szybko w czasie), zmniejsz skalę serii, aby mieć krótszą sekwencję do zarządzania.

+0

Dziękuję za odpowiedź. 25 000 kroków czasowych pochodzi z interpolacji i wyboru liczby punktów. Zawsze mogę to zmienić. Jaka powinna być maksymalna liczba kroków czasowych? Również nie bardzo rozumiem, jak robisz chunking nawet po przeczytaniu wszystkich twoich linków. –

+0

Edytowałem odpowiedź. Powiedz mi, czy jest jaśniejszy. Jeśli chodzi o maksymalną liczbę kroków, zależy to od Twoich potrzeb. LSTM są w stanie nauczyć się zależności, która jest dość daleko w przeszłości, ale z mojego doświadczenia wynika, że ​​chodzenie o więcej niż 100 kroków nie jest dobre. Więc jako pojedyncze wejście, nie przekraczaj porcji, które są zbyt długie w wymiarze czasu (zachowaj 20-50 jest lepsze) –