কেরাসে বিভিন্ন দৈর্ঘ্যের উদাহরণ সহ একটি আরএনএন প্রশিক্ষণ


60

আমি আরএনএন সম্পর্কে শিখতে শুরু করার চেষ্টা করছি এবং আমি কেরাস ব্যবহার করছি। আমি ভ্যানিলা আরএনএন এবং এলএসটিএম স্তরগুলির প্রাথমিক ভিত্তিটি বুঝতে পারি, তবে প্রশিক্ষণের জন্য একটি নির্দিষ্ট প্রযুক্তিগত বিন্দু বুঝতে আমার সমস্যা হচ্ছে।

ইন keras ডকুমেন্টেশন , এটা বলছেন একটি RNN স্তর ইনপুট আকৃতি থাকতে হবে (batch_size, timesteps, input_dim)। এটি পরামর্শ দেয় যে সমস্ত প্রশিক্ষণের উদাহরণগুলির একটি নির্দিষ্ট ক্রম দৈর্ঘ্য রয়েছে, যথা timesteps

তবে এটি বিশেষভাবে সাধারণ নয়, তাই না? আমি আরএনএনকে বিভিন্ন দৈর্ঘ্যের বাক্যে পরিচালনা করতে চাই। আমি যখন এটি কোনও কর্পাসে প্রশিক্ষণ দেব তখন আমি এটিকে বিভিন্ন দৈর্ঘ্যের বাক্যগুলির ব্যাচগুলি খাওয়াব।

আমি অনুমান করি যে স্পষ্টতই করণীয় হ'ল প্রশিক্ষণ সেটে যে কোনও ক্রমের সর্বাধিক দৈর্ঘ্য এবং এটির শূন্য প্যাড। তবে তার মানে কি এই যে ইনপুট দৈর্ঘ্যের চেয়ে বেশি দিয়ে আমি পরীক্ষার সময় ভবিষ্যদ্বাণী করতে পারি না?

এটি কেরাসের বিশেষ বাস্তবায়ন সম্পর্কে একটি প্রশ্ন, আমি মনে করি তবে সাধারণভাবে এই ধরণের সমস্যার মুখোমুখি হলে লোকেরা সাধারণত কী করে তাও আমি জিজ্ঞাসা করছি।


@kbrose ঠিক আছে। তবে আমার একটা উদ্বেগ আছে। উদাহরণস্বরূপ, আপনার কাছে অসীম ফলনের একটি খুব বিশেষ জেনারেটর রয়েছে। আরও গুরুত্বপূর্ণ, এটি 1000 মাপের ব্যাচ উত্পাদন করার জন্য ডিজাইন করা হয়েছে practice বাস্তবে, এটি অসম্ভব না হলে সন্তুষ্ট করা খুব কঠিন। আপনাকে আপনার এন্ট্রিগুলি পুনরায় সংগঠিত করতে হবে যাতে একই দৈর্ঘ্যগুলি একসাথে সাজানো হয় এবং আপনাকে সাবধানে ব্যাচের বিভক্ত অবস্থান নির্ধারণ করতে হবে। তদুপরি, ব্যাচগুলি জুড়ে আপনার কোনও পরিবর্তন করার সুযোগ নেই। সুতরাং আমার অভিমত: আপনি কী করছেন ঠিক তা না জানলে কখনও কেরাসে বিভিন্ন দৈর্ঘ্যের ইনপুট ব্যবহার করবেন না। Maskingউপেক্ষা করার জন্য প্যাডিং এবং সেট স্তর ব্যবহার করুন
বিএস

উত্তর:


57

এটি পরামর্শ দেয় যে সমস্ত প্রশিক্ষণের উদাহরণগুলির একটি নির্দিষ্ট ক্রম দৈর্ঘ্য রয়েছে, যথা timesteps

এটি পুরোপুরি সঠিক নয়, যেহেতু সেই মাত্রা হতে পারে None, যেমন পরিবর্তনশীল দৈর্ঘ্য। একক ব্যাচের মধ্যে আপনার অবশ্যই একই সংখ্যক টাইমস্টেপগুলি থাকতে হবে (এটি সাধারণত যেখানে আপনি 0-প্যাডিং এবং মাস্কিং দেখেন)। তবে ব্যাচের মধ্যে এ জাতীয় কোনও বাধা নেই। অনুমানের সময়, আপনার কোনও দৈর্ঘ্য থাকতে পারে।

উদাহরণ কোড যা প্রশিক্ষণ ডেটার এলোমেলো সময়-দৈর্ঘ্যের ব্যাচ তৈরি করে।

from keras.models import Sequential
from keras.layers import LSTM, Dense, TimeDistributed
from keras.utils import to_categorical
import numpy as np

model = Sequential()

model.add(LSTM(32, return_sequences=True, input_shape=(None, 5)))
model.add(LSTM(8, return_sequences=True))
model.add(TimeDistributed(Dense(2, activation='sigmoid')))

print(model.summary(90))

model.compile(loss='categorical_crossentropy',
              optimizer='adam')

def train_generator():
    while True:
        sequence_length = np.random.randint(10, 100)
        x_train = np.random.random((1000, sequence_length, 5))
        # y_train will depend on past 5 timesteps of x
        y_train = x_train[:, :, 0]
        for i in range(1, 5):
            y_train[:, i:] += x_train[:, :-i, i]
        y_train = to_categorical(y_train > 2.5)
        yield x_train, y_train

model.fit_generator(train_generator(), steps_per_epoch=30, epochs=10, verbose=1)

এবং এটি এটি প্রিন্ট করে। নোট করুন আউটপুট আকারগুলি (None, None, x)ভেরিয়েবল ব্যাচের আকার এবং ভেরিয়েবল টাইমস্টেপ আকার নির্দেশ করছে।

__________________________________________________________________________________________
Layer (type)                            Output Shape                        Param #
==========================================================================================
lstm_1 (LSTM)                           (None, None, 32)                    4864
__________________________________________________________________________________________
lstm_2 (LSTM)                           (None, None, 8)                     1312
__________________________________________________________________________________________
time_distributed_1 (TimeDistributed)    (None, None, 2)                     18
==========================================================================================
Total params: 6,194
Trainable params: 6,194
Non-trainable params: 0
__________________________________________________________________________________________
Epoch 1/10
30/30 [==============================] - 6s 201ms/step - loss: 0.6913
Epoch 2/10
30/30 [==============================] - 4s 137ms/step - loss: 0.6738
...
Epoch 9/10
30/30 [==============================] - 4s 136ms/step - loss: 0.1643
Epoch 10/10
30/30 [==============================] - 4s 142ms/step - loss: 0.1441

এই জন্য আপনাকে ধন্যবাদ. যাইহোক, আমরা যদি ক্রমগুলি 0 প্যাড করি তবে এটি লুকানো রাজ্যগুলি এবং মেমরি সেলকে প্রভাবিত করবে কারণ আমরা x_t 0s হিসাবে অতিক্রম করে চলেছি, যদি সত্যই, কিছু উত্তীর্ণ হয় না। সাধারণভাবে fit(), আমরা sequence_lenthপ্যারামিটারটি বাদ দিয়ে ক্রমের দৈর্ঘ্য নির্দিষ্ট করতে পারি। দেখে মনে হচ্ছে জেনারেটর পদ্ধতির 0 টি ক্রম উপেক্ষা করার অনুমতি নেই?
জিআরএস

1
@ জিআরএস আপনার জেনারেটর একটি 3-tuple ফিরে আসতে পারে (inputs, targets, sample_weights), এবং আপনি sample_weightsআপনার 0-প্যাড সেট করতে পারেন 0। যাইহোক, আমি নিশ্চিত না যে এটি বিদায়ি আরএনএনগুলির জন্য পুরোপুরি কাজ করবে।
kbrose

এটি সহায়ক হয়ে উঠেছে, তবে আমি আশা করি এটিতে model.predict_generatorএকটি পরীক্ষার সেট ব্যবহার করার উদাহরণও অন্তর্ভুক্ত থাকে । যখন আমি কোনও জেনারেটরের সাথে পূর্বাভাস দেওয়ার চেষ্টা করি তখন আমি কনট্যাকটেশন সম্পর্কিত একটি ত্রুটি পাই (পরীক্ষার সেটটিতেও পরিবর্তনশীল দৈর্ঘ্যের ক্রম থাকে)। আমার সমাধানটি model.predictহ্যাকি পদ্ধতিতে মান ব্যবহার করা হয়েছে । সম্ভবত এটি একটি নতুন প্রশ্নের জন্য আরও উপযুক্ত হবে?
মিকি

@ মিকি যেটি আলাদা প্রশ্নের মতো মনে হচ্ছে। এই প্রশ্নটি ভবিষ্যদ্বাণী নয়, প্রশিক্ষণ সম্পর্কে।
kbrose

মন্তব্যে প্রশ্নটি যদি সত্যিই নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করা হয়, আপনি কি এটির সাথে লিঙ্ক করতে পারেন?
ইটামার মুশকিন

7

@kbrose এর আরও ভাল সমাধান রয়েছে বলে মনে হচ্ছে

আমি অনুমান করি যে স্পষ্টতই করণীয় হ'ল প্রশিক্ষণ সেটে যে কোনও ক্রমের সর্বাধিক দৈর্ঘ্য এবং এটির শূন্য প্যাড।

এটি সাধারণত একটি ভাল সমাধান। সিকোয়েন্স সর্বোচ্চ দৈর্ঘ্য + 100 চেষ্টা করুন। আপনার অ্যাপ্লিকেশন জন্য সবচেয়ে ভাল কাজ করে যা ব্যবহার করুন।

তবে তার মানে কি এই যে ইনপুট দৈর্ঘ্যের চেয়ে বেশি দিয়ে আমি পরীক্ষার সময় ভবিষ্যদ্বাণী করতে পারি না?

অগত্যা। কেরাসে একটি নির্দিষ্ট দৈর্ঘ্য ব্যবহৃত হওয়ার কারণ হ'ল এটি স্থির আকারের টেনার তৈরি করে কার্যকারিতা উন্নত করে। তবে তা কেবল প্রশিক্ষণের জন্য। প্রশিক্ষণের পরে, আপনি আপনার কাজের জন্য সঠিক ওজন শিখবেন।

আসুন ধরে নেওয়া যাক, কয়েক ঘন্টা প্রশিক্ষণের পরে, আপনি বুঝতে পারবেন যে আপনার মডেলের সর্বাধিক দৈর্ঘ্য যথেষ্ট বড় / ছোট ছিল না এবং আপনাকে এখন সময়ের পদক্ষেপগুলি পরিবর্তন করতে হবে, কেবলমাত্র পুরানো মডেল থেকে শিখানো ওজনগুলি বের করতে হবে, নতুন সময়ের পদক্ষেপ সহ একটি নতুন মডেল তৈরি করতে হবে এবং এতে শেখা ওজনগুলি ইনজেক্ট করুন।

আপনি সম্ভবত এটির মতো কিছু ব্যবহার করে এটি করতে পারেন:

new_model.set_weights(old_model.get_weights())

আমি নিজে চেষ্টা করে দেখিনি। দয়া করে চেষ্টা করে দেখুন এবং এখানে সবার ফলাফলের জন্য আপনার ফলাফল পোস্ট করুন। এখানে কয়েকটি লিঙ্ক: একটি দুটি


1
আপনার প্রকৃত দৈর্ঘ্যের ইনপুট থাকতে পারে, হ্যাকের মতো প্রবর্তনের দরকার নেই max length + 100। উদাহরণস্বরূপ কোডের জন্য আমার উত্তর দেখুন।
kbrose

1
আরও বেশি টাইমস্টেপ সহ কোনও মডেলকে ওজন স্থানান্তর করা সত্যিই পুরোপুরি সূক্ষ্ম কাজ করে! আমি টাইমস্টেপগুলি Bidirectional(LSTM)()এবং RepeatVector()স্তরগুলি ধাক্কা দিয়েছি , এবং ভবিষ্যদ্বাণীগুলি পুরোপুরি কার্যকর able
কমোদোভারন_

@kbrose এটি কোনও হ্যাক নয়, আপনি সাধারণত এটি করেন। একটির ব্যাচ_সাইজ ব্যবহার করা খুব ধীর এবং কেরারা মাস্কিং স্তরগুলিকে সক্ষম করে যাতে মাস্কিং ক্ষতির ক্ষতি করে না।
ফেরাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.