如何在Tensorflow 2.0中通过Xavier规则进行权重初始化?

时间:2019-03-24 10:18:13

标签: python tensorflow tensorflow2.0

TF 2.0刚好摆脱了contrib库。因此,tf.contrib.conv2dtf.contrib.layers.variance_scaling_initializer之类的好东西都消失了。也就是说,您认为在不使用Keras的情况下(或通过一些numpy hack进行初始化)在TF2.0中进行Xavier初始化的最佳方法是什么?

也就是说,我坚持使用tf.nn.conv2d,为此功能,我是提供权重的人:

filters = tf.Variable(tf.zeros([3, 3, 32, 64]))
??? # something should happen hear, i guess
net = tf.nn.conv2d(input, filters)

注意::如果您使用的是TF的第一个版本,则可以使用:

filters = tf.get_variable("w", shape=[3,3, 32, 64],
           initializer=tf.contrib.layers.xavier_initializer()) 
# no tf.contrib in 2.0, no tf.get_variable in 2.0

4 个答案:

答案 0 :(得分:4)

在tensorflow 2.0中,您有一个tf.initializer软件包,其中包含您需要的所有类似Keras的初始化程序。

Xavier初始值设定项与Glorot Uniform初始值设定项相同。因此,要使用从该初始值设定项中采样的值创建一个(3,3)变量,您可以:

shape = (3,3)
initializer = tf.initializers.GlorotUniform()
var = tf.Variable(initializer(shape=shape))

答案 1 :(得分:1)

只需使用与glorot uniform initializer相同的xavier initializer

来源:https://www.tensorflow.org/api_docs/python/tf/glorot_uniform_initializer

这也是一个证明它们相同的示例:

tf.reset_default_graph()
tf.set_random_seed(42)
xavier_var = tf.get_variable("w_xavier", shape=[3, 3], initializer=tf.contrib.layers.xavier_initializer())
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(xavier_var))
# [[ 0.27579927 -0.6790426  -0.6128938 ]
#  [-0.49439836 -0.36137486 -0.7235348 ]
#  [-0.23143482 -0.3394227  -0.34756017]]
tf.reset_default_graph()
tf.set_random_seed(42)
glorot_var = tf.get_variable("w_glorot", shape=[3, 3], initializer=tf.glorot_uniform_initializer())
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(glorot_var))
# [[ 0.27579927 -0.6790426  -0.6128938 ]
#  [-0.49439836 -0.36137486 -0.7235348 ]
#  [-0.23143482 -0.3394227  -0.34756017]]

此外,如果您想将glorot uniform initializertf.Variable一起使用,可以执行以下操作:

tf.reset_default_graph()
tf.set_random_seed(42)
normal_var = tf.Variable(tf.glorot_uniform_initializer()((3, 3)))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(normal_var))
# [[ 0.27579927 -0.6790426  -0.6128938 ]
#  [-0.49439836 -0.36137486 -0.7235348 ]
#  [-0.23143482 -0.3394227  -0.34756017]]

答案 2 :(得分:0)

您可以从Tensorflow v1中进行更改:

name

到Tensorflow v2:

initializer=tf.contrib.layers.xavier_initializer()

答案 3 :(得分:0)

来自Tensorflow v1:

initializer=tf.contrib.layers.xavier_initializer(uniform=False)

到Tensorflow v2:

initializer=tf.initializers.GlorotNormal()

Documentation for GlorotNormal()

我根据Tensorflow指南中的描述得出了这个答案。