কেরাস এলএসটিএম বোঝা


311

আমি এলএসটিএম সম্পর্কে আমার বোঝার পুনর্মিলনের চেষ্টা করছি এবং কেরাসে প্রয়োগ করা ক্রিস্টোফার ওলা এই পোস্টটিতে এখানে উল্লেখ করেছি । আমি কেরাস টিউটোরিয়ালের জন্য জেসন ব্রাউনলি দ্বারা লেখা ব্লগটি অনুসরণ করছি । আমি যা সম্পর্কে প্রধানত বিভ্রান্ত তা হ'ল,

  1. ডেটা সিরিজগুলিতে পুনরায় আকার দেওয়া [samples, time steps, features]এবং,
  2. রাষ্ট্রীয় এলএসটিএম

নীচে আটকানো কোডের রেফারেন্স সহ উপরের দুটি প্রশ্নের উপর মনোনিবেশ করতে দেয়:

# reshape into X=t and Y=t+1
look_back = 3
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))
testX = numpy.reshape(testX, (testX.shape[0], look_back, 1))
########################
# The IMPORTANT BIT
##########################
# create and fit the LSTM network
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')
for i in range(100):
    model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)
    model.reset_states()

দ্রষ্টব্য: create_dataset দৈর্ঘ্য N এর ক্রম নেয় এবং N-look_backপ্রতিটি উপাদান একটি look_backদৈর্ঘ্য ক্রম হয় এমন একটি অ্যারে প্রদান করে ।

সময় পদক্ষেপ এবং বৈশিষ্ট্য কি?

যেমন দেখা যায় যে ট্রেনএক্স একটি 3-ডি অ্যারে যার সাথে টাইম_স্টেপস এবং ফিচার যথাক্রমে শেষ দুটি মাত্রা (যথাক্রমে 3 এবং 1) রয়েছে। নীচের চিত্রের প্রতি শ্রদ্ধার সাথে, এর অর্থ কি এই যে আমরা কেসটি বিবেচনা করছি many to one, যেখানে গোলাপী বাক্সের সংখ্যা 3? বা এর আক্ষরিক অর্থে চেইনের দৈর্ঘ্য 3 (অর্থাত কেবল 3 টি সবুজ বাক্স বিবেচিত) হয় meanএখানে চিত্র বর্ণনা লিখুন

যখন আমরা মাল্টিভারিয়েট সিরিজ বিবেচনা করি তখন কি বৈশিষ্ট্যগুলি যুক্তি প্রাসঙ্গিক হয়? যেমন দুটি আর্থিক স্টক একই সাথে মডেলিং?

রাষ্ট্রীয় এলএসটিএম

রাষ্ট্রীয় এলএসটিএম এর অর্থ কি আমরা ব্যাচের রানগুলির মধ্যে সেল মেমরির মানগুলি সংরক্ষণ করি? যদি এটি হয় তবে batch_sizeএটি এক, এবং প্রশিক্ষণ চলার মধ্যে মেমরিটি পুনরায় সেট হয়ে যায় তাই বলার কী ছিল যে এটি রাষ্ট্রীয় ছিল। আমি অনুমান করছি যে এটি প্রশিক্ষণের ডেটা বদলানো নয়, তবে কীভাবে তা নিশ্চিত তা নয়।

কোন চিন্তা? চিত্রের রেফারেন্স: http://karpathy.github.io/2015/05/21/rnn-e અસરীকরণ /

সম্পাদনা 1:

লাল এবং সবুজ বাক্স সমান হওয়ার বিষয়ে @ ভ্যানের মন্তব্য সম্পর্কে কিছুটা বিভ্রান্ত। সুতরাং কেবল নিশ্চিত করার জন্য, নীচের এপিআই কলগুলি কি নিবন্ধভুক্ত চিত্রের সাথে মিল রয়েছে? বিশেষ করে দ্বিতীয় চিত্রটি লক্ষ্য করা ( batch_sizeনির্বিচারে বেছে নেওয়া হয়েছিল।): এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা 2:

যে সকল ব্যক্তিরা উদাসির গভীর শিক্ষণ কোর্সটি করেছে এবং এখনও সময়_পদ্ধতি যুক্তি সম্পর্কে বিভ্রান্ত রয়েছে তাদের জন্য নিম্নলিখিত আলোচনাটি দেখুন: https://discussion.udacity.com/t/rnn-lstm-use-implementation/163169

হালনাগাদ:

দেখা যাচ্ছে model.add(TimeDistributed(Dense(vocab_len)))যে আমি যা খুঁজছিলাম। এখানে একটি উদাহরণ: https://github.com/sachinruk/ শেক্সপিয়রবট

Update2:

আমি এলএসটিএম সম্পর্কে আমার বেশিরভাগ বোঝার সংক্ষিপ্তসার এখানে দিয়েছি: https://www.youtube.com/watch?v=ywinX5wgdEU


7
প্রথম ফটোটি হওয়া উচিত (ব্যাচ_সাইজ, 5, 1); দ্বিতীয় ফটোটি হওয়া উচিত (ব্যাচ_সাইজ, 4, 3) (যদি নিম্নলিখিত কোনও ক্রম না থাকে)। এবং আউটপুট কেন এখনও "এক্স"? এটি "ওয়াই" হওয়া উচিত?
ভ্যান

1
এখানে আমি ধরে নিয়েছি X_1, X_2 ... X_6 একক সংখ্যা। এবং তিনটি সংখ্যা (X_1, X_2, X_3) আকৃতির ভেক্টর তৈরি করে (3,)। একটি সংখ্যা (X_1) আকৃতির ভেক্টর তৈরি করে (1,)।
ভ্যান

2
@ ভ্যান, আপনার অনুমানটি সঠিক। এটি আকর্ষণীয়, সুতরাং মূলত মডেল সময়_ পদক্ষেপের সংখ্যার বাইরে নিদর্শনগুলি শিখতে পারে না। সুতরাং আমার যদি 1000 এর দৈর্ঘ্য টাইম সিরিজ থাকে এবং প্রতি 100 দিনে দৃশ্যমানভাবে কোনও প্যাটার্ন দেখতে পাই তবে আমার সময়_পথের প্যারামিটার কমপক্ষে 100 করা উচিত this এটি কি সঠিক পর্যবেক্ষণ?
sachinruk

3
হ্যাঁ. এবং যদি আপনি প্রতিদিন 3 টি প্রাসঙ্গিক বৈশিষ্ট্য সংগ্রহ করতে পারেন তবে আপনি দ্বিতীয় ছবিটির মতো বৈশিষ্ট্যটির আকার 3 এ সেট করতে পারেন। এই পরিস্থিতিতে ইনপুট আকারটি হবে (ব্যাচ_সাইজ, 100, 3)।
ভ্যান

1
এবং আপনার প্রথম প্রশ্নটি সমাধান করার কারণ এটি ছিল যে আমি একক সময় সিরিজ নিছিলাম। উদাহরণস্বরূপ স্টকের দাম, সুতরাং এক্স এবং ওয়াই একই সিরিজ থেকে।
sachinruk

উত্তর:


173

প্রথমত, আপনি শুরু করার জন্য দুর্দান্ত টিউটোরিয়াল ( 1 , 2 ) চয়ন করেন।

সময়-পদক্ষেপের অর্থ কী : Time-steps==3এক্স.শ্যাপে (ডেটার আকৃতি বর্ণনা করা) এর অর্থ তিনটি গোলাপী বাক্স। যেহেতু কেরাসে প্রতিটি ধাপে একটি ইনপুট প্রয়োজন, তাই সবুজ বাক্সের সংখ্যা সাধারণত লাল বাক্সের সংখ্যার সমান হয়। আপনি কাঠামো হ্যাক না করে।

অনেক বনাম এক অনেকের কাছে অনেক : keras, একটি হল return_sequencesপ্যারামিটার যখন আপনার আরম্ভের LSTMবা GRUবা SimpleRNN। যখন return_sequencesহয় False(ডিফল্ট অনুসারে), তাহলে এটি হল এক অনেক হিসাবে ছবিতে দেখানো হয়েছে। এটির প্রত্যাবর্তন আকৃতি (batch_size, hidden_unit_length)যা সর্বশেষ রাষ্ট্রের প্রতিনিধিত্ব করে। কখন return_sequencesহয় True, তখন তা অনেকের কাছেই অনেক । এটির রিটার্ন শেপ(batch_size, time_step, hidden_unit_length)

বৈশিষ্ট্যগুলি যুক্তিটি কী প্রাসঙ্গিক হয়ে ওঠে : বৈশিষ্ট্য যুক্তির অর্থ "আপনার লাল বাক্সটি কত বড়" বা প্রতিটি পদক্ষেপে ইনপুট মাত্রা কী। আপনি যদি 8 ধরণের বাজার সম্পর্কিত তথ্য থেকে ভবিষ্যদ্বাণী করতে চান তবে আপনি আপনার ডেটা দিয়ে এটি তৈরি করতে পারেন feature==8

বর্ণনামূলক : আপনি উত্স কোডটি সন্ধান করতে পারেন । রাষ্ট্রকে সূচনা করার সময়, যদি stateful==True, তবে শেষ প্রশিক্ষণ থেকে রাজ্যটিকে প্রাথমিক রাষ্ট্র হিসাবে ব্যবহার করা হবে, অন্যথায় এটি একটি নতুন রাষ্ট্র তৈরি করবে। আমি statefulএখনও চালু না । যাইহোক, আমি এর সাথে একমত নই যে batch_sizeকেবল তখন 1 হতে পারে stateful==True

বর্তমানে, আপনি সংগৃহীত ডেটা সহ আপনার ডেটা তৈরি করেন। আপনার স্টক তথ্য সমস্ত ধারাবাহিক সংগ্রহ করার জন্য একটি দিনের অপেক্ষা না করে স্ট্রিম হিসাবে আসছে বলে চিত্র, আপনি প্রশিক্ষণ / নেটওয়ার্কের সাথে পূর্বাভাস দেওয়ার সময় অনলাইনে ইনপুট ডেটা তৈরি করতে চান । আপনার যদি 400 টি শেয়ার একই নেটওয়ার্ক ভাগ করে নিয়ে থাকে, তবে আপনি সেট করতে পারেন batch_size==400


কেন লাল এবং সবুজ বাক্সগুলি একই হতে হবে তা সম্পর্কে কিছুটা বিভ্রান্ত। আমি যে সম্পাদনা করেছি (নতুন ছবিগুলি মূলত) তা দেখে মন্তব্য করতে পার?
sachinruk

1
প্রকৃতপক্ষে. দস্তাবেজটি পরীক্ষা করুন:stateful: Boolean (default False). If True, the last state for each sample at index i in a batch will be used as initial state for the sample of index i in the following batch.
ভ্যান

1
@ ভ্যান যদি আমার বহুবিবাহের সময় সিরিজ থাকে তবে আমি কি এখনও ব্যবহার করব lookback = 1?
innm

1
কেন আউটপুট স্পেসের এলএসটিএম মাত্রিকতা (32) নিউরনের সংখ্যার (এলএসটিএম কোষ) থেকে পৃথক হয়?
স্টিকি

1
এতে যুক্ত হয়েছে stateful=True: ব্যাচের আকার আপনার পছন্দ মতো কিছু হতে পারে তবে আপনাকে এটি আটকে থাকতে হবে। আপনি 5 একটি ব্যাচ আকার সঙ্গে আপনার মডেল গড়ে তুলতে, তাহলে সব fit(), predict()এবং সংশ্লিষ্ট পদ্ধতি 5. নোট তবে যে এই রাষ্ট্রের সঙ্গে সংরক্ষণ করা হবে না একটি ব্যাচ প্রয়োজন হবে model.save(), যা অবাঞ্ছিত মনে হতে পারে। তবে আপনার যদি প্রয়োজন হয় তবে আপনি ম্যানুয়ালি এইচডিএফ 5 ফাইলটিতে রাষ্ট্র যুক্ত করতে পারেন। তবে কার্যকরভাবে এটি আপনাকে কেবলমাত্র একটি মডেল সংরক্ষণ এবং পুনরায় লোড করে ব্যাচের আকার পরিবর্তন করতে দেয়।
jlh

191

গৃহীত উত্তরের পরিপূরক হিসাবে, এই উত্তরটি কেরাস আচরণ এবং প্রতিটি চিত্র কীভাবে অর্জন করবে তা দেখায়।

জেনারেল কেরাসের আচরণ

স্ট্যান্ডার্ড কেরাস অভ্যন্তরীণ প্রক্রিয়াজাতকরণ নীচের চিত্রের মতো অনেকের কাছে সর্বদা অনেকগুলি (যেখানে আমি ব্যবহার করেছি features=2, চাপ এবং তাপমাত্রা কেবল উদাহরণ হিসাবে):

ManyToMany

অন্যান্য চিত্রের সাথে বিভ্রান্তি এড়াতে এই চিত্রটিতে, আমি পদক্ষেপের সংখ্যা 5-এ বাড়িয়েছি।

এই উদাহরণের জন্য:

  • আমাদের কাছে তেলের ট্যাঙ্ক রয়েছে
  • আমরা প্রতি ঘন্টা 5 ঘন্টা ব্যয় করেছি (সময় পদক্ষেপ)
  • আমরা দুটি বৈশিষ্ট্য পরিমাপ করেছি:
    • চাপ পি
    • তাপমাত্রা টি

আমাদের ইনপুট অ্যারেটি তখন এর আকারযুক্ত কিছু হওয়া উচিত (N,5,2):

        [     Step1      Step2      Step3      Step4      Step5
Tank A:    [[Pa1,Ta1], [Pa2,Ta2], [Pa3,Ta3], [Pa4,Ta4], [Pa5,Ta5]],
Tank B:    [[Pb1,Tb1], [Pb2,Tb2], [Pb3,Tb3], [Pb4,Tb4], [Pb5,Tb5]],
  ....
Tank N:    [[Pn1,Tn1], [Pn2,Tn2], [Pn3,Tn3], [Pn4,Tn4], [Pn5,Tn5]],
        ]

উইন্ডো সহচরী জন্য ইনপুট

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

উইন্ডোজগুলিতে প্রতিটি উইন্ডো দীর্ঘ মূল ক্রমের অংশ, তবে কেরাস দ্বারা এগুলি প্রতিটিকে একটি স্বতন্ত্র ক্রম হিসাবে দেখা হবে:

        [     Step1    Step2    Step3    Step4    Step5
Window  A:  [[P1,T1], [P2,T2], [P3,T3], [P4,T4], [P5,T5]],
Window  B:  [[P2,T2], [P3,T3], [P4,T4], [P5,T5], [P6,T6]],
Window  C:  [[P3,T3], [P4,T4], [P5,T5], [P6,T6], [P7,T7]],
  ....
        ]

লক্ষ করুন যে এই ক্ষেত্রে, আপনার প্রাথমিকভাবে কেবল একটি ক্রম রয়েছে তবে উইন্ডোজ তৈরির জন্য আপনি এটি অনেকগুলি অনুক্রমগুলিতে ভাগ করছেন।

"কি একটি ক্রম" ধারণাটি বিমূর্ত। গুরুত্বপূর্ণ অংশগুলি হ'ল:

  • আপনার অনেকগুলি পৃথক ক্রম সহ ব্যাচ থাকতে পারে
  • সিকোয়েন্সগুলি সিকোয়েন্সগুলিকে কী করে তা হ'ল তারা ধাপে বিবর্তিত হয় (সাধারণত সময় ধাপ)

"একক স্তর" দিয়ে প্রতিটি কেস অর্জন

অনেকের কাছে স্ট্যান্ডার্ড অর্জন করা:

StandardManyToMany

আপনি একটি সাধারণ এলএসটিএম স্তর ব্যবহার করে অনেকের কাছে এটি অর্জন করতে পারেন return_sequences=True:

outputs = LSTM(units, return_sequences=True)(inputs)

#output_shape -> (batch_size, steps, units)

একের কাছে অনেকের অর্জন:

ঠিক একই স্তরটি ব্যবহার করে কেরারা সঠিক একই অভ্যন্তরীণ প্রিপ্রোসেসিং করবে তবে আপনি যখন ব্যবহার করবেন return_sequences=False(বা কেবল এই যুক্তি উপেক্ষা করবেন) তখন কেরাস স্বয়ংক্রিয়ভাবে শেষের পূর্বের পদক্ষেপগুলি বাতিল করে দেবে:

ManyToOne

outputs = LSTM(units)(inputs)

#output_shape -> (batch_size, units) --> steps were discarded, only the last was returned

অনেকের কাছে একটি অর্জন করা

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

  • টেনসর পুনরাবৃত্তি করে একটি ধ্রুবক মাল্টি-স্টেপ ইনপুট তৈরি করুন
  • stateful=Trueবারবার এক ধাপের আউটপুট নিতে এবং এটি পরবর্তী পদক্ষেপের ইনপুট হিসাবে পরিবেশন করতে একটি ব্যবহার করুন (প্রয়োজন output_features == input_features)

রিপিট ভেক্টর সহ অনেকের কাছে

কেরাস স্ট্যান্ডার্ড আচরণের সাথে মানিয়ে নিতে, আমাদের পদক্ষেপগুলিতে ইনপুট দরকার, সুতরাং আমরা যে দৈর্ঘ্যটি চাই তার জন্য সহজভাবে ইনপুটগুলি পুনরাবৃত্তি করি:

OneToManyRepeat

outputs = RepeatVector(steps)(inputs) #where inputs is (batch,features)
outputs = LSTM(units,return_sequences=True)(outputs)

#output_shape -> (batch_size, steps, units)

রাষ্ট্রীয় বোঝা = সত্য

এখন সম্ভাব্য ব্যবহারগুলির মধ্যে একটি হল stateful=True(আপনার কম্পিউটারের স্মৃতি একবারে মাপসই করতে পারে না এমন ডেটা লোড করা এড়ানো ছাড়াও)

স্টেটফুল আমাদের ক্রমগুলির "অংশগুলি" পর্যায়ক্রমে ইনপুট করতে দেয়। পার্থক্য হল:

  • ইন stateful=False, দ্বিতীয় ব্যাচে সম্পূর্ণ নতুন সিকোয়েন্স রয়েছে, প্রথম ব্যাচ থেকে পৃথক
  • ইন stateful=True, দ্বিতীয় ব্যাচ একই ক্রমগুলি প্রসারিত করে প্রথম ব্যাচটি চালিয়ে যায়।

এটি দুটি মূল পার্থক্য সহ উইন্ডোতেও ক্রমগুলি ভাগ করার মতো:

  • এই উইন্ডোজ সুপারপোজ না !!
  • stateful=True এই উইন্ডোগুলিকে একক দীর্ঘ ক্রম হিসাবে সংযুক্ত দেখতে পাবেন

ইন stateful=True, প্রতিটি নতুন ব্যাচ পূর্ববর্তী ব্যাচটি চালিয়ে যাওয়া হিসাবে ব্যাখ্যা করা হবে (যতক্ষণ না আপনি কল করবেন model.reset_states())।

  • ব্যাচ 2-এ সিকোয়েন্স 1 ব্যাচ 1-এ 1 ক্রম 1 চালিয়ে যাবে।
  • ব্যাচ 2 এর সিকোয়েন্স 2 ব্যাচ 1 এ 2 ক্রম 2 চালিয়ে যাবে।
  • ব্যাচ 2 এ সিকোয়েন্স এন ব্যাচ 1 এ অনুক্রম n চালিয়ে যাবে।

ইনপুটগুলির উদাহরণ, ব্যাচ 1 এ পদক্ষেপ 1 এবং 2 রয়েছে, ব্যাচ 2 এ 3 থেকে 5 পদক্ষেপ রয়েছে:

                   BATCH 1                           BATCH 2
        [     Step1      Step2        |    [    Step3      Step4      Step5
Tank A:    [[Pa1,Ta1], [Pa2,Ta2],     |       [Pa3,Ta3], [Pa4,Ta4], [Pa5,Ta5]],
Tank B:    [[Pb1,Tb1], [Pb2,Tb2],     |       [Pb3,Tb3], [Pb4,Tb4], [Pb5,Tb5]],
  ....                                |
Tank N:    [[Pn1,Tn1], [Pn2,Tn2],     |       [Pn3,Tn3], [Pn4,Tn4], [Pn5,Tn5]],
        ]                                  ]

ব্যাচ 1 এবং ব্যাচ 2 এ ট্যাঙ্কগুলির সারিবদ্ধকরণটি লক্ষ্য করুন! এজন্য আমাদের দরকার shuffle=False(যদি না আমরা কেবল একটি ক্রম ব্যবহার করি)।

আপনি অনির্দিষ্টকালের জন্য যে কোনও ব্যাচ রাখতে পারেন। (প্রতিটি ব্যাচে পরিবর্তনশীল দৈর্ঘ্য থাকার জন্য, ব্যবহার করুন input_shape=(None,features)

এক সাথে অনেকের সাথে রাষ্ট্রীয় = সত্য

আমাদের ক্ষেত্রে এখানে, আমরা প্রতি ব্যাচ প্রতি 1 টি পদক্ষেপ ব্যবহার করতে যাচ্ছি, কারণ আমরা একটি আউটপুট পদক্ষেপ পেতে এবং এটি একটি ইনপুট হতে চাই be

যে লক্ষ্য করুন ছবিতে আচরণ নয় "দ্বারা সৃষ্ট" হয় stateful=True। আমরা নীচে একটি ম্যানুয়াল লুপে আচরণটি বাধ্য করব। এই উদাহরণস্বরূপ, stateful=Trueআমাদের ক্রমটি বন্ধ করতে, কী চান তা চালিত করতে এবং যেখান থেকে আমরা থামলাম সেখান থেকে চালিয়ে যেতে "অনুমতি দেয়"।

OneToManyStateful

সত্য, পুনরাবৃত্তি পদ্ধতির সম্ভবত এই ক্ষেত্রে একটি ভাল পছন্দ। তবে যেহেতু আমরা অনুসন্ধান করছি stateful=True, এটি একটি ভাল উদাহরণ। এটি ব্যবহারের সর্বোত্তম উপায় হ'ল পরের "অনেক থেকে অনেক" কেস।

লেয়ার:

outputs = LSTM(units=features, 
               stateful=True, 
               return_sequences=True, #just to keep a nice output shape even with length 1
               input_shape=(None,features))(inputs) 
    #units = features because we want to use the outputs as inputs
    #None because we want variable length

#output_shape -> (batch_size, steps, units) 

এখন, আমাদের পূর্বাভাসগুলির জন্য একটি ম্যানুয়াল লুপ প্রয়োজন:

input_data = someDataWithShape((batch, 1, features))

#important, we're starting new sequences, not continuing old ones:
model.reset_states()

output_sequence = []
last_step = input_data
for i in steps_to_predict:

    new_step = model.predict(last_step)
    output_sequence.append(new_step)
    last_step = new_step

 #end of the sequences
 model.reset_states()

অনেকের কাছে অনেকের সাথে রাষ্ট্রীয় = সত্য

এখন, এখানে, আমরা একটি খুব সুন্দর অ্যাপ্লিকেশন পেয়েছি: একটি ইনপুট ক্রম দিলে এর ভবিষ্যতের অজানা পদক্ষেপের পূর্বাভাস দেওয়ার চেষ্টা করুন।

আমরা উপরের "এক থেকে অনেকের" মতো একই পদ্ধতি ব্যবহার করছি, পার্থক্যটি সহ:

  • আমরা ক্রমটি নিজেই লক্ষ্য তথ্য হিসাবে ব্যবহার করব, একধাপ এগিয়ে
  • আমরা ক্রমটির কিছু অংশ জানি (তাই আমরা ফলাফলের এই অংশটি বাতিল করি)।

ManyToManyStateful

স্তর (উপরের মতো):

outputs = LSTM(units=features, 
               stateful=True, 
               return_sequences=True, 
               input_shape=(None,features))(inputs) 
    #units = features because we want to use the outputs as inputs
    #None because we want variable length

#output_shape -> (batch_size, steps, units) 

প্রশিক্ষণ:

সিক্যুয়েন্সগুলির পরবর্তী ধাপটির পূর্বাভাস দেওয়ার জন্য আমরা আমাদের মডেলকে প্রশিক্ষণ দিতে যাচ্ছি:

totalSequences = someSequencesShaped((batch, steps, features))
    #batch size is usually 1 in these cases (often you have only one Tank in the example)

X = totalSequences[:,:-1] #the entire known sequence, except the last step
Y = totalSequences[:,1:] #one step ahead of X

#loop for resetting states at the start/end of the sequences:
for epoch in range(epochs):
    model.reset_states()
    model.train_on_batch(X,Y)

প্রেডিক্টিং:

আমাদের পূর্বাভাসের প্রথম পর্যায়ে "রাজ্যগুলিকে সামঞ্জস্য করা" জড়িত। এই কারণেই আমরা পুরো ক্রমটি আবার পূর্বাভাস দিতে যাচ্ছি, এমনকি যদি আমরা এর এই অংশটি ইতিমধ্যে জানি:

model.reset_states() #starting a new sequence
predicted = model.predict(totalSequences)
firstNewStep = predicted[:,-1:] #the last step of the predictions is the first future step

এখন আমরা অনেক ক্ষেত্রে যেমন লুপটিতে যাই। তবে এখানে রাষ্ট্রগুলি পুনরায় সেট করবেন না! । আমরা মডেলটি এটি ক্রমের কোন ধাপে তা জানতে চাই (এবং এটি কেবলমাত্র উপরে উল্লিখিত পূর্বাভাসের কারণে এটি প্রথম নতুন পদক্ষেপে রয়েছে)

output_sequence = [firstNewStep]
last_step = firstNewStep
for i in steps_to_predict:

    new_step = model.predict(last_step)
    output_sequence.append(new_step)
    last_step = new_step

 #end of the sequences
 model.reset_states()

এই পদ্ধতির এই উত্তর এবং ফাইলটিতে ব্যবহৃত হয়েছিল:

জটিল কনফিগারেশন অর্জন

উপরের সমস্ত উদাহরণগুলিতে আমি "একটি স্তর" এর আচরণ দেখিয়েছি।

আপনি অবশ্যই একে অপরের শীর্ষে অনেকগুলি স্তর স্তুপ করতে পারেন, অগত্যা সবগুলি একই প্যাটার্ন অনুসরণ করে নয় এবং আপনার নিজের মডেল তৈরি করতে পারেন।

একটি আকর্ষণীয় উদাহরণ যা প্রদর্শিত হচ্ছে তা হ'ল "অটোরকোডার" যার "বহু থেকে এক এনকোডার" থাকে তার পরে "এক থেকে অনেকগুলি" ডিকোডার থাকে:

এনকোডার:

inputs = Input((steps,features))

#a few many to many layers:
outputs = LSTM(hidden1,return_sequences=True)(inputs)
outputs = LSTM(hidden2,return_sequences=True)(outputs)    

#many to one layer:
outputs = LSTM(hidden3)(outputs)

encoder = Model(inputs,outputs)

সঙ্কেতমোচক:

"পুনরাবৃত্তি" পদ্ধতি ব্যবহার করে;

inputs = Input((hidden3,))

#repeat to make one to many:
outputs = RepeatVector(steps)(inputs)

#a few many to many layers:
outputs = LSTM(hidden4,return_sequences=True)(outputs)

#last layer
outputs = LSTM(features,return_sequences=True)(outputs)

decoder = Model(inputs,outputs)

Autoencoder:

inputs = Input((steps,features))
outputs = encoder(inputs)
outputs = decoder(outputs)

autoencoder = Model(inputs,outputs)

সঙ্গে ট্রেন fit(X,X)

অতিরিক্ত ব্যাখ্যা

এলএসটিএম-এ কীভাবে পদক্ষেপ গণনা করা হয় বা stateful=Trueউপরের মামলাগুলি সম্পর্কে বিশদ জানতে চান , আপনি এই উত্তরে আরও পড়তে পারেন: Ke কেরাস এলএসটিএম বোঝার বিষয়ে সন্দেহ


1
ইনপুট হিসাবে আউটপুট ব্যবহার করে স্টেটফুলের খুব আকর্ষণীয় ব্যবহার। অতিরিক্ত নোট হিসাবে, এটি করার আরেকটি উপায় হ'ল কার্যকরী কেরাস এপিআই ব্যবহার করা (যেমন আপনি এখানে করেছেন, যদিও আমি বিশ্বাস করি যে আপনি অনুক্রমিকটি ব্যবহার করতে পারতেন), এবং প্রতিটি বারের পদক্ষেপের জন্য কেবল একই এলএসটিএম সেলটি পুনরায় ব্যবহার করুন) , ফলক অবস্থা এবং ঘর থেকে আউটপুট উভয়ই পাস করার সময়। অর্থাৎ my_cell = LSTM(num_output_features_per_timestep, return_state=True)একটি লুপ অনুসরণ করুনa, _, c = my_cell(output_of_previous_time_step, initial_states=[a, c])
জ্যাকব আর

1
ঘর এবং দৈর্ঘ্য সম্পূর্ণ স্বাধীন মান। ছবিগুলির কোনওটিই "সেল" সংখ্যাটি উপস্থাপন করে না। এগুলি সবই "দৈর্ঘ্যের" জন্য।
ড্যানিয়েল মুলার

1
@ ড্যানিয়েলমেলার আমি জানি কিছুটা দেরি হলেও আপনার উত্তরটি আমার দৃষ্টি আকর্ষণ করে। আপনার বক্তব্যটি এলএসটিএমের ব্যাচ কী তা আমার বোঝার বিষয়ে সবকিছু ছিন্নভিন্ন করে দিয়েছে। আপনি এন ট্যাঙ্ক, পাঁচটি ধাপ এবং দুটি বৈশিষ্ট্য সহ উদাহরণ সরবরাহ করেন। আমি বিশ্বাস করেছিলাম যে, ব্যাচ যদি উদাহরণস্বরূপ দুটি হয় তবে এর অর্থ হ'ল দুটি নমুনা (5 টি ধাপ 2 বৈশিষ্ট্যযুক্ত ট্যাঙ্ক) নেটওয়ার্কে ফিড করা হবে এবং এর পরে ওজন মানিয়ে যাবে। তবে আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনি বলেছেন যে ব্যাচ 2 এর অর্থ হল যে নমুনাগুলির টাইমস্টেপগুলি 2 তে ভাগ করা হবে এবং সমস্ত নমুনার প্রথমার্ধটি LSTM-> ওজন আপডেট এবং দ্বিতীয়টির চেয়ে বেশি হবে।
ভিসিরিয়েল

1
হ্যাঁ. একটি স্টেটফুল = সত্যে, ব্যাচ 1 = নমুনার দল, আপডেট করুন। তারপরে একই গ্রুপের নমুনাগুলির জন্য ব্যাচ 2 = আরও পদক্ষেপগুলি আপডেট করুন।
ড্যানিয়েল মুলার

2
আমি আশা করি আমি এই 100 বার upvote করতে পারে। সুপার দরকারী উত্তর।
অ্যাডামকনকি

4

যখন আপনার আরএনএন এর শেষ স্তরে রিটার্ন_সেসেন্স রয়েছে তখন আপনি টাইমড্রিস্ট্রিবিউট পরিবর্তে একটি সাধারণ ঘন স্তর ব্যবহার করতে পারবেন না।

এখানে কোডের একটি উদাহরণ রয়েছে যা অন্যকে সহায়তা করতে পারে।

শব্দসমূহ = কেরাস.লেয়ার্স.আনপুট (ব্যাচ_শ্যাপি = (কোনও কিছুই নয়, স্ব। ম্যাক্স সিকোয়েন্সলেন্স), নাম = "ইনপুট")

    # Build a matrix of size vocabularySize x EmbeddingDimension 
    # where each row corresponds to a "word embedding" vector.
    # This layer will convert replace each word-id with a word-vector of size Embedding Dimension.
    embeddings = keras.layers.embeddings.Embedding(self.vocabularySize, self.EmbeddingDimension,
        name = "embeddings")(words)
    # Pass the word-vectors to the LSTM layer.
    # We are setting the hidden-state size to 512.
    # The output will be batchSize x maxSequenceLength x hiddenStateSize
    hiddenStates = keras.layers.GRU(512, return_sequences = True, 
                                        input_shape=(self.maxSequenceLength,
                                        self.EmbeddingDimension),
                                        name = "rnn")(embeddings)
    hiddenStates2 = keras.layers.GRU(128, return_sequences = True, 
                                        input_shape=(self.maxSequenceLength, self.EmbeddingDimension),
                                        name = "rnn2")(hiddenStates)

    denseOutput = TimeDistributed(keras.layers.Dense(self.vocabularySize), 
        name = "linear")(hiddenStates2)
    predictions = TimeDistributed(keras.layers.Activation("softmax"), 
        name = "softmax")(denseOutput)  

    # Build the computational graph by specifying the input, and output of the network.
    model = keras.models.Model(input = words, output = predictions)
    # model.compile(loss='kullback_leibler_divergence', \
    model.compile(loss='sparse_categorical_crossentropy', \
        optimizer = keras.optimizers.Adam(lr=0.009, \
            beta_1=0.9,\
            beta_2=0.999, \
            epsilon=None, \
            decay=0.01, \
            amsgrad=False))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.