下面是一个最小的测试用例,其中我创建了一个变量v
,我想将其初始化为777(对于简化的测试用例)。
注意:我无法使用普通的初始化程序初始化v
,因为它取决于所有变量计算的规范化常量(其中一些变量尚未在{{1}时创建}已创建)。
我的解决方案(下面)是创建一个布尔变量v
,一旦我运行了一些初始化/分配OP并使用full_init_cond
来确保它们只运行一次。
tf.cond
我在import tensorflow as tf
v = tf.Variable(0, trainable=False)
full_init_cond = tf.Variable(False, trainable=False, dtype=tf.bool)
with tf.control_dependencies([v]):
tf.cond(
full_init_cond,
true_fn=lambda: [tf.no_op],
false_fn=lambda: [tf.assign(v, 777), tf.assign(full_init_cond, True)]
)
行收到以下错误:
tf.cond
我没有太多意识到这个错误。
更新
令我惊讶的是,这个简单的测试似乎产生了一个有效的张量:
TypeError: Failed to convert object of type <class 'function'> to Tensor. Contents: <function no_op at 0x7f39abf51400>. Consider casting elements to a supported type.
认为这个失败了:
tf.cond(full_init_cond, tf.no_op, tf.no_op)
我的困惑继续...... 顺便提一下Tensorflow版本1.5。
答案 0 :(得分:1)
lambda: tf.no_op
不起作用,因为您传递的是一个返回函数的函数。
tf.group
是必需的,以便结构在列表和no_op返回之间匹配。
以下代码段在tf 1.11中运行
import tensorflow as tf
v = tf.Variable(0, trainable=False)
full_init_cond = tf.Variable(False, trainable=False, dtype=tf.bool)
with tf.control_dependencies([v]):
tf.cond(
full_init_cond,
true_fn=tf.no_op,
false_fn=lambda: tf.group([tf.assign(v, 777), tf.assign(full_init_cond, True)])
)
答案 1 :(得分:0)
事实证明它不喜欢tf.no_op
声明。
tf.cond
要求您为true | false条件返回相同数量和类型的操作。因此,我使用tf.no_op
操作替换了tf.identity
,而不是import tensorflow as tf
v = tf.Variable(0, trainable=False)
full_init_cond = tf.Variable(False, trainable=False, dtype=tf.bool)
with tf.control_dependencies([v]):
x = tf.cond(
full_init_cond,
true_fn=lambda: [tf.identity(v), tf.identity(full_init_cond)],
false_fn=lambda: [tf.assign(v, 777), tf.assign(full_init_cond, True)]
)
print(x)
作为no_op的适当替代:
{{1}}