【问题标题】:What is the numpy equivalent of TensorFlow Xavier initializer for CNN?用于 CNN 的 TensorFlow Xavier 初始化程序的 numpy 等效项是什么?
【发布时间】:2020-09-26 15:38:56
【问题描述】:

我想在 NumPy 中重新创建 Xavier 初始化(使用基本函数),就像 TensorFlow2 为 CNN 所做的那样。 以下是我学习在 NumPy 中进行 Xavier 初始化的方法:

# weights.shape = (2,2)
np.random.seed(0)
nodes_in = 2*2
weights = np.random.rand(2,2) * np.sqrt(1/nodes_in)

>>>array([[0.27440675, 0.35759468],
          [0.30138169, 0.27244159]])

这是我为逻辑回归模型学习 Xavier 初始化的方式。看来卷积神经网络应该是不同的,但我不知道如何。

initializer = tf.initializers.GlorotUniform(seed=0)
tf.Variable(initializer(shape=[2,2],dtype=tf.float32))

>>><tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
   array([[-0.7078647 ,  0.50461936],
          [ 0.73500216,  0.6633029 ]], dtype=float32)>

当 TensorFlow documentation 解释“fan_in”和“fan_out”时,我感到很困惑。我猜这就是问题所在。有人可以帮我把它弄糊涂吗?

非常感谢!

[更新]:

当我遵循tf.keras.initializers.GlorotUniform 文档时,我仍然没有得到相同的结果:

# weights.shape = (2,2)
np.random.seed(0)
fan_in = 2*2
fan_out = 2*2
limit = np.sqrt(6/(fan_in + fan_out))
np.random.uniform(-limit,limit,size=(2,2))
>>>array([[0.08454747, 0.37271892],
          [0.17799139, 0.07773995]])

【问题讨论】:

    标签: python-3.x tensorflow2.0 tf.keras conv-neural-network tensorflow2.x


    【解决方案1】:

    使用张量流

    initializer = tf.initializers.GlorotUniform(seed=0)
    tf.Variable(initializer(shape=[2,2],dtype=tf.float32))
    <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32, numpy=
    array([[-0.7078647 ,  0.50461936],
           [ 0.73500216,  0.6633029 ]], dtype=float32)>
    

    Numpy 中的相同逻辑

    import math
    np.random.seed(0)
    scale = 1/max(1., (2+2)/2.)
    limit = math.sqrt(3.0 * scale)
    weights = np.random.uniform(-limit, limit, size=(2,2))
    print(weights)
    array([[0.11956818, 0.52710415],
           [0.25171784, 0.1099409 ]])
    

    如果你观察,上面两个是不一样的,因为随机数生成器。内部 tensorflow 使用如下无状态随机生成器,如果您观察,我们会得到相同的输出。

    tf.random.stateless_uniform(shape=(2,2),seed=[0, 0], minval=-limit, maxval=limit)
    <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
    array([[-0.7078647 ,  0.50461936],
           [ 0.73500216,  0.6633029 ]], dtype=float32)>
    

    如果需要了解更多内部实现,可以查看https://github.com/tensorflow/tensorflow/blob/2b96f3662bd776e277f86997659e61046b56c315/tensorflow/python/ops/init_ops_v2.py#L525

    【讨论】:

    • 感谢您的回答。您能否澄清一下您的limit(和scale)计算背后的直觉?
    • Limit = sqrt(6/fanin + fanout) if fanin+fanout/2 >1 else, sqrt(3)
    • 感谢您重新编写我正在尝试弄清楚的内容。如果您重新阅读我的问题,这正是我想要理解的。不幸的是,重新阅读这个表达式并没有让我更清楚 =(.
    • 我只是想指出,我会将您的答案标记为有效,因为您确实回答了这个问题。但实际上,我希望对limit 的计算有更深入的回答。因为那是我还不明白的。但是对于它的价值,谢谢你帮助我。
    • Jek,我在给定链接中找到的详细信息“从 [-limit, limit] 内的均匀分布中抽取样本,其中limitsqrt(6 / (fan_in + fan_out)),其中fan_in 是输入单元的数量在权重张量中,fan_out 是权重张量中的输出单元数。"这可能会帮助您澄清事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2022-01-01
    • 1970-01-01
    • 2016-12-24
    • 2016-06-04
    • 2018-12-11
    相关资源
    最近更新 更多