我的神经网络有一个自定义层,它接受输入向量x
,生成正态分布张量A
并返回A
(在后续层中使用)和产品Ax
。假设我想在第二个不同的层中重用自定义层输出处 A
中存储的值,在确定哪个 Keras 后端函数时,我是否需要考虑任何微妙的方面(K.backend.random_normal
或 K.backend.random_normal_variable
)我应该使用它来生成 A
?
a) 后端函数random_normal
返回一个张量,在每次调用后存储不同的值(请参阅下面的代码片段)。对我来说,这表明 random_normal 充当正态分布值的生成器。这是否意味着如果想在调用后保持其值,则不应使用 random_normal 来生成正态分布张量?
b) 后端函数 random_normal_variable
看起来更安全(请参阅下面的代码片段),因为它在调用之间保留值。
我的概念理解正确吗?或者我错过了一些基本的东西? 我正在使用 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)
最佳答案
据我了解,这是由于 random_normal_variable
返回实例化的Variable
而random_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>
至于 Tensor
的值为何不同而不是Variable
,我想这个的答案thread总结得很好:
Variable
is basically a wrapper onTensor
that maintains state across multiple calls to run [...]
答案还提到需要初始化变量才能对其进行评估,正如您所注意到的,这里就是这种情况(因为您没有初始化变量来评估它)。事实上,由于调用 tensorflow.random_normal_initializer
,返回的变量已经初始化。 random_normal_variable
内功能。希望这能澄清为什么您的代码有这种行为。
关于tensorflow - Keras后端: Difference between random_normal and random_normal_variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49527397/