Tensorflow 2.0 中如何通过 Xavier 规则进行权重初始化?
How to do weight initialization by Xavier rule in Tensorflow 2.0?
TF 2.0 碰巧摆脱了 contrib
库。因此,所有像 tf.contrib.conv2d
或 tf.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
只需使用 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 initializer
和 tf.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]]
在 tensorflow 2.0 中,您有一个包 tf.initializer
,其中包含您需要的所有类似 Keras 的初始化程序。
Xavier 初始化程序与 Glorot Uniform 初始化程序相同。因此,要使用从该初始值设定项中采样的值创建一个 (3,3)
变量,您只需:
shape = (3,3)
initializer = tf.initializers.GlorotUniform()
var = tf.Variable(initializer(shape=shape))
你可以改变,从 Tensorflow v1:
initializer=tf.contrib.layers.xavier_initializer()
到 Tensorflow v2:
initializer=tf.initializers.glorot_uniform()
来自 Tensorflow v1:
initializer=tf.contrib.layers.xavier_initializer(uniform=False)
到 Tensorflow v2:
initializer=tf.initializers.GlorotNormal()
Documentation for GlorotNormal()
我根据《Tensorflow 指南》中的描述总结了这个答案。
TF 2.0 碰巧摆脱了 contrib
库。因此,所有像 tf.contrib.conv2d
或 tf.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
只需使用 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 initializer
和 tf.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]]
在 tensorflow 2.0 中,您有一个包 tf.initializer
,其中包含您需要的所有类似 Keras 的初始化程序。
Xavier 初始化程序与 Glorot Uniform 初始化程序相同。因此,要使用从该初始值设定项中采样的值创建一个 (3,3)
变量,您只需:
shape = (3,3)
initializer = tf.initializers.GlorotUniform()
var = tf.Variable(initializer(shape=shape))
你可以改变,从 Tensorflow v1:
initializer=tf.contrib.layers.xavier_initializer()
到 Tensorflow v2:
initializer=tf.initializers.glorot_uniform()
来自 Tensorflow v1:
initializer=tf.contrib.layers.xavier_initializer(uniform=False)
到 Tensorflow v2:
initializer=tf.initializers.GlorotNormal()
Documentation for GlorotNormal()
我根据《Tensorflow 指南》中的描述总结了这个答案。