簡體   English   中英

如何在 TensorFlow 上進行 Xavier 初始化

[英]How to do Xavier initialization on TensorFlow

我正在將我的 Caffe 網絡移植到 TensorFlow,但它似乎沒有 xavier 初始化。 我正在使用truncated_normal但這似乎使訓練變得更加困難。

由於版本 0.8 有一個 Xavier 初始值設定項, 請參閱此處的文檔

你可以使用這樣的東西:

W = tf.get_variable("W", shape=[784, 256],
           initializer=tf.contrib.layers.xavier_initializer())

我想補充上如何定義另一個例子tf.Variable使用初始化Xavier和Yoshua的方法:

graph = tf.Graph()
with graph.as_default():
    ...
    initializer = tf.contrib.layers.xavier_initializer()
    w1 = tf.Variable(initializer(w1_shape))
    b1 = tf.Variable(initializer(b1_shape))
    ...

當使用帶有 RELU 的多個層時,由於數值不穩定性,這阻止了我的損失函數中的nan值。

Tensorflow 2.0以及更進一步的tf.contrib.*tf.get_variable()都被棄用了。 為了進行 Xavier 初始化,您現在必須切換到:

init = tf.initializers.GlorotUniform()
var = tf.Variable(init(shape=shape))
# or a oneliner with a little confusing brackets
var = tf.Variable(tf.initializers.GlorotUniform()(shape=shape))

Glorot uniform 和 Xavier uniform 是同一個初始化類型的兩個不同名稱。 如果您想了解更多有關如何在 TF2.0 中使用或不使用 Keras 進行初始化的信息,請參閱文檔

@Aleph7,Xavier/Glorot 初始化取決於傳入連接數 (fan_in)、傳出連接數 (fan_out) 和神經元的激活函數類型(sigmoid 或 tanh)。 看到這個: http : //jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

所以現在,你的問題。 這就是我在 TensorFlow 中的做法:

(fan_in, fan_out) = ...
    low = -4*np.sqrt(6.0/(fan_in + fan_out)) # use 4 for sigmoid, 1 for tanh activation 
    high = 4*np.sqrt(6.0/(fan_in + fan_out))
    return tf.Variable(tf.random_uniform(shape, minval=low, maxval=high, dtype=tf.float32))

請注意,我們應該從均勻分布中采樣,而不是另一個答案中建議的正態分布。

順便說一句,我昨天寫了一篇關於使用 TensorFlow 的不同內容的帖子,恰好也使用了 Xavier 初始化。 如果您有興趣,還有一個帶有端到端示例的 python notebook: https : //github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb

一個很好的圍繞tensorflow包裝器稱為prettytensor在源代碼中給出了一個實現(直接從這里復制):

def xavier_init(n_inputs, n_outputs, uniform=True):
  """Set the parameter initialization using the method described.
  This method is designed to keep the scale of the gradients roughly the same
  in all layers.
  Xavier Glorot and Yoshua Bengio (2010):
           Understanding the difficulty of training deep feedforward neural
           networks. International conference on artificial intelligence and
           statistics.
  Args:
    n_inputs: The number of input nodes into each output.
    n_outputs: The number of output nodes for each input.
    uniform: If true use a uniform distribution, otherwise use a normal.
  Returns:
    An initializer.
  """
  if uniform:
    # 6 was used in the paper.
    init_range = math.sqrt(6.0 / (n_inputs + n_outputs))
    return tf.random_uniform_initializer(-init_range, init_range)
  else:
    # 3 gives us approximately the same limits as above since this repicks
    # values greater than 2 standard deviations from the mean.
    stddev = math.sqrt(3.0 / (n_inputs + n_outputs))
    return tf.truncated_normal_initializer(stddev=stddev)

TF-contrib 有xavier_initializer 這是一個如何使用它的示例:

import tensorflow as tf
a = tf.get_variable("a", shape=[4, 4], initializer=tf.contrib.layers.xavier_initializer())
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print sess.run(a)

除此之外,tensorflow 還有其他初始化器:

我看了看,我找不到任何內置的東西。但是,根據這個:

http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization

Xavier 初始化只是對一個(通常是高斯)分布進行采樣,其中方差是神經元數量的函數。 tf.random_normal可以為您做到這一點,您只需要計算 stddev(即由您嘗試初始化的權重矩陣表示的神經元數量)。

通過kernel_initializer參數到tf.layers.conv2d, tf.layers.conv2d_transpose, tf.layers.Dense

例如

layer = tf.layers.conv2d(
     input, 128, 5, strides=2,padding='SAME',
     kernel_initializer=tf.contrib.layers.xavier_initializer())

https://www.tensorflow.org/api_docs/python/tf/layers/conv2d

https://www.tensorflow.org/api_docs/python/tf/layers/conv2d_transpose

https://www.tensorflow.org/api_docs/python/tf/layers/Dense

以防萬一你想像你一樣使用一行:

W = tf.Variable(tf.truncated_normal((n_prev, n), stddev=0.1))

你可以做:

W = tf.Variable(tf.contrib.layers.xavier_initializer()((n_prev, n)))

張量流 1:

W1 = tf.get_variable("W1", [25, 12288],
    initializer = tf.contrib.layers.xavier_initializer(seed=1)

張量流2:

W1 = tf.get_variable("W1", [25, 12288],
    initializer = tf.random_normal_initializer(seed=1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM