为什么`xavier_initializer()`和`glorot_uniform_initializer()`在某种程度上是重复的?

问题描述 投票:2回答:2

xavier_initializer(uniform=True, seed=None, dtype=tf.float32)glorot_uniform_initializer(seed=None, dtype=tf.float32)指的是同一个人Xavier Glorot。为什么不将它们合并为一个功能?

xavier_initializertf.contrib.layers。在glorot_uniform_initializertfcontrib的命名空间最终会消失吗?contrib中的东西会被移动到tf的命名空间吗?

python tensorflow machine-learning deep-learning initializer
2个回答
2
投票

有趣的问题!我将从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。现在情况有所不同:xaviera functionglorot使用a classVarianceScaling别名为variance_scaling_initializer)。类似的是,是的,但是一眼就看出“本机”tf版本给了我们一些不同的错误信息和一些更好的输入验证。

那么为什么不删除contrib.xavier?我不知道。如果我不得不推测,那是因为contrib.xavier起飞了。我的意思是,我仍然使用它,我仍然一直看到它(需要引用?)。现在我知道glorot基本相同,我不确定我会继续使用contrib.xavier。但我离题了。我怀疑xavier留了下来,因为删除它会破坏合理数量的代码。当然,contrib没有稳定的承诺,但为什么要修复(或打破)什么没有破坏?

在Github上发布问题或拉取请求可以从实际贡献者那里产生一些更有趣的回复。我怀疑你会得到它没有的理由,也不会被删除,但也许不会。我在问题中快速搜索“xavier”然后“glorot”表明之前没有被问过。

编辑:要明确,正如kmario指出的那样,它们在数学上是相同的。我指出,现在的实现在输入验证和结构方面略有不同。他似乎认为xavier比我最初想象的更容易贬值。我很乐意顺从他,因为他可能比我更有经验。


2
投票

是的,tf.contrib.layers.xavier_initializertf.glorot_uniform_initializer都实现了这个JMLR paper中描述的相同概念,可以看到代码:

对于fan_infan_outmode = FAN_AVGuniform = True的典型值,两种实现均从超出限制的标准均匀分布中采样值[-sqrt(3), sqrt(3)]

因为tf.initializer支持各种各样的初始化策略,所以它很可能会保留,而来自contrib的初始化只有xavier_initialization,很可能在将来的版本中被弃用。

所以,是的,很可能在未来的版本中,tf.contrib.layers.xavier_initialier的初始化方式可能会消失。

© www.soinside.com 2019 - 2024. All rights reserved.