2016-09-27 13 views
10

से सभी राज्यों को प्राप्त करना आप tf.nn.rnn() या tf.nn.dynamic_rnn() से सभी छुपे हुए राज्यों को टेंसरफ़्लो में कैसे प्राप्त करते हैं? एपीआई केवल मुझे अंतिम स्थिति देता है।टेंसरफ्लो: आरएनएन

पहला विकल्प आरएनएनसीएल पर सीधे चलने वाले मॉडल का निर्माण करते समय लूप लिखना होगा। हालांकि, timesteps की संख्या मेरे लिए तय नहीं है, और आने वाले बैच पर निर्भर करता है।

कुछ विकल्प या तो जीआरयू का उपयोग करना चाहते हैं या अपना खुद का आरएनएनसीएल लिखना है जो राज्य को आउटपुट में जोड़ता है। पूर्व पसंद सामान्य नहीं है और बाद में बहुत हैकी लगता है।

एक और विकल्प the answers in this question जैसे कुछ करना है, जो आरएनएन से सभी चर प्राप्त कर रहा है। हालांकि, मुझे यकीन नहीं है कि छुपे हुए राज्यों को यहां एक मानक फैशन में अन्य चर से कैसे अलग किया जाए।

क्या पुस्तकालय द्वारा प्रदत्त आरएनएन एपीआई का उपयोग करते हुए सभी छिपे हुए राज्यों को आरएनएन से प्राप्त करने का कोई अच्छा तरीका है?

+0

मैं एक पीआर [यहां] बना लिया है (https://github.com/tensorflow/tensorflow/pull/9995) है और यह आपको सरल मामलों से निपटने में मदद मिल सकती है – Carefree0910

उत्तर

0

मैं पहले से ही एक पीआर here बना लिया है और यह आप साधारण मामलों

मुझे संक्षेप में मेरी कार्यान्वयन की व्याख्या है, तो आप अगर आप की जरूरत है अपने स्वयं के संस्करण लिख सकते हैं के साथ सौदा करने में मदद कर सकते हैं।

def _time_step(time, output_ta_t, state, *args): 

मापदंडों एक अतिरिक्त *args छोड़कर ही रहते हैं में पारित हो जाता है लेकिन क्यों args:। मुख्य हिस्सा _time_step समारोह के संशोधन है? ऐसा इसलिए है क्योंकि मैं tensorflow के पारंपरिक व्यवहार का समर्थन करना चाहता हूं। आप बस args पैरामीटर की अनदेखी करके केवल अंतिम अवस्था लौटने में सक्षम हैं:

if states_ta is not None: 
    # If you want to return all states, set `args` to be `states_ta` 
    loop_vars = (time, output_ta, state, states_ta) 
else: 
    # If you want the final state only, ignore `args` 
    loop_vars = (time, output_ta, state) 

यह कैसे का उपयोग करने के लिए?

output_ta_t = tuple(
    ta.write(time, out) for ta, out in zip(output_ta_t, output) 
) 

अब args सभी राज्यों आप चाहते हैं शामिल करना चाहिए:

if args: 
    args = tuple(
     ta.write(time, out) for ta, out in zip(args[0], [new_state]) 
    ) 

वास्तव में यह सिर्फ निम्नलिखित (मूल) कोड की एक संशोधन है।

_, output_final_ta, *state_info = control_flow_ops.while_loop(... 

और

if states_ta is not None: 
    final_state, states_final_ta = state_info 
else: 
    final_state, states_final_ta = state_info[0], None 

हालांकि मैं में यह परीक्षण नहीं किया:

के बाद सभी कार्यों से ऊपर किया है, तो आप राज्यों (या अंतिम अवस्था) निम्नलिखित कोड के साथ ले सकते हैं जटिल मामलों, इसे 'सरल' स्थिति (here's मेरे परीक्षण मामलों के तहत काम करना चाहिए)

+0

उत्तर लिखने के लिए समय निकालने के लिए धन्यवाद। आपकी पहली वाक्य के जवाब में, बेहतर है कि स्टैक ओवरफ़्लो पर डुप्लिकेट जानकारी न हो। एक बार आपके पास 75 प्रतिष्ठा हो जाने के बाद, आप एक प्रश्न को दूसरे के डुप्लिकेट के रूप में फ़्लैग करने में सक्षम होंगे (हालांकि मैं गलत हो सकता हूं और शायद आप इसे अभी कर सकते हैं)। यदि प्रश्न समान नहीं हैं, तो प्रश्नों की आवश्यकताओं के अनुरूप प्रत्येक उत्तर को बेहतर बनाना बेहतर होगा। – zondo

+0

आपकी टिप्पणी के लिए धन्यवाद! मुझे पहले से ही उन दो सवालों के बीच कुछ अंतर मिल गए हैं, इसलिए अब मैंने आपकी सलाह का पालन किया और प्रत्येक उत्तर को अनुरूप बनाया :) – Carefree0910

+0

जिस तरह से मैंने वास्तव में इसे हल किया था, वह एक रैपर सेल (जैसे मल्टीआरएनएनसीएल) बना रहा था जो आउटपुट के साथ जुड़े राज्यों को आउटपुट करता था। छुपे हुए राज्यों से आउटपुट अलग करने के लिए केवल एक को विभाजित करने की आवश्यकता है। –

2

tf.nn.dynamic_rnn (भी tf.nn.static_rnn) में दो रिटर्न मान हैं; "आउटपुट", "स्टेट" (https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn)

जैसा कि आपने कहा था, "राज्य" आरएनएन की अंतिम स्थिति है, लेकिन "आउटपुट" आरएनएन के सभी छिपे हुए राज्य हैं (कौन सा आकार है [बैच_साइज, max_time, cell.output_size ])

आप आरएनएन के छिपे हुए राज्यों के रूप में "आउटपुट" का उपयोग कर सकते हैं, क्योंकि अधिकांश पुस्तकालय द्वारा प्रदान किए गए आरएनएनसीएलएल, "आउटपुट" और "स्टेट" समान हैं।(LSTMCell को छोड़कर)

+0

यह निर्धारित करना कि यह जीआरयू के लिए विशिष्ट है, यदि आपकी एकाधिक परतें हैं, तो यह आपकी मदद नहीं करता है, उदाहरण के लिए यदि आप [GRUCell] को लपेटते हैं (https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/GRUCell) एक [MultiRNNCell] में (https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/MultiRNNCell)। आपके आउटपुट में केवल अंतिम परत से राज्य शामिल होंगे। –

संबंधित मुद्दे