作为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/