我有一个带有随机ID的图像目录和一个带有id及其相应标签的文本文件。我想知道是否有办法直接从磁盘读取数据,而不是将整个数据集作为矩阵加载到ram中。 我知道可以通过使用python生成器的方法来完成,然后使用占位符来提供数据。
def generator_(path1,filename):
.
.
yield x,y
x=tf.placeholder(tf.float32,shape=[None,w,h,3])
y=tf.placeholder(tf.float32,shape=[None,n_c])
x,y=generator_(path_image,'labels.txt')
但是使用tf.data api做更好的方法是什么?
答案 0 :(得分:1)
假设您的labels.txt
具有结构(以逗号分隔的图片ID和标签):
1, 0
2, 2
3, 1
...
42, 2
并且您的图像存储如下:
/data/
|---- image1.jpg
|---- image2.jpg
...
|---- image42.jpg
然后您可以通过以下方式使用tf.data
:
import tensorflow as tf
def generate_parser(separator=",", image_path=["/data/image", ".jpg"]):
image_path = [tf.constant(image_path[0]), tf.constant(image_path[1])]
def _parse_data(line):
# Split the line according to separator:
line_split = tf.string_split([line], separator)
# Convert label value to int:
label = tf.string_to_number(line_split.values[1], out_type=tf.int32)
# Build complete image path from ID:
image_filepath = image_path[0] + line_split.values[0] + image_path[1]
# Open image:
image_string = tf.read_file(image_filepath)
image_decoded = tf.image.decode_image(image_string)
return image_decoded, label
return _parse_data
label_file = "/var/data/labels.txt"
dataset = (tf.data.TextLineDataset([label_file])
.map(generate_parser(separator=",", image_path=["/data/image", ".jpg"])))
# add .batch(), .repeat(), etc.