tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'x_1' with dtype float and shape [?,227,227,3]


記一次超級蠢超級折磨我的bug。

報錯內容:

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'x_1' with dtype float and shape [?,227,227,3]
[[Node: x_1 = Placeholder[dtype=DT_FLOAT, shape=[?,227,227,3], _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
[[Node: fc3/_33 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_110_fc3", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

錯誤理解起來很簡單,沒有給placeholder ‘x_1’賦值。

這是我的預測代碼:

image = Image.open(imagefile)
image = image.resize([227, 227])
image_array = np.array(image)
image_array = image_array.astype(float)
image = np.reshape(image_array, [1, 227, 227, 3])
saver = tf.train.import_meta_graph("/home/ubuntu/demo/package/5.8_2000op_256batch/AlexNetModel.ckpt.meta")
graph = tf.get_default_graph()
prediction = graph.get_tensor_by_name("fc3:0")
x = graph.get_tensor_by_name("x:0")
with tf.Session() as sess:
  saver.restore(sess, "/home/ubuntu/demo/package/5.8_2000op_256batch/AlexNetModel.ckpt")
  Predict = sess.run(prediction, feed_dict={x: image})
  max_index = np.argmax(Predict)
  if max_index==0:
    return "cat"
  else:
    return "dog"

之前是覺得image格式有問題,不能作為輸入給x。

因為最初始,源碼是這樣寫的:

image = Image.open(imagefile)
image = image.resize([227, 227])
image_array = np.array(image)

image = tf.cast(image_array,tf.float32)
image = tf.image.per_image_standardization(image)
image = tf.reshape(image, [1, 227, 227, 3])

而使用tf的方法,返回值是一個tensor,而tensor是無法賦值給placeholder定義的數據類型。

  • sess.run()第一個參數是要fetch的變量,這個變量的類型只能是tensor或者string, 后面如果要加feed_dict = {}, 注意feed的數據類型可以是Python scalars, strings, lists, numpy ndarrays, or TensorHandles,不能是tensor.fecth得到的變量是<type 'numpy.ndarray'>。一句話就是,在運行圖的時,tensor用sess.run()取出來,然后再feed進去。

所以就把image的形狀變化,tf.reshape()改為了np.reshape(),但是還有問題,報錯為上面的You must feed a value for placeholder tensor 'x_1' with dtype float and shape [?,227,227,3].......

完了徹底把我整懵逼了,不知道應該給x什么樣的輸入了,但是又好奇怪,placeholder tensor 'x_1'那里來的,沒有定義過 'x_1'這種東西呀。貼一下訓練代碼,placeholder的申請。

x = tf.placeholder(tf.float32, [None, 227, 227, 3],name='x')
y = tf.placeholder(tf.float32, [None, n_classes])

感覺沒問題啊,挺好的啊。如果代碼真的是這樣確實沒啥問題挺好的,關鍵是自己腦殘,x = tf.placeholder(tf.float32, [None, 227, 227, 3],name='x')申請了兩遍

 

刪掉一個。OK了。很煩,困擾了自己好幾天


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM