比较与tf.keras.initializers.VarianceScaling的功能差异

tf.keras.initializers.VarianceScaling

tf.keras.initializers.VarianceScaling(
    scale=1.0, mode='fan_in', distribution='truncated_normal',
    seed=None
)

更多内容详见tf.keras.initializers.VarianceScaling

mindspore.common.initializer.XavierUniform

mindspore.common.initializer.XavierUniform(gain=1)

更多内容详见mindspore.common.initializer.XavierUniform

使用方式

Xavier初始化方法主要思想是,为使得网络中信息更好的流动,每一层输出的方差应该尽量相等,基于此,经过部分数学公式推导,Xavier均匀分布服从U(−bound, bound),boud的计算方式为gain * sqrt ( 6 / (fan_in+fan_out)),其中gain通常根据激活函数决定,fan_in和fan_out分别代表输入单元个数和输出单元个数。

  • MindSpore:实现方式与上述计算方式相同,其中gain值通过函数入参传入,默认值为1.0。

  • TensorFlow:主要有三个入参需要注意:

    distribution:可设置为”truncated_normal”、”untruncated_normal”、”uniform”,代表生成的数据分布;

    mode:可设置为”fan_in”、”fan_out”、”fan_avg”,分别表示分母的取值为fan_in、fan_out、(fan_in + fan_out) / 2;

    scale:为公式中的gain,默认值:1.0。

    当入参配置为distribution=”uniform”,mode=”fan_avg”时,生成数据的方式与mindspore.common.initializer.XavierUniform相同。

代码示例

以下代码结果具有随机性。

import tensorflow as tf

init = tf.keras.initializers.VarianceScaling(mode="fan_avg", distribution="uniform")
x = init(shape=(1, 2))

with tf.Session() as sess:
    print(x.eval())

# Out:
# [[-1.1756071   0.11235881]]
import mindspore as ms
from mindspore.common.initializer import XavierUniform, initializer

x = initializer(XavierUniform(), shape=[1, 2], dtype=ms.float32)
print(x)

# out:
# [[-0.86959594  1.2498646 ]]