2017-07-20 14 views
7

here वर्णित अनुसार कार्यात्मक एपीआई के माध्यम से एक केरास मॉडल टेंसर पर टेंसरफ़्लो फ़ंक्शन के रूप में उपयोग किया जा सकता है।टेन्सफोर्लो टेंसर के साथ केरास मॉडल में इनपुट इनपुट (या एक इनपुट) का उपयोग करने का क्या फायदा है?

तो हम कर सकते हैं:

from keras.layers import InputLayer 

a = tf.placeholder(dtype=tf.float32, shape=(None, 784)) 

model = Sequential() 
model.add(InputLayer(input_tensor=a, input_shape=(None, 784))) 
model.add(Dense(32, activation='relu')) 
model.add(Dense(10, activation='softmax')) 

output = model.output 

जो एक टेन्सर है:

<tf.Tensor 'dense_24/Softmax:0' shape=(?, 10) dtype=float32> 

लेकिन, यह भी काम करता है किसी भी InputLayer बिना:

a = tf.placeholder(dtype=tf.float32, shape=(None, 784)) 

model = Sequential() 
model.add(Dense(32, activation='relu', input_shape=(784,))) 
model.add(Dense(10, activation='softmax')) 

output = model(a) 

काम करता है, और output है पहले जैसा ही आकार:

<tf.Tensor 'sequential_9/dense_22/Softmax:0' shape=(?, 10) dtype=float32> 

मैं पहली बार प्रपत्र परमिट मान:

  • पर स्पष्ट रूप मॉडल (एक ही नाम की) की विशेषताओं के रूप में inputs और outputs संलग्न करने के लिए है, तो हम उन्हें कहीं और पुन: उपयोग कर सकते हैं। उदाहरण के लिए अन्य टीएफ ओप के साथ।
  • अतिरिक्त मेटाडाटा (जैसे _keras_history) के साथ केरास इनपुट में इनपुट के रूप में दिए गए टेंसर को बदलने के लिए the source code में बताया गया है)।

लेकिन यह कुछ हम दूसरे फार्म के साथ ऐसा नहीं कर सकते नहीं है, इसलिए, वहाँ (एकाधिक आदानों को छोड़कर) InputLayer (और Input सुतरां) की एक विशेष उपयोग है? हम बैच का आकार (None यहाँ) है, जो आम तौर पर ऐसा नहीं है ...

उत्तर

5

यह प्रतीत होता है कि InputLayer कुछ का उपयोग करता है निर्दिष्ट करें:
इसके अलावा, InputLayer क्योंकि यह अन्य keras परतों से अलग ढंग से input_shape का उपयोग कर मुश्किल है:

  • सबसे पहले, यह आपको अपने आकार को निर्दिष्ट किए बिना शुद्ध टेंसफोर्लो टेंसर देने की अनुमति देता है। जैसे आप

    model.add(InputLayer(input_tensor=a)) 
    

    यह कई स्पष्ट कारणों के लिए अच्छा है, दूसरों के बीच कम नकल।

  • दूसरा, वे आपको एक इनपुट के साथ गैर-अनुक्रमिक नेटवर्क लिखने की अनुमति देते हैं, उदा।

     a 
        /\ 
        / \ 
    / \ 
    conv1 conv2 
        |  | 
    

    InputLayer बिना आप स्पष्ट रूप से conv1 और conv2 ही टेन्सर फ़ीड, या मॉडल की चोटी पर एक मनमाना पहचान परत बनाने के लिए की आवश्यकता होगी। न तो काफी सुखदायक है।

  • अंत में, वे "परतें जो इनपुट भी हैं" और "सामान्य परतें" के बीच मनमाना भेद को हटा देते हैं। यदि आप InputLayer का उपयोग करते हैं तो आप कोड लिख सकते हैं जहां इनपुट किस इनपुट के बीच स्पष्ट अंतर है और कौन सी परत कुछ करता है। यह कोड पठनीयता में सुधार करता है और रिफैक्टरिंग को अधिक आसान बनाता है। उदाहरण के लिए, पहली परत को बदलना किसी भी अन्य परत को बदलने के जितना आसान हो जाता है, आपको input_shape के बारे में सोचने की आवश्यकता नहीं है।

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