Sử dụng RNN (LSTM) để dự đoán các vectơ thời gian (Theano)


19

Tôi có vấn đề rất đơn giản nhưng tôi không thể tìm thấy một công cụ phù hợp để giải quyết nó.

Tôi có một số chuỗi các vectơ có cùng độ dài. Bây giờ tôi muốn huấn luyện LSTM RNN trên mẫu đào tạo các chuỗi này và sau đó thực hiện để dự đoán chuỗi vectơ mới có độ dài dựa trên một số vectơ mồi .n

Tôi không thể tìm thấy thực hiện đơn giản mà sẽ làm điều này. Ngôn ngữ cơ bản của tôi là Python, nhưng bất cứ thứ gì không cài đặt trong nhiều ngày sẽ giữ được.

Tôi đã thử sử dụng Lasagne , nhưng việc triển khai RNN vẫn chưa sẵn sàng và đó là trong các gói nntools riêng biệt . Dù sao, tôi đã thử cái thứ hai nhưng tôi không thể tìm ra cách huấn luyện nó, sau đó chọn nó bằng một số vectơ kiểm tra và để nó dự đoán người mới. Các khối là cùng một vấn đề - không có tài liệu nào có sẵn cho LSTM RNN, mặc dù có vẻ như có một số lớp và chức năng có thể hoạt động (ví dụ blocks.bricks.recurrent).

Có một số thực hiện RNN LSTM trong Theano, như GroundHog, theano-rnn, theano_lstmvà mã cho một số giấy tờ, nhưng không những có hướng dẫn hoặc hướng dẫn làm thế nào để làm những gì tôi muốn.

Giải pháp có thể sử dụng duy nhất tôi tìm thấy là sử dụng Pybrain. Nhưng thật không may, nó thiếu các tính năng của Theano (chủ yếu là tính toán GPU) và mồ côi (không có tính năng và hỗ trợ mới).

Có ai biết nơi tôi có thể tìm thấy những gì tôi yêu cầu? Dễ dàng làm việc với RNN LSTM để dự đoán chuỗi các vectơ?

Chỉnh sửa:

Tôi đã thử Keras như thế này:

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

nhưng tôi gặp lỗi này khi cố gắng điều chỉnh nó 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

trong khi X_trainy_trainlà mảng của mảng (có độ dài 12), vd[[i for i in range(12)] for j in range(1000)]


1
Tại sao bạn cần RNN nếu tất cả các chuỗi của bạn có cùng độ dài? Đào tạo vector đầu vào tĩnh thông qua ANN sẽ dễ dàng và nhanh hơn.
itdxer

Các vectơ đến từ thời gian. Vì vậy, RNN là cần thiết tôi đoán?
kotrfa

1
RNN là một tuyệt vời cho các nhiệm vụ khi bạn không biết kích thước vectơ đầu vào hoặc đầu ra. Ví dụ: bạn muốn xây dựng mạng sẽ mô tả bằng tiếng Anh những gì bạn có thể nhìn thấy trên ảnh, vì vậy đầu vào của bạn có thể là hình ảnh tĩnh, nhưng đầu ra sẽ thay đổi tùy thuộc vào những gì bạn có thể nhìn thấy trên ảnh. Một ví dụ khác khi bạn muốn có được bản dịch văn bản, cả đầu vào và đầu ra của bạn đều không xác định.
itdxer

Cảm ơn bạn đã làm rõ. Vì vậy, không có lý do để sử dụng RNN trong nhiệm vụ này. Được.
kotrfa

2
Nhận xét của @ itdxer là sai lệch. Ngay cả khi dữ liệu của bạn có cùng độ dài ở mọi nơi, sử dụng RNN có thể có lợi. Một RNN đưa ra một giả định về dữ liệu, chủ yếu là nó có tính chất tuần tự. Ví dụ, dịch dọc theo trục thời gian được xử lý một cách duyên dáng bởi các RNN, nhưng không phải bằng phương pháp chuyển tiếp nguồn cấp dữ liệu - họ cần nhiều dữ liệu đào tạo hơn để nhận ra điều đó và có nhiều tham số hơn để ước tính. Có nhiều trường hợp ANN sẽ bị sập và cháy nếu được sử dụng thay vì RNN.
bayerj

Câu trả lời:


10

Cuối cùng tôi đã tìm thấy một cách và ghi lại nó trên blog của tôi ở đây .

Có so sánh một số khung công tác và sau đó cũng là một triển khai trong Keras.


5

Tôi muốn đề nghị như sau:

0) Theano thực sự mạnh mẽ nhưng vâng, đôi khi cá tuyết có thể trở nên khó chịu

1) Tôi sẽ đề nghị bạn kiểm tra breze: https://github.com/enameze-no-salt/enameze/blob/master/notebooks/reciverse-networks/RNNs%20for%20Piano%20music.ipynb dễ dàng hơn một chút được hiểu và có một mô-đun LSTM là tốt. Hơn nữa, một lựa chọn hấp dẫn là tự động bởi Harvestards, trong đó tự động phân biệt biểu tượng của các chức năng numpy https://github.com/HIPS/autograd/blob/master/examples/lstm.py và do đó bạn có thể dễ dàng hiểu những gì đang diễn ra.

2) Tôi là một người hâm mộ trăn nhưng đây là sở thích cá nhân của tôi. Bạn đã xem sử dụng Torch7 là khung thân thiện với người dùng nhất cho các mạng thần kinh và cũng được Google Deepmind và Facebook AI sử dụng chưa? Bạn có thể kiểm tra bài đăng trên blog rất hấp dẫn này về RNNs http://karpathy.github.io/2015/05/21/rnn-effectively/ . Ngoài ra, việc triển khai LSTM có sẵn trong repo github của bài đăng, trong khi một giải pháp thay thế là gói rnn https://github.com/Euity-Research/rnn .


1
Tôi đã sử dụng thành công công việc của Karpathy trong vài tuần qua. Thật không may, tôi không thể điều chỉnh thuật toán của anh ấy để đưa ra dự đoán về vectơ và không phải là chuỗi các ký tự. Đó cũng là vì tôi không quen lắm với Lua. Do đó, tôi cũng đã sử dụng Torch7 một cách thụ động , nhưng tôi thực sự không thấy nó rất thân thiện. Cảm ơn bạn
kotrfa

SNN

Tôi có vector gồm 12 phần tử từ phép đo cho mỗi giây. Tôi muốn huấn luyện mạng, sau đó đánh dấu nó bằng 5 vectơ (có độ dài 12) và để nó dự đoán vectơ sau. Chỉ có bấy nhiêu thôi. Tôi đã cập nhật câu hỏi của mình với thử sử dụng Keras.
kotrfa

bạn cũng có thể sử dụng một nguồn cấp dữ liệu đơn giản cho điều đó ngay cả khi các vectơ của bạn đến từ một chuỗi thời gian. Chỉ cần chắc chắn rằng số lượng các chuỗi là không đổi.
Yannis Assael

Từ một vài bài báo tôi đã đọc, như Karpathy, tôi hiểu rằng LSTM là lựa chọn tốt nhất cho các chuỗi, phải không? Liệu NN chuyển tiếp đơn giản có "tính năng bộ nhớ" không?
kotrfa

0

Tôi đã thử nghiệm LSTM dự đoán một số chuỗi thời gian với Theano. Tôi thấy rằng đối với một số đường cong trơn tru, nó có thể được dự đoán đúng. Tuy nhiên đối với một số đường cong ngoằn ngoèo. Thật khó để dự đoán. Bài viết chi tiết như sau: Dự đoán chuỗi thời gian với LSTM

Kết quả dự đoán có thể được hiển thị như sau:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.