Python Tensorflow tf.cond遇到错误:TypeError:无法转换类型为<;的对象;类别';功能'&燃气轮机;到张量

Python Tensorflow tf.cond遇到错误:TypeError:无法转换类型为<;的对象;类别';功能'&燃气轮机;到张量,python,tensorflow,Python,Tensorflow,下面是一个最小的测试用例,我在其中创建了一个变量v,我想将其初始化为777(对于简化的测试用例) 注意:我不能用普通的初始值设定项初始化v,因为它依赖于跨所有变量计算的标准化常数(其中一些变量在创建v时尚未创建) 我的解决方案(如下)是创建一个布尔变量full_init_cond,一旦我运行了一次初始化/分配操作,我就会将该变量设置为True,并使用tf.cond确保它们只运行一次 import tensorflow as tf v = tf.Variable(0, trainable=Fal

下面是一个最小的测试用例,我在其中创建了一个变量
v
,我想将其初始化为777(对于简化的测试用例)

注意:我不能用普通的初始值设定项初始化
v
,因为它依赖于跨所有变量计算的标准化常数(其中一些变量在创建
v
时尚未创建)

我的解决方案(如下)是创建一个布尔变量
full_init_cond
,一旦我运行了一次初始化/分配操作,我就会将该变量设置为True,并使用
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, lambda: tf.no_op, lambda: tf.no_op)
我的困惑还在继续。。。
顺便说一句,Tensorflow 1.5版。

结果是它不喜欢
tf.no_op
语句

tf.cond
要求返回相同数量和类型的操作,无论是true还是false条件。因此,我用
tf.identity
操作代替了
tf.no_op
操作,作为no_op的适当替代:

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)

lambda:tf.no_op
不起作用,因为您正在传递一个返回函数的函数

tf.group
是必需的,以便结构在列表和no_-op返回之间匹配

下面的代码段在TF1.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)])
  )
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)])
  )