2017-02-21 60 views
0

我想传递一个布尔值,它可以在我评估图形时改变。如下图所示张量流程:在创建和评估图形时传递bool变量

import tensorflow as tf 
from tensorflow.python.ops import control_flow_ops 

def my_model(input, is_freeze): 
     trainable = tf.cond(is_freeze, lambda: tf.constant(False), 
          lambda: tf.constant(True)) #Try 3 
     #trainable = tf.cond(is_freeze, lambda: False, lambda: True) # Try 1 
     #trainable = tf.logical_not(is_freeze) # Try 2 
     fc1_W = tf.get_variable('fc1_W', trainable = trainable, 
           initializer = tf.zeros(100, 2)) 
     fc1 = tf.matmul(input, fc1_W) 
     return fc1 

tf.reset_default_graph() 
X = tf.placeholder(tf.float32)  
is_freeze = tf.placeholder(tf.bool) 
my_model_graph = my_model(X, is_freeze) # Getting error while creating model 

with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 
     sess.run(my_optimizer, feed_dict = {is_freeze: False, X: np.zeros((50, 100))}) 

我收到的错误:对于#Try1

AttributeError: 'bool' object has no attribute 'name' 

对于#Try3:我张贴我下面的代码

TypeError: Using a tf.Tensor as a Python bool is not allowed. 
Use if t is not None: instead of if t: to test if a tensor is defined, 
and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on 
the value of a tensor.` 

请能有人给我解释一下我应该如何克服这个问题。如果可能的话,任何人都可以告诉我在我所有的方法中哪里出了问题。

基本上我在做什么是我有两个模型。首先,我训练一个模型,然后使用第一个模型的学习值,我必须训练第二个模型冻结第一个模型的值。

在此先感谢。

+0

您可以通过将所有节点绘制到图中来实现它,但只返回一部分结果来通过正确的路径只运行图的一部分? – lerner

回答

1

你不能只用TrueFalse内部“图” - 你需要从python通过他们tensorflow,做到这一点的一种方式是tf.constant()。你可以试试

def my_model(input, is_freeze): 
    trainable = tf.cond(is_freeze, lambda: tf.constant(False), lambda: tf.constant(True)) 

否则对我来说很好看!如果您需要更详细的帮助,请提供一个最简单的工作示例!

+0

我试过你的方法。但它不起作用。我现在提供了完整的代码。请你检查一下。 – user1190882

+0

另外,在示例中显示的库似乎没有名为'condtf'的库。请你检查一下。 – user1190882

+0

请你可以建议如何克服这个问题呢? – user1190882

0

似乎你试图将推理/逻辑中的开关嵌入到张量流图中。不建议这样做。查看新的Estimator界面,了解如何实现干净利落的目标。

+0

我已经提供了完整的代码。我还应该使用'Estimator'吗?我会研究它们,但在此期间,你能否给我一个与我的例子有关的小代码样本。这将是非常有益的。 – user1190882