【问题标题】:How to do weight initialization by Xavier rule in Tensorflow 2.0?如何在 Tensorflow 2.0 中通过 Xavier 规则进行权重初始化?
【发布时间】:2019-08-14 19:20:53
【问题描述】:

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

【问题讨论】:

    标签: python tensorflow tensorflow2.0


    【解决方案1】:

    来自 TensorFlow v1:

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

    到 TensorFlow v2:

    initializer=tf.initializers.GlorotNormal()
    

    Documentation for GlorotNormal()

    我根据Tensorflow Guide中的描述总结了这个答案。

    【讨论】:

      【解决方案2】:

      您可以从 Tensorflow v1 进行更改:

      initializer=tf.contrib.layers.xavier_initializer()
      

      到 TensorFlow v2:

      initializer=tf.initializers.glorot_uniform()
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 嗨~我可以问一个问题吗?我在 tf.initializers.GlorotUniform() 中找不到参数 uniform=False 。想替换tf.contrib.layers.xavier_initializer(uniform=False)怎么办
        【解决方案4】:

        只需使用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]]
        

        【讨论】:

        • 好点,绝对是朝着正确方向迈出的一步。然而,在 TF2.0 中,glorot 初始化程序位于 tf.initializers.glorot_uniform 中(可以在此处查看 github.com/tensorflow/tensorflow/blob/master/tensorflow/python/…)。不过,这似乎是某种 Keras 的东西。 tf.get_variable 也不再是 TF2.0 中的东西了
        • 查看我的更新,这应该可以解决您遇到的问题。
        • shape = (3,3) 代表什么?什么形状?
        猜你喜欢
        • 1970-01-01
        • 2016-02-11
        • 2017-09-15
        • 1970-01-01
        • 2018-11-09
        • 2017-03-12
        • 2018-09-05
        • 2016-12-24
        相关资源
        最近更新 更多