作为How to do Xavier initialization on TensorFlow中答复(不是所选答复)的后续:任何有想法的人,在relu(尤其是泄漏relu)中使用哪些值?

我的意思是这部分:

# use 4 for sigmoid, 1 for tanh activation


在这里给出:

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

最佳答案

根据He et al 2015式。如图15所示,使用ReLu时,一层的理论重量变化为:

n*Var[W] = 2


其中n是图层大小。

如果要使用入层和出层的合并方差,则它将变为:

(fan_in, fan_out) = ...
low = -2*np.sqrt(1.0/(fan_in + fan_out))
high = 2*np.sqrt(1.0/(fan_in + fan_out))


如果您使用的是tensorflow,它们有一个variance_scaling_initializer,您可以在其中设置factor变量和mode变量以控制初始化的方式。

如果为该初始化程序使用参数factor = 2.0的默认设置,您将获得He et al 2015建议的ReLu激活的初始化差异。尽管您可以使用参数模式来获得权重初始化方差略有不同的方法。仅用于图层:

tf.contrib.layers.variance_scaling_initializer(factor=2.0, mode='FAN_IN')


将为您提供以下内容:

(fan_in, fan_out) = ...
low = -np.sqrt(2.0/fan_in)
high = np.sqrt(2.0/fan_in)


同时使用输入和输出层:

tf.contrib.layers.variance_scaling_initializer(factor=2.0, mode='FAN_AVG')


会给你:

(fan_in, fan_out) = ...
low = -np.sqrt(4.0/(fan_in+fan_out)) = -2.0*np.sqrt(1.0/(fan_in+fan_out))
high = np.sqrt(4.0/(fan_in+fan_out)) = 2.0*np.sqrt(1.0/(fan_in+fan_out))


仅使用外层:

tf.contrib.layers.variance_scaling_initializer(factor=2.0, mode='FAN_AVG')


会给你:

(fan_in, fan_out) = ...
low = -np.sqrt(2.0/fan_out)
high = np.sqrt(2.0/fan_out)

关于machine-learning - 手工制作的Xavier Initializer:lrelu和relu的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39231032/

10-11 07:22