如何在TensorFlow上进行Xavier初始化
python
tensorflow
7
0

我正在将我的Caffe网络移植到TensorFlow上,但是它似乎没有进行大量初始化。我正在使用truncated_normal但这似乎使训练变得困难得多。

参考资料:
Stack Overflow
收藏
评论
共 9 个回答
高赞 时间 活跃

@ Aleph7,Xavier / Glorot初始化取决于传入连接的数量(fan_in),传出连接的数量(fan_out)以及神经元的激活函数类型(S型或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笔记本: https : //github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb

收藏
评论

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制服和Xavier制服是同一初始化类型的两个不同名称。如果您想进一步了解如何在带有或不带有Keras的TF2.0中使用初始化,请参考文档

收藏
评论

围绕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)
收藏
评论

通过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

收藏
评论

从0.8版开始,有一个Xavier初始化程序, 请参阅docs

您可以使用如下形式:

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

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(即您要初始化的权重矩阵表示的神经元数量)。

收藏
评论

以防万一,您想像这样使用一行:

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

你可以做:

W = tf.Variable(tf.contrib.layers.xavier_initializer()((n_prev, n)))
收藏
评论

我想补充上如何定义另一个例子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值。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号