Tensorflow tf.cond遇到错误:TypeError:无法将<class'function'=“”>类型的对象转换为Tensor

时间:2018-03-14 02:09:45

标签: python tensorflow

下面是一个最小的测试用例,其中我创建了一个变量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。

2 个答案:

答案 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}}