![](/img/trans.png)
[英]How to do weight initialization by Xavier rule in Tensorflow 2.0?
[英]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
以防萬一你想像你一樣使用一行:
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.