Skip to main content
 首页 » 编程设计

python之Tensorflow:feed_dict 占位符是 Operation 而不是 Tensor

2024年12月31日23EasonJim

我有一个在 python 类中创建的图表。初始化程序使我能够创建新图或加载现有图。

如果我通过创建来初始化,我会创建一个输入占位符:

self.input = tf.placeholder("float", [None, self.input_size], name="x" 

然后我可以保存我的图表:

tf.saved_model.simple_save( 
        self.sess, path, inputs={"x": self.input}, outputs={"encoded": self.encoded    

如果我从加载初始化,我首先加载图形

tf.saved_model.loader.load( 
        self.sess, [tf.saved_model.tag_constants.SERVING], path 
    ) 

然后在类中设置我的输入输出名称

self.input = self.sess.graph.get_operation_by_name("x") 
self.encoded = self.sess.graph.get_operation_by_name("encoded") 

但是,当我尝试使用加载的图表时,出现错误:

def encode(self, X): 
    return self.sess.run(self.encoded,  
                         feed_dict={self.input: X}) 
 
 
==> TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a Operation into a Tensor. 

我的 feed_dict self.input 被解释为一个操作,而不是一个张量。请注意,我无法将“x”作为张量加载 - 如果我尝试 self.input = self.sess.graph.get_tensor_by_name("x"),我会收到一个错误,报告“x "是操作的名称,而不是张量。

但是,如果我检查 self.input,它被报告为占位符:

name: "x" 
op: "Placeholder" 
attr { 
  key: "dtype" 
  value { 
    type: DT_FLOAT 
  } 
} 
attr { 
  key: "shape" 
  value { 
    shape { 
      dim { 
        size: -1 
      } 
      dim { 
        size: 81 
      } 
    } 
  } 
} 

我做错了什么?

请您参考如下方法:

您正在指定一个完整的操作,但由于操作可以有多个输出,您必须准确地告诉您想要哪个输出。试试这个:

def encode(self, X): 
    return self.sess.run(self.encoded,  
                         feed_dict={self.input.outputs[0]: X}) 

或者,您可以:

self.input = self.sess.graph.get_tensor_by_name("x:0")