作为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))
答案 0 :(得分:3)
根据He et al 2015 Eq。如图15所示,当使用ReLu时,一层的理论权重方差变为:
n*Var[W] = 2
其中n是图层大小。
如果你想使用in层和out层的池化方差,那么它就变成了:
(fan_in, fan_out) = ...
low = -2*np.sqrt(1.0/(fan_in + fan_out))
high = 2*np.sqrt(1.0/(fan_in + fan_out))
如果您使用张量流,则它们具有variance_scaling_initializer,您可以在其中设置因子变量和模式变量来控制初始化的方式。
如果对此初始值设定项使用参数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)
同时使用in和out图层:
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)