केरस एलएसटीएम 1 डी समय श्रृंखला के साथ


10

मैं सीख रहा हूं कि कैसेर्स का उपयोग करना है और मैंने पायथन के लिए चोललेट के डीप लर्निंग पर उदाहरणों का उपयोग करके अपने लेबल किए गए डेटासेट के साथ उचित सफलता प्राप्त की है । 3 संभावित वर्गों के साथ लंबाई 3125 के साथ डेटा सेट ~ 1000 टाइम सीरीज़ है।

मैं मूल सघन परतों से परे जाना चाहता हूं, जो मुझे लगभग 70% भविष्यवाणी दर देती है और पुस्तक LSTM और RNN परतों पर चर्चा करती है।

सभी उदाहरण प्रत्येक समय के लिए कई विशेषताओं के साथ डेटासेट का उपयोग करने लगते हैं और मैं परिणाम के लिए अपने डेटा को लागू करने के तरीके के लिए संघर्ष कर रहा हूं।

यदि उदाहरण के लिए, मेरे पास 1000x3125 टाइम सीरीज़ है, तो मैं इसे SimpleRNN या LSTM लेयर की तरह कैसे खिलाऊँ? क्या मुझे कुछ मूलभूत ज्ञान याद आ रहा है कि ये परतें क्या करती हैं?

वर्तमान कोड:

import pandas as pd
import numpy as np
import os
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM, Dropout, SimpleRNN, Embedding, Reshape
from keras.utils import to_categorical
from keras import regularizers
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

def readData():
    # Get labels from the labels.txt file
    labels = pd.read_csv('labels.txt', header = None)
    labels = labels.values
    labels = labels-1
    print('One Hot Encoding Data...')
    labels = to_categorical(labels)

    data = pd.read_csv('ts.txt', header = None)

    return data, labels

print('Reading data...')
data, labels = readData()

print('Splitting Data')
data_train, data_test, labels_train, labels_test = train_test_split(data, labels)

print('Building Model...')
#Create model
model = Sequential()
## LSTM / RNN goes here ##
model.add(Dense(3, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

print('Training NN...')
history = model.fit(data_train, labels_train, epochs=1000, batch_size=50,
    validation_split=0.25,verbose=2)

results = model.evaluate(data_test, labels_test)

predictions = model.predict(data_test)

print(predictions[0].shape)
print(np.sum(predictions[0]))
print(np.argmax(predictions[0]))

print(results)

acc = history.history['acc']
val_acc = history.history['val_acc']
epochs = range(1, len(acc) + 1)

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

जवाबों:


10

LSTM परतों को एक अलग आकार के डेटा की आवश्यकता होती है।

आपके विवरण से, मैं शुरुआती डेटासेट को 3125 पंक्तियों और 1000 स्तंभों के साथ समझता हूं, जहां प्रत्येक पंक्ति एक समय-चरण है। लक्ष्य चर में 3125 पंक्तियाँ और 1 स्तंभ होना चाहिए, जहाँ प्रत्येक मान तीन संभावित मानों में से एक हो सकता है। तो ऐसा लगता है कि आप एक वर्गीकरण समस्या कर रहे हैं। इस कोड में जाँच करने के लिए, मैं करूँगा:

>>> X.shape
(3125, 1000)

>>> y.shape
(1000,)

LSTM वर्ग को समय के 'ब्लॉक' से मिलकर प्रत्येक एकल नमूने की आवश्यकता होती है। मान लीजिए कि आप 100 समय-चरणों का एक ब्लॉक करना चाहते हैं। इसका मतलब X[0:100]एकल इनपुट नमूना है, जो लक्ष्य चर पर मेल खाता है y[100]। इसका मतलब है कि आपके विंडो का आकार (उर्फ समय-चरणों या संख्या की संख्या) 100 के बराबर है। जैसा कि ऊपर कहा गया है, आपके पास 3125 नमूने हैं N = 3125। पहला ब्लॉक बनाने के लिए, हमें दुर्भाग्य से पहले 100 नमूनों को छोड़ना होगा y, क्योंकि हम उपलब्ध डेटा से 100 का एक पूरा ब्लॉक नहीं बना सकते हैं (हम पहले डेटा बिंदुओं की आवश्यकता होगी X[0])।

यह सब देखते हुए, एक LSTM को आपको आकार के बैचों को वितरित करने की आवश्यकता होती है (N - window_size, window_size, num_features), जो (3125 - 100, 100, 1000)== में अनुवाद करता है (3025, 100, 1000)

इन टाइम-ब्लॉक्स को बनाना थोड़ा मुश्किल है, लेकिन एक बार एक अच्छा फंक्शन बनाएं, फिर इसे सेव करें :)

अभी और काम किया जाना है, शायद ऊपर दिए गए मेरे स्पष्टीकरण के और अधिक गहन उदाहरणों पर गौर करें ... या LSTM प्रलेखन , (या बेहतर अभी भी, स्रोत कोड! ) के बारे में पढ़ा है ।

अंतिम मॉडल तब काफी सरल होगा (आपके कोड के आधार पर):

#Create model
model = Sequential()
model.add(LSTM(units=32, activation='relu',
               input_shape=(100, 1000))    # the batch size is neglected!
model.add(Dense(3, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam',
              metrics=['accuracy'])

मॉडल के लिए इनपुट आकार के बारे में दस्तावेज़ीकरणSequential पर एक नज़र डालें । यह मूल रूप से कहता है कि हमें बैचों की संख्या निर्दिष्ट करने की आवश्यकता नहीं है input_shape। यह उदाहरण के लिए किया जा सकता है batch_size=50, यदि आपको इसकी निश्चित संख्या की आवश्यकता है।

मुझे पता है कि input_shapeतर्क दस्तावेज़ीकरण में नहीं है LSTM, लेकिन वर्ग खुद से विरासत में मिला है RNN, जो बदले में विरासत में मिला है Layer- इसलिए यह आपके द्वारा प्रदान की गई जानकारी का उपयोग करने में सक्षम होगा।

एक अंतिम टिप: यदि आप कई LSTM परतों (उन्हें 'स्टैकिंग') में जोड़ने की योजना बना रहे हैं, तो आपको सभी के लिए एक और तर्क जोड़ने की आवश्यकता होगी , लेकिन अंतिम LSTM , अर्थात् return_sequences=True


व्यापक उत्तर के लिए धन्यवाद Dexter (!)। बैच आकार पर आपकी टिप्पणियों के बारे में, क्या मॉडल में निर्दिष्ट बैच_साइज है। मेरे अपने कस्टम बैच बनाने की तुलना में एक अलग हाइपर पैरामीटर तर्क है? मैंने अपना कोड 1000x3125 मैट्रिक्स से अपने डेटा को 3D मैट्रिक्स में डेटा = np.reshape (डेटा, (1000,1,3125)) का उपयोग करके कम से कम चलाने के लिए अपना कोड प्राप्त करने में कामयाब रहा। यह मुझे इनपुट_शैप (1,3125) के साथ LSTM चलाने देता है, लेकिन फिर, मुझे वास्तव में यकीन नहीं है कि मैं क्या कर रहा हूं। फिर से, उत्तर के लिए बहुत बहुत धन्यवाद। आपके द्वारा दिए गए लिंक पर मेरी नज़र होगी और आपके उत्तर का कुछ और अध्ययन करेगी।
user1147964

आपका स्वागत है! हां, आपको यह मिल गया है, यदि आप batch_sizeमॉडल को परिभाषित करते समय छोड़ देते हैं, तो इसे उसी तर्क से लिया जाएगा model.fit()। आपको प्राप्त करने के लिए फिर से आकार देना चाहिए (3025, 100, 1000), जिसका अर्थ है 3025 बैच, 100 में से प्रत्येक (पंक्तियों) टाइमस्टेप्स और 1000 (कॉलम) चर। उपयोग np.reshapeकरना दुख की बात है कि इसके लिए काम नहीं करेंगे (आपको एक त्रुटि मिलेगी), इस तथ्य के कारण कि आपके पास डेटा ओवरलैप होगा ... अंतिम आकार में इनपुट की तुलना में अधिक डेटा है। 3025x100x1000> 3125x1000 - np.reshapeयह पसंद नहीं है क्योंकि यह अस्पष्ट है। मैं केवल डेटासेट, 1 लूप = 1 नमूने पर लूपिंग करने का सुझाव देता हूं।
n1k31t4

मुझे लगता है कि मैं यहाँ थोड़ा उलझन में हूँ और यह हो सकता है क्योंकि मैं अनजाने में पहले से ही बैचिंग प्रक्रिया कर सकता हूँ। मैं यहाँ विशिष्ट मूल्यों का उपयोग करूँगा। मैंने मोटे तौर पर 3 मिनट के लिए 6.25 किलोहर्ट्ज़ पर 3 अलग-अलग मापों का नमूना लिया, जिसके परिणामस्वरूप 337 श्रृंखला की लंबाई 1093750 थी। यह 3x1093750 मैट्रिक्स उत्पन्न करता है। मैंने तब प्रत्येक टीएस को 0.5 सेकंड वेतन वृद्धि में विभाजित किया, जिसके परिणामस्वरूप 1050x3125 मैट्रिक्स हुआ। मैं तकनीकी रूप से इसे 3x350x3125 आयाम वाले 3 डी मैट्रिक्स में पुनर्गठन कर सकता हूं। यह मुझे 350, 0.5 s लंबे "बैच" देता है। आपका पुनर्वसन कई और मान उत्पन्न करता है धन्यवाद फिर से प्रतिक्रिया के लिए। क्षमा करें
user1147964

बस जोड़ने के लिए, आपके द्वारा पोस्ट की गई पहली कड़ी को पढ़ने से मुझे लगता है कि मैं चीजों को सही ढंग से बदल रहा हूं। माफी अगर मैं कुछ स्पष्ट याद कर रहा हूँ, लेकिन यहाँ वे एक टीएस लंबाई 5000 के साथ शुरू करते हैं, और इसे आयामों के साथ 3 डी मैट्रिक्स में बदल देते हैं [1 25 200]।
user1147964

आपके लिंक में विधि की तुलना में, मेरा तरीका कई और नमूने बनाएगा। ऐसा इसलिए है क्योंकि मैं एक तरह की 'रोलिंग' विंडो का उपयोग कर रहा हूं। एक नजर इस चित्रण पर । वे एक रोलिंग विंडो का उपयोग नहीं करते हैं। ३५० x ०.५ s चंक्स में ३ मिनट बनाना ठीक है (शायद जरूरत नहीं है-अक्सर आप कैसे भविष्यवाणी करते हैं?), प्रत्येक हिस्सा ३ एक्स ३१५ होना चाहिए। "मैं इसे 3x350x3125 आयामों के साथ एक 3 डी मैट्रिक्स में पुनर्गठन कर सकता हूं" - यह बेहतर लगता है, लेकिन विभाजन के बाद मैं 350x3x3125 (3x3125 के 350 विखंडू) की उम्मीद करूंगा। इनमें से प्रत्येक हिस्सा फिर से संसाधित किया जा सकता है जैसा कि मैंने वर्णित किया है।
n1k31t4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.