tensorflow - Keras后端: Difference between random_normal and random_normal_variable

标签 tensorflow keras keras-layer

我的神经网络有一个自定义层,它接受输入向量x,生成正态分布张量A并返回A(在后续层中使用)和产品Ax。假设我想在第二个不同的层中重用自定义层输出处 A 中存储的值,在确定哪个 Keras 后端函数时,我是否需要考虑任何微妙的方面(K.backend.random_normalK.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返回实例化的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 is basically a wrapper on Tensor 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/

相关文章:

python - 具有不同形状的 Tensorflow 元组

python - 来自 keras : "Update your Conv2D call to the Keras 2 API" 的警告

python - 使用SMOTE和ADASYN平衡图像数据集

python - 无法将层添加到已保存的 Keras 模型。 'Model' 对象没有属性 'add'

python - Dataset.map() 中的 Tensorflow 解析和 reshape 浮点列表

python - 使用 Tensorflow 后端的 CTC Beam 搜索

tensorflow - 无法通过 pip3 安装 TensorFlow

python - keras 2.2.4 中的 imagenet_utils.preprocess_input 方法是否有错误,或者只是我一个人?

neural-network - Keras 密集层错误 : TypeError: 'int' object is not callable

tensorflow - 无法使用 RectifiedAdam 优化器加载 Keras 模型