केर एलएसटीएम को समझना


311

मैं LSTMs के बारे में अपनी समझ को समेटने की कोशिश कर रहा हूं और इस पोस्ट में यहां बताया गया है कि क्रिस्टोफर ओलाह ने केरस में लागू किया। मैं केरस ट्यूटोरियल के लिए जेसन ब्राउनली द्वारा लिखे गए ब्लॉग का अनुसरण कर रहा हूं । मैं मुख्य रूप से उलझन में हूँ,

  1. और में डेटा श्रृंखला के फिर से शुरू [samples, time steps, features],
  2. स्टेटफुल LSTMs

नीचे दिए गए कोड के संदर्भ में उपरोक्त दो प्रश्नों पर ध्यान केंद्रित करें:

# 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लंबाई अनुक्रम है।

टाइम स्टेप्स और फीचर्स क्या है?

जैसा कि देखा जा सकता है कि TrainX एक 3-D सरणी है जिसमें Time_steps और फ़ीचर क्रमशः दो अंतिम आयाम हैं (इस विशेष कोड में 3 और 1)। नीचे की छवि के संबंध में, इसका मतलब यह है कि हम many to oneमामले पर विचार कर रहे हैं , जहां गुलाबी बक्से की संख्या 3 है? या इसका शाब्दिक अर्थ है कि चेन की लंबाई 3 है (यानी केवल 3 ग्रीन बॉक्स माना जाता है)।यहां छवि विवरण दर्ज करें

जब हम मल्टीवेरेट श्रृंखला पर विचार करते हैं तो क्या विशेषताएं तर्क प्रासंगिक हो जाती हैं? उदाहरण के लिए दो वित्तीय शेयरों को एक साथ मॉडलिंग करना?

स्टेटफुल LSTMs

क्या स्टेटफुल LSTM का मतलब है कि हम बैच के रनों के बीच सेल मेमोरी वैल्यू को बचाते हैं? यदि यह बात है तो,batch_size तो एक है, और मेमोरी को प्रशिक्षण रन के बीच रीसेट किया जाता है, तो यह कहने का क्या मतलब था कि यह स्टेटफुल था। मैं अनुमान लगा रहा हूं कि यह इस तथ्य से संबंधित है कि प्रशिक्षण डेटा में फेरबदल नहीं किया जाता है, लेकिन मुझे यकीन नहीं है कि कैसे।

कोई विचार? छवि संदर्भ: http://karpathy.github.io/2015/05/21/rnn-effectiveness/

1 संपादित करें:

लाल और हरे बक्से के बराबर होने के बारे में @ वान की टिप्पणी के बारे में थोड़ा भ्रमित। तो बस पुष्टि करने के लिए, निम्नलिखित एपीआई कॉल अनियंत्रित आरेखों के अनुरूप है? विशेष रूप से दूसरे आरेख पर ध्यान देना ( batch_sizeमनमाने ढंग से चुना गया था।): यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

2 संपादित करें:

उन लोगों के लिए, जिन्होंने उडेसिटी के गहन शिक्षण पाठ्यक्रम को किया है और अभी भी time_step तर्क के बारे में उलझन में हैं, निम्नलिखित चर्चा को देखें: https://discussions.udacity.com/t/rnn-lstm-use-implementation/163169

अपडेट करें:

यह पता चला है model.add(TimeDistributed(Dense(vocab_len)))कि मैं क्या देख रहा था। यहाँ एक उदाहरण है: https://github.com/sachinruk/ShakespeareBot

Update2:

मैंने LSTM की अपनी अधिकांश समझ को यहाँ प्रस्तुत किया है: https://www.youtube.com/watch?v=ywinX5wggEU


7
पहली तस्वीर होनी चाहिए (बैच_साइज़, 5, 1); दूसरा फोटो होना चाहिए (बैच_साइज़, 4, 3) (यदि निम्न क्रम नहीं है)। और क्यों आउटपुट अभी भी "एक्स" है? क्या यह "वाई" होना चाहिए?
वैन

1
यहाँ मैं X_1, X_2 ... X_6 एक एकल संख्या मान रहा हूँ। और तीन नंबर (X_1, X_2, X_3) आकार का एक वेक्टर (3,) बनाता है। एक संख्या (X_1) आकृति का वेक्टर बनाती है (1,)।
वैन

2
@ वैन, आपकी धारणा सही है। यह दिलचस्प है, इसलिए मूल रूप से मॉडल time_steps की संख्या से परे पैटर्न नहीं सीखता है। इसलिए अगर मेरे पास 1000 की लंबाई वाली श्रृंखला है, और नेत्रहीन हर 100 दिनों में एक पैटर्न देख सकते हैं, तो मुझे time_steps पैरामीटर को कम से कम 100 करना चाहिए। क्या यह एक सही अवलोकन है?
सचिन्रुक

3
हाँ। और यदि आप प्रति दिन 3 प्रासंगिक सुविधाएं एकत्र कर सकते हैं, तो आप फीचर आकार को 3 पर सेट कर सकते हैं जैसा आपने दूसरी तस्वीर में किया था। उस परिस्थिति में, इनपुट आकार (बैच_साइज़, 100, 3) होगा।
वैन

1
और अपना पहला सवाल एज़ करने के लिए था क्योंकि मैं एक ही समय श्रृंखला ले रहा था। उदाहरण के लिए स्टॉक की कीमतें, इसलिए एक्स और वाई एक ही श्रृंखला से हैं।
सचिन्रुक

जवाबों:


173

सबसे पहले, आप शुरू करने के लिए महान ट्यूटोरियल ( 1 , 2 ) चुनते हैं ।

टाइम-स्टेप का क्या मतलब है : Time-steps==3X.shape (डेटा आकृति का वर्णन) का मतलब है कि तीन गुलाबी बक्से हैं। चूंकि केरस में प्रत्येक चरण में एक इनपुट की आवश्यकता होती है, इसलिए हरे बॉक्स की संख्या आमतौर पर लाल बॉक्स की संख्या के बराबर होनी चाहिए। जब तक आप संरचना को हैक नहीं करते।

कई बनाम एक से कई : केरस में, 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


लाल और हरे बक्से के समान होने के बारे में थोड़ा उलझन में है। क्या आप मेरे द्वारा किए गए संपादन (मुख्य रूप से नए चित्र) और टिप्पणी देख सकते हैं?
सैचिन्रुक

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?
जन्म

1
आउटपुट स्पेस (32) की LSTM डायमेंशन न्यूरॉन्स (LSTM सेल्स) की संख्या से भिन्न क्यों है?
स्टिकी

1
इसके अलावा stateful=True: बैच का आकार कुछ भी हो सकता है जिसे आप पसंद करते हैं, लेकिन आपको इसके साथ रहना होगा। यदि आप अपने मॉडल को 5 के बैच आकार के साथ बनाते हैं, तो सभी fit(), predict()और संबंधित तरीकों के लिए 5. बैच की आवश्यकता होगी। नोट करें कि इस राज्य के साथ सहेजा नहीं जाएगा model.save(), जो अवांछनीय लग सकता है। हालाँकि, आप मैन्युअल रूप से राज्य को hdf5 फ़ाइल में जोड़ सकते हैं, अगर आपको इसकी आवश्यकता है। लेकिन प्रभावी रूप से यह आपको एक मॉडल को बचाने और पुनः लोड करके बैच आकार को बदलने की अनुमति देता है।
jlh

191

स्वीकार किए गए उत्तर के पूरक के रूप में, यह उत्तर केरेस व्यवहार और प्रत्येक चित्र को प्राप्त करने के तरीके को दर्शाता है।

सामान्य केर व्यवहार

मानक केरस आंतरिक प्रसंस्करण हमेशा निम्न चित्र के रूप में कई से कई होता है (जहां मैंने features=2एक उदाहरण के रूप में, दबाव और तापमान का उपयोग किया है ):

कई कई

इस छवि में, मैंने अन्य आयामों के साथ भ्रम से बचने के लिए, चरणों की संख्या 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]],
        ]

स्लाइडिंग विंडो के लिए इनपुट

अक्सर, LSTM परतों को पूरे अनुक्रम को संसाधित करना चाहिए। डिवाइडिंग विंडो सबसे अच्छा विचार नहीं हो सकता है। इस परत में आंतरिक स्थिति है कि कैसे एक क्रम विकसित हो रहा है क्योंकि यह आगे बढ़ता है। विंडोज लंबी अनुक्रम सीखने की संभावना को खत्म करता है, खिड़की के आकार के सभी अनुक्रमों को सीमित करता है।

खिड़कियों में, प्रत्येक खिड़की एक लंबे मूल अनुक्रम का हिस्सा है, लेकिन केरस द्वारा उन्हें प्रत्येक एक स्वतंत्र अनुक्रम के रूप में देखा जाएगा:

        [     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

आप एक सरल LSTM परत के साथ कई का उपयोग कर कई प्राप्त कर सकते हैं return_sequences=True:

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

#output_shape -> (batch_size, steps, units)

एक से कई हासिल करना:

सटीक एक ही परत का उपयोग करते हुए, keras सटीक समान आंतरिक प्रीप्रोसेसिंग करेगा, लेकिन जब आप उपयोग करते हैं return_sequences=False(या बस इस तर्क को अनदेखा करते हैं), तो keras स्वचालित रूप से पिछले से पिछले चरणों को छोड़ देगा:

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 जारी रखेगा।
  • बैच 2 में अनुक्रम 2 बैच 1 में अनुक्रम 2 जारी रखेगा।
  • बैच 2 में अनुक्रम n बैच 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 चरण का उपयोग करने जा रहे हैं, क्योंकि हम एक आउटपुट कदम प्राप्त करना चाहते हैं और इसे एक इनपुट बनाते हैं।

कृपया ध्यान दें कि चित्र में व्यवहार "के कारण" नहीं है 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)

अतिरिक्त स्पष्टीकरण

यदि आप LSTM में चरणों की गणना कैसे करते हैं, या stateful=Trueउपरोक्त मामलों के बारे में विवरण चाहते हैं, तो आप इस उत्तर में और अधिक पढ़ सकते हैं: 'करस LSTMs' को समझना


1
इनपुट के रूप में आउटपुट का उपयोग करने के साथ स्टेटफुल का बहुत दिलचस्प उपयोग। एक अतिरिक्त नोट के रूप में, ऐसा करने का एक अन्य तरीका कार्यात्मक केरस एपीआई का उपयोग करना होगा (जैसे कि आपने यहां किया है, हालांकि मेरा मानना ​​है कि आप क्रमिक एक का उपयोग कर सकते थे), और बस हर बार कदम के लिए एक ही LSTM सेल का पुन: उपयोग करें , जबकि परिणामी अवस्था और आउटपुट दोनों को ही सेल से पास करते हैं। यानी 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
कोशिकाएं और लंबाई पूरी तरह से स्वतंत्र मूल्य हैं। कोई भी चित्र "कोशिकाओं" की संख्या का प्रतिनिधित्व नहीं करता है। वे सभी "लंबाई" के लिए हैं।
डैनियल Möller

1
@ DanielMöller मुझे पता है कि थोड़ी देर हो चुकी है, लेकिन आपका जवाब वास्तव में मेरा ध्यान आकर्षित करता है। आपकी एक बात ने मेरी समझ के बारे में सब कुछ बिखर दिया कि LSTM क्या है। आप एन टैंक, पांच चरणों और दो सुविधाओं के साथ उदाहरण प्रदान करते हैं। मेरा मानना ​​था कि, यदि बैच दो उदाहरणों के लिए है, तो इसका मतलब है कि दो नमूने (5 चरणों 2 सुविधाओं के साथ टैंक) नेटवर्क में फीड किए जाएंगे और उसके बाद वज़न अनुकूलित किया जाएगा। लेकिन अगर मैं सही समझता हूं, तो आप कहते हैं कि बैच 2 का मतलब है कि नमूने के टाइमस्टेप को 2 से विभाजित किया जाएगा और सभी नमूनों में से पहले आधे को LSTM-> वजन अपडेट और दूसरे की तुलना में फीड किया जाएगा।
वायसरायल

1
हाँ। किसी स्टेटफुल = ट्रू, बैच 1 = सैंपल के ग्रुप को अपडेट करें। फिर बैच 2 = नमूनों के एक ही समूह के लिए अधिक चरणों को अपडेट करें।
डैनियल मोलर

2
काश मैं इस 100 बार उत्थान कर पाता। सुपर उपयोगी जवाब।
adamconkey

4

जब आपके पास RNN की अंतिम परत में रिटर्न_ परिणाम है तो आप TimeDistributed का उपयोग करने के बजाय एक सरल घने परत का उपयोग नहीं कर सकते।

यहां कोड का एक उदाहरण है जो दूसरों की मदद कर सकता है।

शब्द = keras.layers.Input (batch_shape = (कोई नहीं, self.maxSequenceLength), नाम = "इनपुट")

    # 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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.