这篇文章介绍如何将大量数据存储为TFRecords格式的文件,然后将TFRecords格式的文件按批次处理的方式引入代码中,用来训练你的模型。
本文借鉴了 link中的大部分内容,加上自己的理解和对代码中用到的库的补充说明。
TFRecords 是 Tensorflow standard format ,就是tf标准的数据形式,tf源码中他提供了很多net结构,也就是网络结构,这些网络结构都是你输入数据直接就能跑的,而数据格式多种多样不好统一,tf规定的标准数据格式–TFRecords就可以实现这样一件事,只要你把你的数据转化成这个格式,就可以使用tf定义好的网络结构,然后训练你自己的模型。
1. 准备数据
原bolg中使用的数据是DOG VS CAT的数据,可以在download中下载,下载之前需要先注册账号,验证身份还是有点麻烦的,使用自己的数据库也是可以的,只是对于初学者应该把重点放在理解这个过程上,而不是捣鼓数据集,所以建议还是下载一个,不想注册的也可以留下邮箱号我可以发给你。
First, we need to list all images and label them. We give each cat image a label = 0 and each dog image a label = 1. The following code list all images, give them proper labels, and then shuffle the data. We also divide the data set into three train (%60), validation (%20), and test parts (%20).
首先为每张图片对应标签,猫为1狗为0,将匹配好的数据(图像-标签)打乱,按照6/2/2的比例分为训练集,验证集,测试集。
from random import shuffle
import glob
# shuffle the addresses before saving
shuffle_data = True
cat_dog_train_path = 'Cat vs Dog/train/*.jpg'
# 读取数据
addrs = glob.glob(cat_dog_train_path)
# 打标签
labels = [0 if 'cat' in addr else 1 for addr in addrs]
# to shuffle data
if shuffle_data:
c = list(zip(addrs, labels))
shuffle(c)
addrs, labels = zip(*c)
# Divide the data into 60% train, 20% validation, and 20% test
train_addrs = addrs[0:int(0.6*len(addrs))]
train_labels = labels[0:int(0.6*len(labels))]
val_addrs = addrs[int(0.6*len(addrs)):int