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

Python 为什么“xavier_initializer()”和“glorot_uniform_initializer()”在某种程度上是重复的?,python,tensorflow,machine-learning,deep-learning,initializer,Python,Tensorflow,Machine Learning,Deep Learning,Initializer,xavier\u初始值设定项(uniform=True,seed=None,dtype=tf.float32)和glorot\u uniform\u初始值设定项(seed=None,dtype=tf.float32)指的是同一个人xavier glorot。为什么不把它们合并成一个功能呢 xavier_初始值设定项位于tf.contrib.layers中glorot\u uniform\u初始值设定项。contrib的名称空间最终会消失吗,contrib中的东西会被移动到tf的名称空间吗?是的,

xavier\u初始值设定项(uniform=True,seed=None,dtype=tf.float32)
glorot\u uniform\u初始值设定项(seed=None,dtype=tf.float32)
指的是同一个人xavier glorot。为什么不把它们合并成一个功能呢


xavier_初始值设定项
位于
tf.contrib.layers
中<在
tf
中的code>glorot\u uniform\u初始值设定项。
contrib
的名称空间最终会消失吗,
contrib
中的东西会被移动到
tf
的名称空间吗?

是的,
tf.contrib.layers.xavier_初始值设定项
tf.glorot_uniform_初始值设定项
都实现了本文中描述的相同概念,可以在代码中看到:

对于
fan_-in
fan_-out
mode=fan_-AVG
uniform=True
的典型值,这两种实现都从超过限制的标准均匀分布中采样值[
-sqrt(3),sqrt(3)

由于支持各种各样的初始化策略,因此很可能会保留下来,而contrib的初始化(只有
xavier_初始化
)在未来的版本中很可能会被弃用


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

有趣的问题!我将从
tf.contrib
开始:

contrib
的名称空间会消失吗?只有在不再有不稳定的社区贡献添加到TensorFlow时才会消失-所以永远不会。可能会引起兴趣。我将总结一下。
contrib
命名空间用于社区支持的用户贡献的代码(不是TensorFlow)contrib中的代码在API中非常有用,可能最终会被合并。但是,在TensorFlow团队对其进行彻底测试之前,它将保留在contrib中。我相信文档用来解释contrib存在的原因,但我再也找不到它了。最接近的是,它解释了contrib的存在ng>
contrib
函数/类可能会更改!

更深入一点,
contrib
中的内容通常最终会合并到
tf
中。例如,
Keras
的整体在1.4中从
contrib
合并到
tf.Keras
。但是,合并的确切过程有所不同。例如,比较
tf.contrib.rnn
tf中的rnn功能。nn
。相当多的
tf.nn
别名
tf.contrib.rnn
。我的意思是,单击上的任何内容。您将看到
tf.rnn.contrib
文档!试试看!使用
tf.contrib.rnn
似乎非常稳定,尽管它已迁移到“本机”中
tf
。另一方面,
数据集
合并不是很干净(
contrib
”在1.3中被合并,在1.4中被合并)。因为在合并过程中更改了一些(非常少的)代码位,所以使用
tf.contrib.data.TFRecordDataset
会给您一个很好的折旧警告。而且,有些东西已经在
contrib
中很长一段时间了,很快就没有合并的迹象:我想起来了。我相信
contrib.keras
已经存在了一段时间合并前,请先删除

现在请看Xavier/Glorot:

以下是和的源代码链接。源代码看起来(几乎)相同,但让我们遵循
variance\u scaling\u initializer
。现在情况有所不同:
xavier
拥有和
glorot
使用(
VarianceScaling
别名为
variance\u scaling\u initializer
)。同样,是的,但一看就知道了“native”
tf
version为我们提供了一些不同的错误消息和一些更好的输入验证

那么为什么不删除
contrib.xavier
?我不知道。如果我不得不猜测,那是因为
contrib.xavier
开始流行。我的意思是,我仍然使用它,而且我仍然一直看到它(需要引用?).现在我知道
glorot
基本上是一样的,我不确定我是否会继续使用
contrib.xavier
。但我离题了。我怀疑
xavier
留下来是因为删除它会破坏合理数量的代码。当然,contrib没有稳定性保证,但为什么要修复(或破坏)什么东西没坏

在Github上发布一个问题或请求可以从实际贡献者那里得到一些更有趣的响应。我想你会得到它没有被删除或不会被删除的原因,但可能不会。我快速搜索问题中的“xavier”和“glorot”表明以前没有人问过它


编辑:很清楚,正如卡马里奥所指出的,它们在数学上是相同的。我要指出的是,现在的实现在输入验证和结构方面略有不同。他似乎认为xavier比我最初想象的更可能贬值。我很乐意听从他的意见,因为他可能比我想象的要大我比我有经验。

伟大的回答。谢谢。为了子孙后代的利益,请考虑接受任何对你最有帮助的回答。