2016-07-11 11 views
9

के लिए केरा के साथ एलएसटीएम मैं समय-श्रृंखला पूर्वानुमान स्ट्रीमिंग के लिए केरास में एक एलएसटीएम लागू करना चाहता हूं - यानी, ऑनलाइन चल रहा है, एक समय में एक डेटा बिंदु प्राप्त करना। 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() 

परिणामों का निरीक्षण करने के लिए, नीचे दिए गए भूखंड नीले रंग में वास्तविक (सामान्यीकृत) डेटा, हरे रंग में प्रशिक्षण सेट पर भविष्यवाणियां, और लाल रंग में परीक्षण सेट पर भविष्यवाणियां।

Results for batch prediction

Results from stateful prediction

पहला चित्र बैच भविष्यवाणी का उपयोग करने से है, और स्टेटफुल से दूसरे। कोई विचार क्या मैं गलत तरीके से कर रहा हूँ?

+2

प्रशिक्षण और ऑनलाइन परीक्षण के दौरान दोनों में राज्य की स्थिति का उपयोग करें। प्रशिक्षण के दौरान बस प्रत्येक बैच के बाद राज्य को रीसेट करें। यह चीजों को भी आसान बनाता है क्योंकि आप अपने सभी डेटा को उसी तरह से ढांचा देंगे। – runDOSrun

+1

किसी और के लिए कैरस में स्टेटस एलएसटीएम को समझना चाहते हैं, यहां एक ट्यूटोरियल है: http://philipperemy.github.io/keras-stateful-lstm/ –

उत्तर

8

यदि मैं आपको सही ढंग से समझता हूं तो आप पूछ रहे हैं कि क्या आप प्रशिक्षण के बाद राज्य की स्थिति को सक्षम कर सकते हैं। यह संभव होना चाहिए, हां। उदाहरण के लिए:

net = Dense(1)(SimpleRNN(stateful=False)(input)) 
model = Model(input=input, output=net) 

model.fit(...) 

w = model.get_weights() 
net = Dense(1)(SimpleRNN(stateful=True)(input)) 
model = Model(input=input, output=net) 
model.set_weights(w) 

इसके बाद आप एक राज्य के तरीके से भविष्यवाणी कर सकते हैं।

+0

धन्यवाद। मैंने इसे लागू करने का प्रयास किया है, लेकिन अभी भी कुछ समस्याएं हैं। कृपया संपादित प्रश्न देखें। मैं वास्तव में आपकी मदद की सराहना करता हूं! – BoltzmannBrain

+2

दो चीजें: आप अपनी आवर्ती परतों की स्थिति को कभी भी रीसेट नहीं कर रहे हैं और डेटा बहुत समान दिखता है लेकिन अलग-अलग स्केल किया जाता है; उदाहरण के लिए यह आपकी साजिश की एक साधारण स्केलिंग समस्या हो सकती है। किसी भी मामले में यह प्रश्न अब एसओ के लिए उपयुक्त नहीं है। शायद अपने आप को उबलते चीजों पर परीक्षण करना और छोटे प्रश्नों को तैयार करना सबसे अच्छा है :) – nemo

संबंधित मुद्दे