xavier_initializer(uniform=True, seed=None, dtype=tf.float32)
和glorot_uniform_initializer(seed=None, dtype=tf.float32)
指的是同一个人Xavier Glorot。为什么不将它们合并为一个功能?
xavier_initializer
在tf.contrib.layers
。在glorot_uniform_initializer
的tf
。 contrib
的命名空间最终会消失吗?contrib
中的东西会被移动到tf
的命名空间吗?
有趣的问题!我将从tf.contrib
开始:
contrib
的命名空间会消失吗?只有当没有更多不稳定的社区贡献才能添加到TensorFlow时 - 所以永远不会。 This question可能会引起关注。我会总结一下。 contrib
命名空间用于社区支持的用户贡献代码(不是TensorFlow)。 contrib
中的代码非常有用,可以在API中使用,最终可能会合并。但是,在TensorFlow团队彻底测试之前,它一直停留在contrib
。我相信这些文档用来解释为什么contrib
存在,但我再也找不到了。最接近的是the API stability promise,它解释了contrib
函数/类可能会发生变化!
更深入一点,contrib
的事情最终会合并到tf
。例如,整个Keras
在1.4中从contrib
合并到tf.keras
。但是,合并的确切过程各不相同。例如,比较tf.contrib.rnn
中的tf.nn
和RNN功能。相当一点tf.nn
别名tf.contrib.rnn
。我的意思是,点击tf.nn.rnn_cell
guide上的任何内容。你会看到tf.rnn.contrib
doc!试试吧!似乎使用tf.contrib.rnn
是非常稳定的,尽管它已经迁移到“本地”tf
。另一方面,Datasets
合并不是那么干净(contrib
'ed在1.3,合并在1.4)。因为在合并期间有些 - 很少 - 代码被更改,使用tf.contrib.data.TFRecordDataset
会给你一个很好的折旧警告。并且,有些事情已经在contrib
停留了很长一段时间并且没有显示出很快就会合并的迹象:tf.contrib.training.stratified_sample
浮现在脑海中。我相信contrib.keras
在合并前已经存在了一段时间。
现在进入Xavier / Glorot:
这里是contrib.xavier...
和tf.glorot...
来源的链接。源代码看起来(几乎)相同,但让我们遵循variance_scaling_initializer
。现在情况有所不同:xavier
有a function和glorot
使用a class(VarianceScaling
别名为variance_scaling_initializer
)。类似的是,是的,但是一眼就看出“本机”tf
版本给了我们一些不同的错误信息和一些更好的输入验证。
那么为什么不删除contrib.xavier
?我不知道。如果我不得不推测,那是因为contrib.xavier
起飞了。我的意思是,我仍然使用它,我仍然一直看到它(需要引用?)。现在我知道glorot
基本相同,我不确定我会继续使用contrib.xavier
。但我离题了。我怀疑xavier
留了下来,因为删除它会破坏合理数量的代码。当然,contrib
没有稳定的承诺,但为什么要修复(或打破)什么没有破坏?
在Github上发布问题或拉取请求可以从实际贡献者那里产生一些更有趣的回复。我怀疑你会得到它没有的理由,也不会被删除,但也许不会。我在问题中快速搜索“xavier”然后“glorot”表明之前没有被问过。
编辑:要明确,正如kmario指出的那样,它们在数学上是相同的。我指出,现在的实现在输入验证和结构方面略有不同。他似乎认为xavier比我最初想象的更容易贬值。我很乐意顺从他,因为他可能比我更有经验。
是的,tf.contrib.layers.xavier_initializer
和tf.glorot_uniform_initializer
都实现了这个JMLR paper中描述的相同概念,可以看到代码:
对于fan_in
,fan_out
,mode = FAN_AVG
和uniform = True
的典型值,两种实现均从超出限制的标准均匀分布中采样值[-sqrt(3), sqrt(3)
]
因为tf.initializer
支持各种各样的初始化策略,所以它很可能会保留,而来自contrib的初始化只有xavier_initialization
,很可能在将来的版本中被弃用。
所以,是的,很可能在未来的版本中,tf.contrib.layers.xavier_initialier
的初始化方式可能会消失。