使用tf.data从磁盘读取数据

时间:2018-05-30 14:11:52

标签: python tensorflow

我有一个带有随机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做更好的方法是什么?

1 个答案:

答案 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.