Mam bardzo prosty problem, ale nie mogę znaleźć odpowiedniego narzędzia do jego rozwiązania.
Mam sekwencję wektorów o tej samej długości. Teraz chciałbym trenować LSTM RNN na próbce pociągu tych sekwencji, a następnie sprawić, by przewidział nową sekwencję wektorów o długości na podstawie kilku wektorów startowych .
Nie mogę znaleźć prostej implementacji, która by to zrobiła. Moim podstawowym językiem jest Python, ale wszystko, co nie instaluje się przez kilka dni, będzie działać.
Próbowałem użyć Lasagne , ale implementacja RNN nie jest jeszcze gotowa i znajduje się w osobnym pakiecie nntools . W każdym razie wypróbowałem ten drugi, ale nie mogę wymyślić, jak go wyszkolić, a następnie zalać go kilkoma wektorami testowymi i pozwolić przewidzieć nowy. Bloki są tym samym problemem - brak dokumentacji dla LSTM RNN, chociaż wydaje się, że istnieją pewne klasy i funkcje, które mogłyby działać (np blocks.bricks.recurrent
.).
Istnieje kilka realizacja RNN LSTM w Theano, jak GroundHog
, theano-rnn
, theano_lstm
i kod dla niektórych gazetach, ale nie z nich ma poradnik lub przewodnik, jak to zrobić, co chcę.
Jedynym użytecznym rozwiązaniem, jakie znalazłem, było użycie Pybrain. Niestety nie ma w nim funkcji Theano (głównie obliczeń na GPU) i jest osierocony (brak nowych funkcji i wsparcia).
Czy ktoś wie, gdzie mogę znaleźć to, o co proszę? Łatwy w obsłudze z RNN LSTM do przewidywania sekwencji wektorów?
Edytować:
Próbowałem Keras w ten sposób:
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM
model = Sequential()
model.add(Embedding(12, 256))
model.regularizers = []
model(LSTM(256, 128, activation='sigmoid',
inner_activation='hard_sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(128, 12))
model.add(Activation('sigmoid'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
ale pojawia się ten błąd, gdy próbuję go dopasować model.fit(X_train, y_train, batch_size=16, nb_epoch=10)
IndexError: index 800 is out of bounds for axis 1 with size 12
natomiast X_train
i y_train
są tablicami tablic (o długości 12), np[[i for i in range(12)] for j in range(1000)]
źródło
Odpowiedzi:
W końcu znalazłem sposób i udokumentowałem go na moim blogu tutaj .
Istnieje porównanie kilku frameworków, a następnie jednej implementacji w Keras.
źródło
Sugerowałbym następujące:
0) Theano jest naprawdę potężny, ale tak, czasami dorsz może być trudny
1) Proponuję Ci sprawdzić breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb, który jest nieco łatwiejszy do zrozumienia i ma również moduł LSTM. Co więcej, ciekawym wyborem jest autograd autorstwa Harvards, który dokonuje automatycznego symbolicznego różnicowania funkcji numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py i dlatego łatwo można zrozumieć, co się dzieje.
2) Jestem fanem Pythona, ale to moje osobiste preferencje. Czy zastanawiałeś się, czy Torch7 jest najbardziej przyjazną dla użytkownika strukturą dla sieci neuronowych i jest również używany przez Google Deepmind i AI AI na Facebooku? Możesz sprawdzić ten bardzo interesujący post na blogu o RNN http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Ponadto implementacja LSTM jest dostępna w repozytorium github postu, a alternatywą jest pakiet rnn https://github.com/Element-Research/rnn .
źródło
Testowałem LSTM przewidując pewną sekwencję czasową z Theano. Odkryłem, że dla jakiejś gładkiej krzywej można to poprawnie przewidzieć. Jednak dla niektórych krzywych zygzakowatych. Trudno przewidzieć. Szczegółowy artykuł jest następujący: Przewidywanie sekwencji czasowej za pomocą LSTM
Przewidywany wynik można przedstawić w następujący sposób:
źródło