Keras后端:random_normal和random_normal_variable

时间:2018-03-28 06:18:32

标签: tensorflow keras keras-layer

我的神经网络有一个自定义图层,它采用输入向量x,生成正态分布的张量A并返回A(在后续图层中使用)和产品{ {1}}。假设我想在自定义层的输出处重用存储在Ax中的值,在第二个不同的层中,在确定哪个Keras后端函数时需要考虑任何微妙的方面(AK.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

1 个答案:

答案 0 :(得分: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> 

至于为什么Tensor而不是Variable的值有所不同,我认为这个thread的答案总结得很好:

  

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

答案还提到需要对变量进行初始化以对其进行评估,这就是你注意到的情况(因为你没有初始化变量来评估它)。事实上,由于在tensorflow.random_normal_initializer函数中调用random_normal_variable,已经初始化了返回的变量。希望这能澄清您的代码为何会出现这种行为。