tf.train.shuffle_batch()ValueError:无法推断Tensor的等级:Tensor(“PyFunc:0”,dtype = uint8)

时间:2017-07-07 18:19:31

标签: tensorflow

我正在尝试将我的TFRecord文件中的图像数据提供给tf.train.shuffle_batch()。我有load_img_file()函数读取TFRecord文件,进行预处理,并以[[图像数组,np.uint8格式],[数组]格式返回图像和单热标签标签,np.uint8格式]]。我做了op

load_img_file_op = tf.py_func(self.load_img_file, [], [np.uint8, np.uint8])

将该函数转换为op。我已经通过

验证了该操作
data = tf.Session().run(load_img_file_op)
for n in range(50): #go through images
    print data[1][n] #print one-hot label
    self.image_set.display_img(data[0][n]) #display image

成功打印单热标签并显示相应的图像。

然而,当我尝试做类似

的事情时
self.batch = tf.train.shuffle_batch(load_img_file_op, batch_size=self.batch_size, capacity=q_capacity, min_after_dequeue=10000)

我收到错误

  

提高ValueError(“无法推断Tensor的排名:%s”%tl [i])   ValueError:无法推断Tensor的排名:Tensor(“PyFunc:0”,dtype = uint8)“

我尝试过多种变体来尝试匹配指南的作用:

  • 而不是self.batch =,我尝试过example_batch,label_batch =(尝试获取两个值而不是一个)
  • enqueue_many设置为True
  • 拥有load_image_file()功能,load_img_file_op返回两个不同的值:imageslabels。然后像tf.train.shuffle_batch([images, labels],...)
  • 一样输入它们
  • 一次只返回/输入一张图片和标签tf.train.shuffle_batch()
  • 使用tf.train.shuffle_batch_join()

似乎没什么用,但我觉得我正在遵循guide的格式以及我见过的各种其他教程。我究竟做错了什么?如果我的错误是愚蠢或微不足道,我道歉(搜索此错误似乎没有返回任何与我相关的内容)。感谢您的帮助和时间!

1 个答案:

答案 0 :(得分:3)

评论中的

The link帮了很多忙;谢谢! (答案是你在使用py_func时必须给出形状。)因为我必须更多地了解一下,我将发布完整的解决方案:

我必须让我的函数返回两个不同的值,以便它们可以是两个不同的张量并且可以单独成形:

return images, labels

然后,按照上面的问题进行,但是整形:

load_img_file_op = tf.py_func(self.load_img_file, [], [np.uint8, np.uint8]) # turn the function into an op
images, labels = load_img_file_op
images.set_shape([imgs_per_file, height * width])
labels.set_shape([imgs_per_file, num_classes])
self.batch = tf.train.shuffle_batch([images, labels], batch_size=self.batch_size, capacity=q_capacity, min_after_dequeue=1000, enqueue_many = True)

enqueue_many非常重要,以便图像可以单独进入队列。