如何在TensorF上进行Xavier初始化

2024-09-21 03:17:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将我的Caffe网络移植到TensorFlow,但它似乎没有xavier初始化。我正在使用truncated_normal,但这似乎使训练变得更加困难。


Tags: 网络tensorflowcaffenormaltruncatedxavier
3条回答

因为版本0.8有一个Xavier初始值设定项,see here for the docs

你可以用这样的东西:

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

@Aleph7,Xavier/Glorot初始化依赖于神经元的传入连接数(fan_-in)、传出连接数(fan_-out)和激活函数类型(sigmoid或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为一些不同的东西写了一个post yesterday,而TensorFlow恰好也使用Xavier初始化。如果您感兴趣,还有一个python笔记本,它有一个端到端的示例:https://github.com/delip/blog-stuff/blob/master/tensorflow_ufp.ipynb

添加另一个关于如何定义使用Xavier and Yoshua方法初始化的tf.Variable的示例:

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))
    ...

这就阻止了我在loss函数中使用nan值,因为在使用RELUs的多层时,数值不稳定。

相关问题 更多 >

    热门问题