2017-04-07 5 views
32

आधिकारिक टेन्सफोर्लो एपीआई दस्तावेज़ का दावा है कि पैरामीटर kernel_initializer tf.layers.conv2d और tf.layers.dense के लिए किसी के लिए डिफ़ॉल्ट नहीं है।tf.layers.conv2d और tf.layers.dense में डिफ़ॉल्ट कर्नेल प्रारंभकर्ता क्या है?

हालांकि, परत ट्यूटोरियल (https://www.tensorflow.org/tutorials/layers) पढ़ना, मैंने ध्यान दिया कि यह पैरामीटर कोड में सेट नहीं है। उदाहरण के लिए:

# Convolutional Layer #1 
    conv1 = tf.layers.conv2d(
     inputs=input_layer, 
     filters=32, 
     kernel_size=[5, 5], 
     padding="same", 
     activation=tf.nn.relu) 

ट्यूटोरियल से उदाहरण कोड किसी भी त्रुटि के बिना चलाता है, तो मुझे लगता है डिफ़ॉल्ट kernel_initializer "कोई नहीं" नहीं है। तो, किस प्रारंभकर्ता का उपयोग किया जाता है?

एक और कोड में, मैंने conv2d और घने परतों के kernel_initializer सेट नहीं किया था, और सबकुछ ठीक था। हालांकि, जब मैंने kernel_initializer को tf.truncated_normal_initializer (stddev = 0.1, dtype = tf.float32) पर सेट करने का प्रयास किया, तो मुझे NaN त्रुटियां मिलीं। यहाँ क्या हो रहा है? क्या कोई मदद कर सकता है?

+0

शायद नाएन के पास अलग कारण है? मैं kernel_initializer = tf.truncated_normal_initializer (stddev = 0 का उपयोग कर रहा हूं।001, dtype = tf.float32) और यह अपेक्षित के रूप में काम करता है। – JirkaV

उत्तर

47

महान प्रश्न! यह पता लगाने के लिए काफी चाल है!

  • आप देख सकते हैं, यह tf.layers.conv2d
  • में दर्ज नहीं है आप the function की परिभाषा को देखें, तो आप देख फ़ंक्शन को कॉल variable_scope.get_variable:

कोड में:

self.kernel = vs.get_variable('kernel', 
            shape=kernel_shape, 
            initializer=self.kernel_initializer, 
            regularizer=self.kernel_regularizer, 
            trainable=True, 
            dtype=self.dtype) 

अगला चरण: what does the variable scope do when the initializer is None?

यहाँ यह कहते हैं:

तो प्रारंभकर्ता None (डिफ़ॉल्ट) है, डिफ़ॉल्ट में पारित प्रारंभकर्ता निर्माता प्रयोग किया जाता है। यदि वह None भी है, तो हम एक नया glorot_uniform_initializer का उपयोग करते हैं।

तो जवाब है:

Glorot वर्दी प्रारंभकर्ता भी कहा जाता है जेवियर वर्दी प्रारंभकर्ता: यह glorot_uniform_initializer

इस प्रारंभकर्ता की परिभाषा का उपयोग करता है पूर्णता के लिए। यह [-limit, सीमा] के भीतर एक समान वितरण से नमूने खींचता है, जहां limitsqrt(6/(fan_in + fan_out)) जहां fan_in वजन टेन्सर में इनपुट इकाइयों की संख्या और fan_out वजन टेन्सर में उत्पादन इकाइयों की संख्या है है। संदर्भ: http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

संपादित करें: यह है कि क्या मैं कोड और प्रलेखन में पाया है। शायद आप यह सत्यापित कर सकते हैं कि वज़न पर eval चलकर प्रारंभिकता इस तरह दिखती है!

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