2017-04-07 93 views
32

Tensorflow官方API文檔聲稱,對於tf.layers.conv2d和tf.layers.dense,參數kernel_initializer默認爲None。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

也許NaN有不同的原因?我正在使用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_uniform_initializer

爲了完整這個初始的定義:

的Glorot統一初始化,也稱爲澤維爾統一初始化。 它吸引樣品從均勻分佈[-limit,極限] 內,其中limitsqrt(6/(fan_in + fan_out)) 其中fan_in是在重量張量輸入單元的數量和 是fan_out在重量張量輸出單元的數量。 編號:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

編輯:這是我在代碼和文檔中找到的。也許你可以通過在權重上運行eval來驗證初始化是這樣的!

相關問題