在测试TensorFlow实例时发现好多的图片数据集都是处理好的,直接在库中调用,比如Mnist,CIFAR-10等等。但是在运行自己编制的项目的时候,如何去读取自己的数据集呢?其实,一方面TensorFlow官方已经给出方法,那就是将图片制作成tfrecord格式的数据,供TensorFlow读取。另一方面可以用Python以及Python的图像处理第三方库都有数据集读取制作的方法。

1. TFRecord数据集介绍
TFRecord是一种二进制文件,可以支持多线程数据读取,可以通过batch_size和epoch参数来控制训练时单次batch的大小和样本迭代次数,同时能更好地利用内存和方便数据的复制和移动,所以是TensorFlow进行大规模深度学习训练的首选。
每个训练样本在TFRecord中称为example,TensorFlow使用tf.train.Example协议来存储训练样本,每个example本质上是一个字典dict类型,用来存储一个训练样本的多个feature信息(如input、label、mask等等),且每个feature信息必须是TensorFlow预定义好的类型(ByteList,FloatList以及Int64List中的一种)。最后,example通过SerializeToString()方法将样例序列化成字符串存储,TensorFlow通过TFRecordWriter将这些序列化之后的字符串存成TFRecord形式。
2. 创建TFRecord文件
# coding:utf-8import tensorflow as tfimport numpy as npfrom PIL import Imageimport os# 这是设置的路径,可以根据您的需要修改image_train_path = 'E:GitLabVSCodeimages'label_train_path = 'E:GitLabVSCodeimagesrain.txt'tfRecord_train = 'E:GitLabVSCodeimagesest.tfrecords'image_test_path = 'E:GitLabVSCodeimages'label_test_path = 'E:GitLabVSCodeimagesest.txt'tfRecord_test = 'E:GitLabVSCodeimagesest01.tfrecords'data_path = 'E:GitLabVSCodeimages'# 设置长宽像素点个数resize_height = 28resize_width = 28# 生成tfrecords文件def write_tfRecord(tfRecordName, image_path, label_path): writer = tf.python_io.TFRecordWriter(tfRecordName) # 新建一个writer num_pic = 0 f = open(label_path, 'r') contents = f.readlines() # 一次全部读入,速度比较快 f.close() for content in contents: ''' 该目录下的文件下的txt内容为: 0_5.jpg 5 1_0.jpg 0 2_4.jpg 4 ....... ''' value = content.split() # 用空格分开 img_path = image_path + value[0] img = Image.open(img_path) img_raw = img.tobytes() # 转化为二进制文件 labels = [0] * 10 labels[int(value[1])] = 1 # 设置标签位为1 # 用tf.train.Example的协议存储训练数据,训练数据的特征用键值对的形式表示 example = tf.train.Example(features=tf.train.Features(feature={ 'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw])), 'label': tf.train.Feature(int64_list=tf.train.Int64List(value=labels)) })) # 把每张图片和标签封装到example中 writer.write(example.SerializeToString()) # 将example序列化(把数据序列化成字符串存储) num_pic += 1 print("the number of picture: