我正在尝试将我的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
返回两个不同的值:images
和labels
。然后像tf.train.shuffle_batch([images, labels],...)
tf.train.shuffle_batch()
tf.train.shuffle_batch_join()
似乎没什么用,但我觉得我正在遵循guide的格式以及我见过的各种其他教程。我究竟做错了什么?如果我的错误是愚蠢或微不足道,我道歉(搜索此错误似乎没有返回任何与我相关的内容)。感谢您的帮助和时间!
答案 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
非常重要,以便图像可以单独进入队列。