Використання RNN (LSTM) для прогнозування векторів таймсерій (Theano)


19

У мене дуже проста проблема, але я не можу знайти правильний інструмент для її вирішення.

У мене є деяка послідовність векторів однакової довжини. Тепер я хотів би навчити LSTM RNN на зразку поїздів цих послідовностей, а потім змусити його передбачити нову послідовність векторів довжиною на основі декількох векторів праймінгу .н

Я не можу знайти просту реалізацію, яка б це зробила. Моя основна мова - Python, але все, що не встановлюється днями, буде тримати.

Я намагався використовувати Lasagne , але реалізація RNN ще не готова і знаходиться в окремому пакеті nntools . У всякому разі, я спробував останній, але не можу зрозуміти, як його тренувати, а потім прокласти його за допомогою деяких тестових векторів і дозволити йому передбачити нових (-ів). Блоки є тією ж проблемою - жодна документація не доступна для LSTM RNN, хоча здається, що існують деякі класи та функції, які можуть працювати (наприклад blocks.bricks.recurrent).

Є кілька реалізація РНН LSTM в Theano, як GroundHog, theano-rnn, theano_lstmі код для деяких робіт, але не з них мають підручник або керівництво , як зробити те , що я хочу.

Єдине корисне для мене рішення - це використання Pybrain. Але, на жаль, йому не вистачає можливостей Theano (в основному обчислення GPU) і він осиротів (немає нових можливостей та підтримки).

Хтось знає, де я міг би знайти те, про що прошу? Легко працювати з RNN LSTM для прогнозування послідовностей векторів?

Редагувати:

Я спробував Кераса так:

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')

але я отримую цю помилку при спробі її пристосувати 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

в той час як X_trainі y_trainє масивами масивів (довжиною 12), наприклад[[i for i in range(12)] for j in range(1000)]


1
Навіщо вам потрібна RNN, якщо всі ваші послідовності мають однакову довжину? Потяг статичного вхідного вектора через ANN був би простішим та швидшим.
itdxer

Вектори походять із таймерів. Значить, RNN необхідний, я думаю?
kotrfa

1
RNN - це мастило для завдань, коли ви не знаєте розмір вхідного або вихідного вектора. Наприклад, ви хочете побудувати мережу, яка опишеть англійською мовою те, що ви можете бачити на малюнку, тож ваш вхід може стати статичним зображенням, але вихід буде залежати від того, що ви можете бачити на малюнку. Ще один приклад, коли ви хочете отримати переклад тексту, там і ваш вхід, і вихід невідомі.
itdxer

Дякую за роз’яснення Тому немає ніяких причин використовувати RNN у цьому завданні. Добре.
kotrfa

2
@ коментар itdxer вводить в оману. Навіть якщо ваші дані скрізь мають однакову довжину, використання RNN може бути корисним. RNN вводить припущення про дані, головним чином, що вони мають послідовний характер. Наприклад, трансляція, наприклад, вісь часу, обробляється RNN, але не методами перенесення подачі - їм потрібно набагато більше навчальних даних, щоб зрозуміти це та мати ще багато параметрів для оцінки. Є ще багато випадків, коли ANN просто вийде з ладу та спалить, якщо використовуватиметься замість RNN.
байерж

Відповіді:


10

Нарешті я знайшов спосіб і задокументував це у своєму блозі тут .

Існує порівняння декількох фреймворків, а потім і одна реалізація в Керасі.


5

Я б запропонував таке:

0) Theano дійсно потужний, але так, тріска може бути непростим, іноді для початку

1) Я б запропонував вам перевірити Breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb, що трохи простіше бути зрозумілим і має також модуль LSTM. Крім того, цікавим вибором є автоград Harvards, який робить автоматичне символічне розмежування функцій numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py, і тому ви можете легко зрозуміти, що відбувається.

2) Я фанат пітона, але це мої особисті переваги. Чи вважали ви, що використання Torch7 є найбільш зручним для користувача середовищем для нейронних мереж, а також використовується Google Deepmind та Facebook AI? Ви можете перевірити цю цікаву публікацію в блозі про RNN http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Додатково, реалізація LSTM доступна у рефінансі повідомлення github, тоді як альтернативою є пакет rnn https://github.com/Element-Research/rnn .


1
Я успішно використовую роботу Карпатії протягом останніх кількох тижнів. На жаль, я не в змозі налаштувати його алгоритм для прогнозування векторів, а не послідовностей символів. Це також тому, що я не дуже знайомий з Луєю. Отже, я також пасивно використовував Torch7, але я не вважаю це дуже приємним. Дякую
kotrfa

SNN

У мене вектор 12 елементів від вимірювання за кожну секунду. Я хотів би тренувати мережу, а потім промальовувати її, наприклад, на 5 векторів (довжиною 12) і нехай передбачить наступний вектор. Нічого більше. Я оновив своє питання, намагаючись використати Keras.
kotrfa

Ви також можете використовувати просту подачу вперед для цього, навіть якщо ваші вектори походять із часового ряду. Просто переконайтесь, що кількість послідовностей є постійною.
Янніс Ассаель

З кількох прочитаних нами статей, як у Карпаті, я розумію, що LSTM - найкращий вибір для послідовностей, чи не так? Чи має простий канал передачі NN "функцію пам'яті"?
kotrfa

0

Я перевірив LSTM передбачення деякої часової послідовності з Theano. Я виявив, що для деякої плавної кривої її можна правильно передбачити. Однак для деякої кривої зигзагу. Важко передбачити Детальна стаття наведена нижче: Прогнозуйте послідовність часу з LSTM

Прогнозований результат можна показати так:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.