python - 如何在 Tensorflow 中生成静态随机常数?
问题描述
我想在 Tensorflow 中生成一个常量张量,它将使用指定的机制进行初始化,例如 random_uniform、random_normal。
我知道我可以根据这些机制生成一个随机的numpy数组,比如random_uniform、random_normal等;然后我们将生成的 numpy 数组作为 tf.constant 中的值参数提供。
但是,问题是我们在使用 numpy 版本的随机机制时必须给出一个形状。但是,我不想预先指定形状,我希望形状是有弹性的,就像我们写 Tensorflow 代码一样shape = tf.shape(some_previous_tensor)
Way1我试过:在图构建阶段没有必要预先指定常数的具体形状。然而,生成的张量是随机的而不是静态的。这不是我所期望的。
var = tf.random.normal(
[2,2], mean=0.0, stddev=0.5, dtype=tf.float32,
)
with tf.Session() as sess:
print('var:', sess.run(var))
print('var:', sess.run(var))
Output:
var: [[ 0.21260215 0.13721827]
[ 0.7704196 -0.48304045]]
var: [[-0.63397115 -0.0956466 ]
[ 0.0761982 0.54037064]]
Way2 我试过:我可以得到静态常量,但是必须在 np.random.normal 中给出一个大小,这不是我所期望的。
var_np = np.random.normal(0,0.5, size=(2,2))
var = tf.constant(value=var_np)
with tf.Session() as sess:
print('var:', sess.run(var))
print('var:', sess.run(var))
Output:
var: [[-0.73357953 -0.10277695]
[ 0.57406473 0.32157612]]
var: [[-0.73357953 -0.10277695]
[ 0.57406473 0.32157612]]
解决方案
您可以将tf.Variable
/tf.get_variable
与trainable=False
和一起使用validate_shape=False
。您可以使用取决于形状占位符的值作为初始值。然后,当您初始化变量时(使用initializer
属性或更常见的东西,如tf.global_variables_initializer
),您只需要给出初始化的形状。初始化后,变量的值将在整个会话中保持不变,只要它没有再次初始化或分配不同的值。
import tensorflow as tf
shape = tf.placeholder(tf.int32, [None])
var_init = tf.random.normal(
shape, mean=0.0, stddev=0.5, dtype=tf.float32,
)
var = tf.Variable(var_init, validate_shape=False, trainable=False, name='Var')
with tf.Session() as sess:
tf.random.set_random_seed(0)
sess.run(var.initializer, feed_dict={shape: [2, 3]})
print('var:', sess.run(var), sep='\n')
print('var:', sess.run(var), sep='\n')
输出:
var:
[[-0.4055751 0.7597851 -0.04810145]
[ 0.92776746 -0.3747548 -0.03715562]]
var:
[[-0.4055751 0.7597851 -0.04810145]
[ 0.92776746 -0.3747548 -0.03715562]]
推荐阅读
- android - 如何在 Android 的 MVVM 架构中将动作从 View 发送到 ViewModel
- javascript - 在 componentDidUpdate() 中测试元素的变化
- python - 当它们在 Pandas 中共享索引时,将列从一个数据帧复制到另一个数据帧
- scrapy - 抓取项目元数据?
- pandas - Pandas 中是否有从特定日期开始按月分组的方法?
- javascript - 星级 如果单击星号,如何启用前一个星号也被单击
- excel - SetWindowsHookEx - WM_LBUTTONDOWN 触发两次 WH_MOUSE 回调
- node.js - Sequelize - 如何提取具有 1 个关联记录的记录并按关联记录属性排序
- javascript - 有没有办法以编程方式在浏览器选项卡之间进行更改?
- ms-word - Word-AddIn (VSTO) 未从本地 OneDrive 文件夹获取文件路径