【问题标题】:Keras Backend: Difference between random_normal and random_normal_variableKeras 后端:random_normal 和 random_normal_variable 之间的区别
【发布时间】:2018-03-28 06:18:31
【问题描述】:

我的神经网络有一个自定义层,它接受输入向量x,生成正态分布张量A,并返回A(用于后续层)和乘积Ax。假设我想在自定义层的输出处重用存储在 A 中的值,在第二个不同的层中,在确定哪个 Keras 后端函数(K.backend.random_normalK.backend.random_normal_variable ) 我应该使用它来生成A?

a) 后端函数random_normal 在每次调用后返回一个存储不同值的张量(参见下面的代码 sn-p)。对我来说,这表明random_normal 充当正态分布值的生成器。这是否意味着如果想在调用后保持其值,则不应使用random_normal 生成正态分布的张量?

b) 后端函数random_normal_variable 看起来更安全(参见下面的代码 sn-p),因为它在调用之间保留值。

我的概念理解正确吗?还是我错过了一些基本的东西? 我正在使用 Keras 2.1.2 和 Tensorflow 1.4.0。

random_normal 进行实验(值随调用而变化):

In [5]: A = K.random_normal(shape = (2,2), mean=0.0, stddev=0.5) 
In [6]: K.get_value(A)
Out[6]: array([[ 0.4459489 , -0.82019573],
   [-0.39853573, -0.33919844]], dtype=float32)
In [7]: K.get_value(A)
Out[7]: array([[-0.37467018,  0.42445764],
   [-0.573843  , -0.3468301 ]], dtype=float32)

random_normal_variable 进行实验(值在调用期间保持不变):

In [9]: B = K.random_normal_variable(shape=(2,2), mean=0., scale=0.5)
In [10]: K.get_value(B)
Out[10]: array([[ 0.07700552,  0.28008622],
   [-0.69484973, -1.32078779]], dtype=float32)
In [11]: K.get_value(B)
Out[11]: array([[ 0.07700552,  0.28008622],
   [-0.69484973, -1.32078779]], dtype=float32)

【问题讨论】:

    标签: tensorflow keras keras-layer


    【解决方案1】:

    据我了解,这是因为random_normal_variable 返回一个实例化的Variablerandom_normal 返回一个Tensor

    K.random_normal(shape=(2,2), mean=0.0, stddev=0.5) 
    <tf.Tensor 'random_normal:0' shape=(2, 2) dtype=float32>
    
    K.random_normal_variable(shape=(2,2), mean=0.0, scale=0.5)
    <tf.Variable 'Variable:0' shape=(2, 2) dtype=float32_ref> 
    

    至于为什么TensorVariable 的值不同,我认为thread 的答案总结得很好:

    Variable 基本上是Tensor 上的一个包装器,它在多个运行调用中保持状态[...]

    答案还提到需要初始化变量以对其进行评估,正如您所注意到的那样(因为您没有初始化变量来评估它)。事实上,由于在random_normal_variable 函数中调用了tensorflow.random_normal_initializer,返回的变量已经被初始化。希望这能阐明为什么您的代码有这种行为。

    【讨论】:

    • 感谢您的回复。我也在考虑类似的思路,很高兴看到我们的理解是相似的。
    猜你喜欢
    • 2017-11-12
    • 2022-01-27
    • 2023-03-08
    • 2018-01-18
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多