के लिए केरा के साथ एलएसटीएम मैं समय-श्रृंखला पूर्वानुमान स्ट्रीमिंग के लिए केरास में एक एलएसटीएम लागू करना चाहता हूं - यानी, ऑनलाइन चल रहा है, एक समय में एक डेटा बिंदु प्राप्त करना। This is explained well here, लेकिन जैसा कि कोई मानता है, ऑनलाइन एलएसटीएम के लिए प्रशिक्षण समय निषिद्ध रूप से धीमा हो सकता है। मैं मिनी-बैचों पर अपने नेटवर्क को प्रशिक्षित करना चाहता हूं, और टेस्ट (रन भविष्यवाणी) ऑनलाइन। केरास में ऐसा करने का सबसे अच्छा तरीका क्या है?मिनी बैच प्रशिक्षण और ऑनलाइन परीक्षण
उदाहरण के लिए, मिनी-बैच 1000 डेटा मानों ([33, 34, 42, 33, 32, 33, 36, ... 24, 23]
) का अनुक्रम हो सकता है जो लगातार समय पर होता है। नेटवर्क को प्रशिक्षित करने के लिए मैंने आकार के X
निर्दिष्ट किया है, जहां 900 अनुक्रम लंबाई 100 हैं, और आकार (900, 1)
आकार y
है। जैसे,
X[0] = [[33], [34], [42], [33], ...]]
X[1] = [[34], [42], [33], [32], ...]]
...
X[999] = [..., [24]]
y[999] = [23]
इसलिए प्रत्येक अनुक्रम X[i]
के लिए, वहाँ एक इसी y[i]
कि समय श्रृंखला में अगले मूल्य का प्रतिनिधित्व करता है - क्या हम भविष्यवाणी करने के लिए चाहते हैं।
परीक्षण में मैं 1000 से 1 999 के अगले डेटा मानों की भविष्यवाणी करना चाहता हूं। मैं 1000 से 1 999 तक प्रत्येक चरण के लिए (1, 100, 1)
आकार की एक सरणी खिलाकर ऐसा करता हूं, जहां मॉडल अगले चरण में मूल्य की भविष्यवाणी करने का प्रयास करता है।
क्या यह मेरी समस्या के लिए अनुशंसित दृष्टिकोण और सेटअप है? राज्य भर में सक्षमता पूरी तरह से ऑनलाइन कार्यान्वयन के लिए जा सकती है, लेकिन केरास में प्रशिक्षण और परीक्षण में लगातार batch_input_shape
की आवश्यकता होती है, जो मिनी बैचों पर प्रशिक्षण के मेरे इरादे के लिए काम नहीं करेगा और फिर ऑनलाइन परीक्षण करेगा। या क्या मैं ऐसा कर सकता हूं?
अद्यतन: नेटवर्क को लागू करने के रूप में @nemo सिफारिश
मैं एक ब्लॉग पोस्ट "Time Series Prediction with LSTM Recurrent Neural Networks in Python with Keras" से एक उदाहरण नेटवर्क पर अपने ही डाटासेट भाग गया, और फिर एक स्टेटफुल नेटवर्क के रूप में भविष्यवाणी चरण को लागू करने की कोशिश की कोशिश कर रहा है।
# Create and fit the LSTM network
numberOfEpochs = 10
look_back = 30
model = Sequential()
model.add(LSTM(4, input_dim=1, input_length=look_back))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, nb_epoch=numberOfEpochs, batch_size=1, verbose=2)
# trainX.shape = (6883, 30, 1)
# trainY.shape = (6883,)
# testX.shape = (3375, 30, 1)
# testY.shape = (3375,)
बैच भविष्यवाणी साथ किया जाता है:
मॉडल निर्माण और प्रशिक्षण दोनों के लिए समान है
trainPredict = model.predict(trainX, batch_size=batch_size)
testPredict = model.predict(testX, batch_size=batch_size)
स्टेटफुल भविष्यवाणी चरण की कोशिश करने के लिए, मैं एक ही मॉडल सेटअप और प्रशिक्षण भाग गया पहले के रूप में, लेकिन फिर निम्नलिखित:
w = model.get_weights()
batch_size = 1
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
trainPredictions, testPredictions = [], []
for trainSample in trainX:
trainPredictions.append(model.predict(trainSample.reshape((1,look_back,1)), batch_size=batch_size))
trainPredict = numpy.concatenate(trainPredictions).ravel()
for testSample in testX:
testPredictions.append(model.predict(testSample.reshape((1,look_back,1)), batch_size=batch_size))
testPredict = numpy.concatenate(testPredictions).ravel()
परिणामों का निरीक्षण करने के लिए, नीचे दिए गए भूखंड नीले रंग में वास्तविक (सामान्यीकृत) डेटा, हरे रंग में प्रशिक्षण सेट पर भविष्यवाणियां, और लाल रंग में परीक्षण सेट पर भविष्यवाणियां।
पहला चित्र बैच भविष्यवाणी का उपयोग करने से है, और स्टेटफुल से दूसरे। कोई विचार क्या मैं गलत तरीके से कर रहा हूँ?
प्रशिक्षण और ऑनलाइन परीक्षण के दौरान दोनों में राज्य की स्थिति का उपयोग करें। प्रशिक्षण के दौरान बस प्रत्येक बैच के बाद राज्य को रीसेट करें। यह चीजों को भी आसान बनाता है क्योंकि आप अपने सभी डेटा को उसी तरह से ढांचा देंगे। – runDOSrun
किसी और के लिए कैरस में स्टेटस एलएसटीएम को समझना चाहते हैं, यहां एक ट्यूटोरियल है: http://philipperemy.github.io/keras-stateful-lstm/ –