xavier_initializer 和 xavier_initializer_conv2d 有什么区别?

What is the difference between xavier_initializer and xavier_initializer_conv2d?

我注意到 TensorFlow 1.0 在 contrib 中包含两个 Xavier 初始化助手,

两者 link 到同一文档页面并具有相同的签名:

tf.contrib.layers.xavier_initializer(uniform=True, seed=None, dtype=tf.float32)
tf.contrib.layers.xavier_initializer_conv2d(uniform=True, seed=None, dtype=tf.float32)

但是根本没有解释它们之间的区别。我可以根据名称猜到 _conv2d 版本应该用于 2D 卷积层,但是如果使用常规版本是否会产生明显的影响?

其实没有区别。因为这两个函数都实现了权重初始化:

Xavier Glorot and Yoshua Bengio (2010): Understanding the difficulty of training deep feedforward neural networks. International conference on artificial intelligence and statistics.

这两个初始化器都旨在使所有层中的梯度比例大致相同。在均匀分布中,这最终是范围:x = sqrt(6. / (in + out)); [-x, x],对于正态分布,使用 sqrt(3. / (in + out)) 的标准偏差。