記一次超級蠢超級折磨我的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了。很煩,困擾了自己好幾天
