Menggunakan RNN (LSTM) untuk memprediksi vektor rentang waktu (Theano)

19

Saya memiliki masalah yang sangat sederhana tetapi saya tidak dapat menemukan alat yang tepat untuk menyelesaikannya.

Saya memiliki beberapa urutan vektor dengan panjang yang sama. Sekarang saya ingin melatih LSTM RNN pada sampel kereta dari urutan ini dan kemudian membuatnya untuk memprediksi urutan baru dari vektor panjang berdasarkan beberapa vektor priming .n

Saya tidak dapat menemukan implementasi sederhana yang akan melakukan ini. Bahasa dasar saya adalah Python, tetapi apa pun yang tidak diinstal selama berhari-hari akan bertahan.

Saya mencoba menggunakan Lasagne , tetapi implementasi RNN belum siap dan itu dalam paket nntools terpisah . Ngomong-ngomong, saya mencoba yang terakhir tetapi saya tidak tahu cara melatihnya, lalu melengkapinya dengan beberapa vektor uji dan membiarkannya memprediksi yang baru. Blok adalah masalah yang sama - tidak ada dokumentasi yang tersedia untuk LSTM RNN, walaupun tampaknya ada beberapa kelas dan fungsi yang bisa berfungsi (misalnya blocks.bricks.recurrent).

Ada beberapa pelaksanaan RNN LSTM di Theano, seperti GroundHog, theano-rnn, theano_lstmdan kode untuk beberapa kertas, tetapi bukan dari mereka punya tutorial atau membimbing bagaimana melakukan apa yang saya inginkan.

Satu-satunya solusi yang dapat digunakan yang saya temukan adalah menggunakan Pybrain. Tapi sayangnya itu tidak memiliki fitur Theano (terutama perhitungan GPU) dan yatim piatu (tidak ada fitur dan dukungan baru).

Adakah yang tahu di mana saya bisa menemukan apa yang saya minta? Mudah digunakan dengan RNN LSTM untuk memprediksi urutan vektor?

Edit:

Saya mencoba Keras seperti ini:

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

tapi saya mendapatkan kesalahan ini ketika mencoba memasangnya 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

sementara X_traindan y_trainadalah array array (dengan panjang 12), misalnya[[i for i in range(12)] for j in range(1000)]

kotrfa
sumber
1
Mengapa Anda membutuhkan RNN jika semua urutan Anda memiliki panjang yang sama? Melatih vektor input statis melalui JST akan lebih mudah dan lebih cepat.
itdxer
Vektor berasal dari deret waktu. Jadi RNN perlu saya kira?
kotrfa
1
RNN adalah greate untuk tugas-tugas ketika Anda tidak tahu ukuran vektor input atau output. Misalnya Anda ingin membangun jaringan yang akan menggambarkan dalam bahasa Inggris apa yang dapat Anda lihat pada gambar, sehingga input Anda dapat berupa gambar statis, tetapi output akan bervariasi tergantung pada apa yang dapat Anda lihat pada gambar. Contoh lain ketika Anda ingin mendapatkan terjemahan teks, di sana input dan output Anda tidak diketahui.
itdxer
Terima kasih atas klarifikasinya. Jadi tidak ada alasan untuk menggunakan RNN dalam tugas ini. Baik.
kotrfa
2
Komentar @ itdxer menyesatkan. Bahkan jika data Anda memiliki panjang yang sama di mana-mana, menggunakan RNN dapat bermanfaat. Suatu RNN memperkenalkan suatu asumsi data, terutama yang sifatnya berurutan. Misalnya terjemahan sepanjang sumbu waktu ditangani dengan anggun oleh RNNs, tetapi tidak dengan metode umpan maju - mereka membutuhkan lebih banyak data pelatihan untuk menyadari hal itu dan memiliki lebih banyak parameter untuk diperkirakan. Ada banyak kasus di mana JST hanya akan crash dan terbakar jika digunakan sebagai ganti RNN.
bayerj 3-15

Jawaban:

10

Saya akhirnya menemukan cara dan mendokumentasikannya di blog saya di sini .

Ada perbandingan beberapa framework dan kemudian juga satu implementasi di Keras.

kotrfa
sumber
5

Saya akan menyarankan yang berikut ini:

0) Theano benar-benar kuat, tetapi ya, kadang-kadang cod bisa sulit untuk memulai

1) Saya akan menyarankan Anda untuk memeriksa breze: https://github.com/breze-no-salt/breze/blob/master/notebooks/recurrent-networks/RNNs%20for%20Piano%20music.ipynb yang sedikit lebih mudah untuk dipahami dan memiliki modul LSTM juga. Selain itu, pilihan intresting adalah autograd oleh Harvards, yang melakukan diferensiasi simbolis otomatis dari fungsi numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py dan karena itu Anda dapat dengan mudah memahami apa yang terjadi.

2) Saya penggemar python tapi ini adalah preferensi pribadi saya. Sudahkah Anda mempertimbangkan menggunakan Torch7 adalah kerangka kerja yang paling user-friendly untuk jaringan saraf dan juga digunakan oleh Google Deepmind dan Facebook AI? Anda dapat memeriksa posting blog yang sangat menarik ini tentang RNN http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Selain itu, implementasi LSTM tersedia di repo github posting, sementara alternatifnya adalah paket rnn https://github.com/Element-Research/rnn .

Yannis Assael
sumber
1
Saya telah berhasil menggunakan pekerjaan Karpathy selama beberapa minggu terakhir. Sayangnya, saya tidak dapat mengubah algoritmanya untuk membuat prediksi vektor dan bukan urutan karakter. Itu juga karena aku tidak terlalu mengenal Lua. Oleh karena itu, saya juga menggunakan Torch7 secara pasif , tetapi saya tidak merasa sangat ramah. Terima kasih
kotrfa
SNN
Saya memiliki vektor 12 elemen dari pengukuran untuk setiap detik. Saya ingin melatih jaring, lalu memberikan prima misalnya dengan 5 vektor (panjang 12) dan biarkan ia memprediksi vektor berikut. Tidak ada lagi. Saya telah memperbarui pertanyaan saya dengan mencoba menggunakan Keras.
kotrfa
Anda juga dapat menggunakan umpan maju sederhana untuk itu bahkan jika vektor Anda berasal dari rangkaian waktu. Pastikan saja bahwa jumlah urutannya konstan.
Yannis Assael
Dari beberapa artikel yang saya baca, seperti Karpathy, saya mengerti bahwa LSTM adalah pilihan terbaik untuk urutan, bukan? Apakah umpan maju sederhana NN memiliki "fitur memori"?
kotrfa
0

Saya telah menguji LSTM memprediksi beberapa urutan waktu dengan Theano. Saya menemukan bahwa untuk beberapa kurva yang halus, dapat diprediksi dengan benar. Namun untuk beberapa kurva zig-zag. Sulit diprediksi. Artikel terperinci adalah sebagai berikut: Prediksi Urutan Waktu dengan LSTM

Hasil prediksi dapat ditampilkan sebagai berikut:

maple
sumber