如何在TensorFlow上进行Xavier初始化


Answers:


12

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中使用初始化的更多信息,请参考文档


我使用了上面的代码,并得到如下错误:_init_xavier = tf.Variable(init(shape = shape))NameError:名称“ shape”未定义
Chiranga

119

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

您可以使用如下形式:

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

3
您知道这样做而不给形状,get_variable而是给初始化器吗?我曾经有过tf.truncated_normal(shape=[dims[l-1],dims[l]], mean=mu[l], stddev=std[l], dtype=tf.float64),我在那里指定了形状,但是现在您的建议有点把我的代码搞砸了。你有什么建议吗?
Pinocchio

1
@Pinocchio您只需编写一个tf.Variable(...)与您使用和使用相同签名的包装器即可tf.get_variable(...)
jns


28

仅添加另一个示例,说明如何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))
    ...

nan当使用多层带有RELU时,由于数值不稳定,这使我无法获得损失函数的值。


2
这种格式最适合我的代码-并且允许我将学习率恢复为0.5(添加另一个依赖图层时,我必须将其降低至0.06)。一旦将此初始化程序应用于所有隐藏层,从头几百个世纪开始我就获得了令人难以置信的高验证率。我不敢相信它带来的改变!
scipilot

12

@ 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


1
我们如何将其与relu激活功能一起使用。
gautam840'9

该论文使用常用的初始化方法研究了不同激活函数下的权重梯度行为。然后,他们提出了通用初始化,而不考虑任何激活功能。此外,您的方法也不依赖于激活函数,因此最好在Tensorflow中使用内置的Xavier初始化。
Vahid Mirjalili

8

一个不错的包装,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)

8

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还有其他初始化器:


谢谢您,先生,这非常有帮助,我想问一下我是否可以使用 xavier_initializer初始化偏差
Sakhri Houssem 18/02/11



3

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

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

你可以做:

W = tf.Variable(tf.contrib.layers.xavier_initializer()((n_prev, n)))

0

Tensorflow 1:

W1 = tf.get_variable("W1", [25, 12288],
    initializer = tf.contrib.layers.xavier_initializer(seed=1)

Tensorflow 2:

W1 = tf.get_variable("W1", [25, 12288],
    initializer = tf.random_normal_initializer(seed=1))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.