2016-02-17 12 views
5

Właśnie zacząłem grać z TensorFlow i próbuję wdrożyć bardzo prosty RNN. RNN ma x jako dane wejściowe, y jako dane wyjściowe i składa się z pojedynczej warstwy, która pobiera x i poprzedniej wartości wyjściowej jako dane wejściowe. Oto zdjęcie z rodzaju rzeczy mam na myśli:Jak zbudować prosty RNN z cyklem na wykresie w TensorFlow?

A simple RNN

Problem polega na tym, że nie widzi żadnego drogę przez TensorFlow API do skonstruowania wykresu z cyklu w nim. Ilekroć definiuję tensor, muszę określić, jakie są jego wejścia, co oznacza, że ​​muszę już zdefiniować jego wejścia. Jest więc problem z kurczakiem i jajkiem.

Nie wiem nawet, czy sensowne jest definiowanie wykresu za pomocą cyklu (Co najpierw zostanie obliczone? Czy muszę zdefiniować wartość początkową węzła softmax?). Grałem z pomysłem użycia zmiennej do reprezentowania poprzedniego wyjścia, a następnie ręcznie przyjmuję wartość y i przechowuję ją w zmiennej za każdym razem po karmieniu przez próbkę treningową. Ale byłoby to bardzo powolne, chyba że istnieje jakiś sposób przedstawienia tej procedury na samym wykresie (?).

Wiem, że tutoriale TensorFlow pokazują przykładowe implementacje RNN, ale oszukują i wyciągają moduł LSTM z biblioteki, która już ma w sobie cykl. Ogólnie rzecz biorąc, tutoriale są dobre, aby omówić, jak zbudować pewne rzeczy, ale mogą lepiej wyjaśnić, w jaki sposób ta bestia naprawdę działa.

Eksperci TensorFlow, czy istnieje sposób na zbudowanie tego? Jak miałbym to zrobić?

+0

Twój zmienny pomysł wydaje się być sposobem na przejście, nie powinien być powolny, jeśli używasz zmiennych TensorFlow/assign ops –

+0

Ale nie musiałbym wywoływać 'sess.run (y_prev.assign (y))' i uruchamiać próbki za jednym razem? Czy masz na myśli to, że powinienem połączyć to z taktyką rozwijania opisaną przez @Ishamaela? – Shum

Odpowiedz

2

W rzeczywistości zarówno przekazywanie do przodu, jak i do tyłu we wszystkich systemach uczenia maszynowego zakłada, że ​​sieć nie ma cykli. Powszechnym sposobem implementacji sieci powtarzalnej jest rozwijanie jej w czasie na kilka etapów (na przykład 50), a zatem przekształcenie sieci z pętlami w taką, która nie ma żadnej.

Na przykład w docs masz na myśli:

https://www.tensorflow.org/versions/r0.7/tutorials/recurrent/index.html

one wspomnieć

aby uczynić proces uczenia tractable, jest to powszechna praktyka, aby obciąć gradienty dla wstecznej propagacji do ustalonej liczby (num_steps) rozwiniętych kroków.

Co to w rzeczywistości oznacza to, że będą tworzyć num_steps komórki LSTM, gdzie każdy wykonuje jako wejście wartość x dla bieżącego kroku to, a wyjście modułu LSTM poprzednie.

Ten, którego używają i który według ciebie ma pętlę, nie ma pętli. Komórka LSTM jest po prostu implementacją pojedynczego kroku LSTM (blok, który ma dwa wejścia [wejście i pamięć] i dwa wyjścia [wyjście i pamięć] oraz wykorzystuje bramki do obliczania wyjść z wejść), a nie całą sieć LSTM.

Powiązane problemy