2017-02-26 59 views
6

(przy użyciu pythona)Wyjście z Tensorflow LSTM-Cell

Mam pytanie dotyczące wdrożenia Tensorflow LSTM. Obecnie istnieje kilka implementacje w TF, ale używam:

cell = tf.contrib.rnn.BasicLSTMCell(n_units) 
  • gdzie n_units jest kwotę 'równoległy' LSTM-Cells.

Następnie, aby moje wyjście wzywam:

rnn_outputs, rnn_states = tf.nn.dynamic_rnn(cell, x, 
         initial_state=initial_state, time_major=False) 
  • gdzie (jak time_major=False) x ma kształt (batch_size, time_steps, input_length)
  • gdzie batch_size jest mój batch_size
  • gdzie time_steps jest kwota timesteps mój RNN przejdzie
  • gdzie input_length jest długością jednego z swoich wektorów wejściowych (wektora wprowadzonego do sieci, w jednym konkretnym kroku to na jednej konkretnej partii)

się spodziewać rnn_outputs się kształt (batch_size, time_steps, n_units, input_length) jak nie podano innego formatu wyjściowego. Dokumentacja z nn.dynamic_rnn mówi mi, że wyjście ma kształt (batch_size, input_length, cell.output_size). Dokumentacja tf.contrib.rnn.BasicLSTMCell ma właściwość output_size, która jest domyślnie ustawiona na n_jednostki (ilość komórek LSTM, których używam).

Czy każda komórka LSTM generuje tylko skalar dla każdego określonego czasu? Spodziewam się, że wyprowadzi wektor długości wektora wejściowego. Wygląda na to, że nie rozumiem tego teraz, więc jestem zdezorientowany. Czy możesz mi powiedzieć, czy tak jest w tym przypadku, czy w jaki sposób mogę to zmienić, aby wyprowadzić wektor wielkości wektora wejściowego na pojedynczą komórkę LSTM?

+0

W jaki sposób doszliście do wniosku, że każda komórka LSTM generuje tylko skalar dla każdego określonego czasu? – jabalazs

+0

Czy możesz zamieścić istotę lub większy fragment kodu, abyśmy mogli zobaczyć/uruchomić kod w celu lepszego zrozumienia kontekstu? –

Odpowiedz

2

Myślę, że głównym zamętem jest terminologia argumentu komórki LSTM: num_units. Niestety nie oznacza to, jak sama nazwa wskazuje, "liczby komórek LSTM", które powinny być równe Twoim czasom. W rzeczywistości odpowiadają one liczbie wymiarów w stanie ukrytym (stan komórki + ukryty wektor stanu). Wezwanie do dynamic_rnn() zwraca tensor kształtu: [batch_size, time_steps, output_size] gdzie

(Uwaga ta) output_size = NUM_UNITS; if (num_proj = None) w komórce lstm
gdzie as, output_size = num_proj; jeśli jest zdefiniowany.

Teraz, zazwyczaj, będzie wyodrębnić wynik ostatniego time_step i rzutować go do wielkości wymiarów wyjściowych za pomocą operacji mat-mul + biases ręcznie lub użyć argumentu num_proj w komórce LSTM.
Przeszedłem przez to samo zmieszanie i musiałem wyglądać naprawdę głęboko, aby je oczyścić. Mam nadzieję, że ta odpowiedź usuwa niektóre z nich.