1 ডি টাইম সিরিজ সহ কেরাস এলএসটিএম


10

আমি কেরাস কীভাবে ব্যবহার করব তা শিখছি এবং পাইলেটের জন্য চোল্টের ডিপ লার্নিংয়ের উদাহরণ ব্যবহার করে আমার লেবেলযুক্ত ডেটাসেটের সাথে যুক্তিসঙ্গত সাফল্য পেয়েছি । ডেটা সেটটি 3 সম্ভাব্য ক্লাস সহ 3125 দৈর্ঘ্যের সহ 1000 ডলার টাইম সিরিজ।

আমি বেসিক ঘন স্তরগুলি ছাড়িয়ে যেতে চাই যা আমাকে প্রায় 70% পূর্বাভাসের হার দেয় এবং বইটি এলএসটিএম এবং আরএনএন স্তরগুলি নিয়ে আলোচনা করে।

সমস্ত উদাহরণগুলি প্রতিটি টাইমসারিগুলির জন্য একাধিক বৈশিষ্ট্যযুক্ত ডেটাসেটগুলি ব্যবহার করে বলে মনে হচ্ছে এবং ফলস্বরূপ কীভাবে আমার ডেটা প্রয়োগ করতে হবে তা নিয়ে কাজ করার জন্য আমি সংগ্রাম করছি।

উদাহরণস্বরূপ, আমার কাছে 1000x3125 টাইম সিরিজ রয়েছে, আমি কীভাবে এটিকে সরলআরএনএন বা এলএসটিএম স্তর মতো ফিড করব? এই স্তরগুলি কী করে সে সম্পর্কে আমি কিছু মৌলিক জ্ঞান অনুভব করছি?

বর্তমান কোড:

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

এলএসটিএম স্তরগুলির জন্য আলাদা আকারের ডেটা প্রয়োজন।

আপনার বিবরণ থেকে, আমি 315 টি সারি এবং 1000 কলামগুলি প্রারম্ভিক ডেটাসেটটি বুঝতে পারি, যেখানে প্রতিটি সারিটি একটি সময়-পদক্ষেপ। টার্গেট ভেরিয়েবলের পরে 3125 টি সারি এবং 1 কলাম থাকা উচিত, যেখানে প্রতিটি মান তিনটি সম্ভাব্য মানের একটি হতে পারে। সুতরাং মনে হচ্ছে আপনি একটি শ্রেণিবিন্যাস সমস্যা করছেন। কোডে এটি পরীক্ষা করতে, আমি এটি করব:

>>> X.shape
(3125, 1000)

>>> y.shape
(1000,)

এলএসটিএম ক্লাসের প্রত্যেকটি একক নমুনা সময়ের একটি 'ব্লক' থাকতে হবে requires ধরা যাক আপনার 100 টি সময়-পদক্ষেপের একটি ব্লক থাকতে চান। এর অর্থ X[0:100]হ'ল একটি একক ইনপুট নমুনা, যা লক্ষ্য পরিবর্তকের সাথে সম্পর্কিত y[100]। এর অর্থ আপনার উইন্ডোর আকার (টাইম-পদক্ষেপের সংখ্যা বা ল্যাগের সংখ্যা) 100 এর সমান above উপরে বর্ণিত হিসাবে আপনার কাছে 3125 টি নমুনা রয়েছে, তাই N = 3125। প্রথম ব্লকটি গঠনের জন্য, দুর্ভাগ্যক্রমে আমাদের প্রথম 100 টি নমুনা বাতিল করতে হবে y, কারণ আমরা উপলব্ধ ডেটা থেকে 100 এর সম্পূর্ণ ব্লক তৈরি করতে পারি না (আমাদের আগে ডেটা পয়েন্টগুলির প্রয়োজন হবে X[0])।

এই সমস্ত দেওয়া, একটি LSTM আপনার আকৃতির ব্যাচ বিতরণ করা প্রয়োজন (N - window_size, window_size, num_features), যা (3125 - 100, 100, 1000)== অনুবাদ করে (3025, 100, 1000)

এই টাইম-ব্লকগুলি তৈরি করা কিছুটা ঝামেলা হলেও একবারে একটি ভাল ফাংশন তৈরি করুন, তারপরে এটি সংরক্ষণ করুন :)

আরও কাজ করার দরকার আছে, সম্ভবত আমার উপরের ব্যাখ্যাটির গভীরতার উদাহরণগুলি আরও এখানে দেখুন ... অথবা এলএসটিএম ডকুমেন্টেশন পড়ুন , (বা আরও ভাল, উত্স কোড! )।

চূড়ান্ত মডেলটি তখন যথেষ্ট সহজ হবে (আপনার কোডের ভিত্তিতে):

#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 , অর্থাৎ, ব্যতীত আরও একটি যুক্তি যুক্ত করতে হবে return_sequences=True


বিস্তৃত উত্তর ডেক্সটার (!) এর জন্য আপনাকে ধন্যবাদ। ব্যাচের আকার সম্পর্কে আপনার মন্তব্য সম্পর্কে, ব্যাচ_সাইজটি কি মডেলটিতে নির্দিষ্ট করা হয়েছে? আমার নিজস্ব কাস্টম ব্যাচ তৈরির তুলনায় একটি ভিন্ন হাইপার প্যারামিটারটি যুক্তিযুক্ত? আমি ডেটা = np.reshape (ডেটা, (1000,1,3125)) ব্যবহার করে 1000x3125 ম্যাট্রিক্স থেকে আমার ডেটা 3 ডি ম্যাট্রিক্সে পুনরায় আকার দিয়ে আমার কোডটি কমপক্ষে চালাতে সক্ষম হয়েছি। এটি আমাকে ইনপুট_শ্যাপ (1,3125) দিয়ে এলএসটিএম চালাতে দাও তবে আবার আমি কী করছি তা নিশ্চিত নই। আবার, উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। আপনার প্রদত্ত লিঙ্কগুলিতে আমি একটি নজর রাখব এবং আপনার উত্তরটি আরও অধ্যয়ন করব।
ব্যবহারকারী 1147964

আপনাকে স্বাগতম! হ্যাঁ, আপনি এটি পেয়েছেন, আপনি যদি batch_sizeমডেলটি সংজ্ঞায়িত করার সময় ছেড়ে যান , তবে এটি একই আঙ্গিকের মধ্যে থেকে নেওয়া হবে model.fit()। আপনার পুনঃনির্মাণ করা উচিত (3025, 100, 1000), যার অর্থ 3025 ব্যাচ, প্রতিটি 100 (সারি) টাইমস্টেপ এবং 1000 (কলাম) ভেরিয়েবল। ব্যবহার np.reshapeকরবে দুঃখিতভাবে এই জন্য কাজ না (আপনি একটি ত্রুটি পাবেন না) যে, আসলে আপনি ডাটা ওভারল্যাপ থাকবে কারণে ... চূড়ান্ত আকৃতি ইনপুট চেয়ে বেশি ডেটা নেই। 3025x100x1000> 3125x1000 - np.reshapeএটি অস্পষ্ট হিসাবে পছন্দ করে না। আমি কেবল ডেটাসেটের উপরে লুপিংয়ের পরামর্শ দিচ্ছি, 1 লুপ = 1 নমুনা।
n1k31t4

আমি মনে করি আমি এখানে কিছুটা বিভ্রান্ত হয়েছি এবং এটি হতে পারে কারণ আমি অজান্তেই ইতিমধ্যে ব্যাচিং প্রক্রিয়াটি সম্পন্ন করে থাকতে পারি I আমি এখানে নির্দিষ্ট মানগুলি ব্যবহার করব। আমি প্রায় 3 মিনিটের জন্য 6.25 কেএজেডজে 3 টি পৃথক পরিমাপ নমুনা দিয়েছিলাম, যার ফলে 1093750 দৈর্ঘ্যের 3 টাইম সিরিজ হয় This এটি একটি 3x1093750 ম্যাট্রিক্স উত্পন্ন করে। তারপরে আমি প্রতিটি টিএসকে 0.5 সেকেন্ড ইনক্রিমেন্টে বিভক্ত করেছিলাম যার ফলস্বরূপ 1050x3125 ম্যাট্রিক্স হয়। আমি প্রযুক্তিগতভাবে এটি 3 ডি ম্যাট্রিক্সে 3x350x3125 মাত্রার সাথে পুনর্গঠন করতে পারি। এটি আমাকে 350, 0.5s দীর্ঘ "ব্যাচ" দেয়। আপনার পুনর্নির্মাণটি আরও অনেক মান উত্পন্ন করেছে বলে মনে হচ্ছে আবার প্রতিক্রিয়াটির জন্য ধন্যবাদ। দুঃখিত
user1147964

কেবল যোগ করার জন্য, আপনার পোস্ট করা প্রথম লিঙ্কটি পড়ার ফলে আমার মনে হয় যে আমি জিনিসগুলি সঠিকভাবে পুনরায় আকার দিচ্ছি। ক্ষমা চাইছি যদি আমি স্পষ্ট কিছু মিস করছি তবে এখানে তারা টিএস দৈর্ঘ্য 5000 দিয়ে শুরু করে এবং এটিকে মাত্রা [1 25 200] দিয়ে একটি 3D ম্যাট্রিক্সে পরিণত করে।
ব্যবহারকারী 1147964

আপনার লিঙ্কের পদ্ধতির তুলনায়, আমার উপায় আরও অনেক নমুনা তৈরি করবে। এটি কারণ আমি একধরণের 'ঘূর্ণায়মান' উইন্ডো ব্যবহার করছি। এই চিত্রটি একবার দেখুন । তারা ঘূর্ণায়মান উইন্ডো ব্যবহার করে না । ৩৫ মিনিট ৩৫০x০.৫ সেকেন্ডে অংশ তৈরি করা ঠিক আছে (সম্ভবত প্রয়োজন নেই - আপনি প্রায়শই কী অনুমান করেন?), প্রতিটি খণ্ডটি 3x3125 হওয়া উচিত। "আমি 3x350x3125 মাত্রা সহ এটি একটি 3D ম্যাট্রিক্সে পুনর্গঠন করতে পারি" - এটি আরও ভাল লাগছে , তবে বিভাজনগুলি তৈরি করার পরে আমি 350x3x3125 (3x3125 এর 350 অংশ) আশা করব। আমি বর্ণিত হিসাবে এই খণ্ডগুলির প্রতিটি প্রক্রিয়া করা যেতে পারে।
n1k31t4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.