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

时间:2017-12-27 05:13:59

标签: python tensorflow machine-learning deep-learning initializer

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

xavier_initializer位于tf.contrib.layersglorot_uniform_initializer中的tfcontrib的命名空间最终是否会消失,contrib中的内容会移动到tf的命名空间吗?

2 个答案:

答案 0 :(得分: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初始化方式可能会消失。

答案 1 :(得分: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是非常稳定的,尽管它已经迁移到" native" tf。另一方面,Datasets合并并非如此干净(contrib在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)。类似的是,是的,但一眼就看出了本土的#34; tf版本为我们提供了一些不同的错误消息和一些更好的输入验证。

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

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

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