我的神经网络有一个自定义图层,它采用输入向量x
,生成正态分布的张量A
并返回A
(在后续图层中使用)和产品{ {1}}。假设我想在自定义层的输出处重用存储在Ax
中的值,在第二个不同的层中,在确定哪个Keras后端函数时需要考虑任何微妙的方面(A
或K.backend.random_normal
)我应该使用以生成K.backend.random_normal_variable
?
a)后端函数A
返回一个张量,在每次调用后存储一个不同的值(参见下面的代码片段)。对我而言,这表明random_normal
充当正态分布值的生成器。这是否意味着如果他们想要在调用后保持其值,则不应使用random_normal
来生成正态分布的张量?
b)后端功能random_normal
看起来更安全(请参阅下面的代码段),因为它可以跨越调用保留值。
我的概念理解是否正确?还是我错过了一些基本的东西? 我使用的是Keras 2.1.2和Tensorflow 1.4.0。
尝试使用random_normal_variable
(调用值更改):
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
答案 0 :(得分:1)
根据我的理解,这是因为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
基本上是Tensor
上的一个包装器,它在多个调用中维护状态以运行[...]
答案还提到需要对变量进行初始化以对其进行评估,这就是你注意到的情况(因为你没有初始化变量来评估它)。事实上,由于在tensorflow.random_normal_initializer
函数中调用random_normal_variable
,已经初始化了返回的变量。希望这能澄清您的代码为何会出现这种行为。