2016-09-05 41 views
13

mam zestawu danych X, który składa N = 4000 próbek każda próbka zawiera d = 2 posiada (wartości ciągłych) obejmującym powrotem t = 10 czas czynności. Mam również odpowiednie "etykiety" każdej próbki, które są również wartościami ciągłymi, w punkcie 11. 11.Zrozumienie Tensorflow LSTM kształt wprowadzania

W tej chwili mój zbiór danych ma kształt X: [4000,20], Y: [4000].

Chcę trenować LSTM za pomocą TensorFlow, aby przewidzieć wartość Y (regresja), biorąc pod uwagę 10 poprzednich wejść d funkcji, ale mam trudny czas realizacji tego w TensorFlow.

Głównym problemem, jaki mam w tej chwili, jest zrozumienie, w jaki sposób TensorFlow spodziewa się sformatowania danych wejściowych. Widziałem różne przykłady, takie jak this, ale te przykłady dotyczą jednego dużego ciągu danych ciągłych szeregów czasowych. Moje dane to różne próbki, każda niezależna seria czasowa.

+0

Witam, próbuję zaimplementować coś bardzo podobnego do tego, co zrobiłeś i mam nadzieję, że możesz dać mi kilka wskazówek, ponieważ tensorflow wciąż jest dla mnie niesamowity. Jak wygląda plik wejściowy w konfiguracji? Czy każda próbka jest w zasadzie listą o długości 10 z każdym elementem zawierającym 2 cechy, a dla każdej próbki masz etykietę? na przykład [[f1, f2], [f1, f2], ...] – Dimebag

Odpowiedz

7

W documentation of tf.nn.dynamic_rnn stany:

inputs: Wejścia RNN. Jeśli time_major == False (domyślnie), musi to być Tensor kształtu: [batch_size, max_time, ...] lub zagnieżdżona krotka takich elementów.

W twoim przypadku oznacza to, że wejście powinno mieć kształt [batch_size, 10, 2]. Zamiast treningu na wszystkich 4000 sekwencjach naraz, używałbyś tylko batch_size wielu z nich w każdej iteracji treningu. Taki jak poniżej powinny działać (dodawane przekształcenia dla jasności)

batch_size = 32 
# batch_size sequences of length 10 with 2 values for each timestep 
input = get_batch(X, batch_size).reshape([batch_size, 10, 2]) 
# Create LSTM cell with state size 256. Could also use GRUCell, ... 
# Note: state_is_tuple=False is deprecated; 
# the option might be completely removed in the future 
cell = tf.nn.rnn_cell.LSTMCell(256, state_is_tuple=True) 
outputs, state = tf.nn.dynamic_rnn(cell, 
            input, 
            sequence_length=[10]*batch_size, 
            dtype=tf.float32) 

Z documentation, outputs będzie kształcie [batch_size, 10, 256], to znaczy jedno-wyjście 256 dla każdego kroku to. state będzie tuple kształtów [batch_size, 256]. Można przewidzieć swoją wartość końcową, po jednym dla każdej sekwencji, z tego:

predictions = tf.contrib.layers.fully_connected(state.h, 
               num_outputs=1, 
               activation_fn=None) 
loss = get_loss(get_batch(Y).reshape([batch_size, 1]), predictions) 

Numer 256 w kształtach outputs i state jest określana przez cell.output_size wzgl. cell.state_size. Podczas tworzenia LSTMCell jak wyżej, są one takie same. Zobacz także LSTMCell documentation.

+0

Dzięki za odpowiedź! Wypróbuję to wkrótce i dam ci znać, jeśli rozwiąże mój problem. Jedno pytanie jednak: co dokładnie odnosi się do 256 w tf.nn.rnn_cell.LSTMCell (256, state_is_tuple = True)? Przeczytałem dokumentację, a wartość jest określana jako n_jednostki. Czy to oznacza liczbę kroków czasowych? tj. pamięć komórki LSTM? Przepraszam, wiem, że jest to rozszerzenie pierwotnego pytania. –

+0

Liczba kroków czasowych w każdej sekwencji jest podawana przez parametr 'sequence_length', który podajesz do' tf.nn.dynamic_rnn'. Wartość 256 odnosi się do rozmiaru wewnętrznego stanu LSTM, który jest aktualizowany na każdym etapie czasowym. – fwalch

+0

@fwalch pytanie: czy nie chciałbyś, aby twoja w pełni połączona warstwa miała predykcje 'num_outputs = batch_size'? Czy miałbyś jedną prognozę na końcu każdej serii czasowej w swojej partii? – Engineero