tensorflow TFRecords文件的生成和读取的方法


Posted in Python onFebruary 06, 2018

TensorFlow提供了TFRecords的格式来统一存储数据,理论上,TFRecords可以存储任何形式的数据。

TFRecords文件中的数据都是通过tf.train.Example Protocol Buffer的格式存储的。以下的代码给出了tf.train.Example的定义。

message Example { 
  Features features = 1; 
}; 
message Features { 
  map<string, Feature> feature = 1; 
}; 
message Feature { 
  oneof kind { 
  BytesList bytes_list = 1; 
  FloatList float_list = 2; 
  Int64List int64_list = 3; 
} 
};

下面将介绍如何生成和读取tfrecords文件:

首先介绍tfrecords文件的生成,直接上代码:

from random import shuffle 
import numpy as np 
import glob 
import tensorflow as tf 
import cv2 
import sys 
import os 
 
# 因为我装的是CPU版本的,运行起来会有'warning',解决方法入下,眼不见为净~ 
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
 
shuffle_data = True 
image_path = '/path/to/image/*.jpg' 
 
# 取得该路径下所有图片的路径,type(addrs)= list 
addrs = glob.glob(image_path) 
# 标签数据的获得具体情况具体分析,type(labels)= list 
labels = ... 
 
# 这里是打乱数据的顺序 
if shuffle_data: 
  c = list(zip(addrs, labels)) 
  shuffle(c) 
  addrs, labels = zip(*c) 
 
# 按需分割数据集 
train_addrs = addrs[0:int(0.7*len(addrs))] 
train_labels = labels[0:int(0.7*len(labels))] 
 
val_addrs = addrs[int(0.7*len(addrs)):int(0.9*len(addrs))] 
val_labels = labels[int(0.7*len(labels)):int(0.9*len(labels))] 
 
test_addrs = addrs[int(0.9*len(addrs)):] 
test_labels = labels[int(0.9*len(labels)):] 
 
# 上面不是获得了image的地址么,下面这个函数就是根据地址获取图片 
def load_image(addr): # A function to Load image 
  img = cv2.imread(addr) 
  img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC) 
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
  # 这里/255是为了将像素值归一化到[0,1] 
  img = img / 255. 
  img = img.astype(np.float32) 
  return img 
 
# 将数据转化成对应的属性 
def _int64_feature(value):  
  return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) 
 
 
def _bytes_feature(value): 
  return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) 
 
 
def _float_feature(value): 
  return tf.train.Feature(float_list=tf.train.FloatList(value=[value])) 
 
# 下面这段就开始把数据写入TFRecods文件 
 
train_filename = '/path/to/train.tfrecords' # 输出文件地址 
 
# 创建一个writer来写 TFRecords 文件 
writer = tf.python_io.TFRecordWriter(train_filename) 
 
for i in range(len(train_addrs)): 
  # 这是写入操作可视化处理 
  if not i % 1000: 
    print('Train data: {}/{}'.format(i, len(train_addrs))) 
    sys.stdout.flush() 
  # 加载图片 
  img = load_image(train_addrs[i]) 
 
  label = train_labels[i] 
 
  # 创建一个属性(feature) 
  feature = {'train/label': _int64_feature(label), 
        'train/image': _bytes_feature(tf.compat.as_bytes(img.tostring()))} 
 
  # 创建一个 example protocol buffer 
  example = tf.train.Example(features=tf.train.Features(feature=feature)) 
 
  # 将上面的example protocol buffer写入文件 
  writer.write(example.SerializeToString()) 
 
writer.close() 
sys.stdout.flush()

上面只介绍了train.tfrecords文件的生成,其余的validation,test举一反三吧。。

接下来介绍tfrecords文件的读取:

import tensorflow as tf 
import numpy as np 
import matplotlib.pyplot as plt 
import os  
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
data_path = 'train.tfrecords' # tfrecords 文件的地址 
 
with tf.Session() as sess: 
  # 先定义feature,这里要和之前创建的时候保持一致 
  feature = { 
    'train/image': tf.FixedLenFeature([], tf.string), 
    'train/label': tf.FixedLenFeature([], tf.int64) 
  } 
  # 创建一个队列来维护输入文件列表 
  filename_queue = tf.train.string_input_producer([data_path], num_epochs=1) 
 
  # 定义一个 reader ,读取下一个 record 
  reader = tf.TFRecordReader() 
  _, serialized_example = reader.read(filename_queue) 
 
  # 解析读入的一个record 
  features = tf.parse_single_example(serialized_example, features=feature) 
 
  # 将字符串解析成图像对应的像素组 
  image = tf.decode_raw(features['train/image'], tf.float32) 
 
  # 将标签转化成int32 
  label = tf.cast(features['train/label'], tf.int32) 
 
  # 这里将图片还原成原来的维度 
  image = tf.reshape(image, [224, 224, 3]) 
 
  # 你还可以进行其他一些预处理.... 
 
  # 这里是创建顺序随机 batches(函数不懂的自行百度) 
  images, labels = tf.train.shuffle_batch([image, label], batch_size=10, capacity=30, min_after_dequeue=10) 
 
  # 初始化 
  init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) 
  sess.run(init_op) 
 
  # 启动多线程处理输入数据 
  coord = tf.train.Coordinator() 
  threads = tf.train.start_queue_runners(coord=coord) 
 
  .... 
 
  #关闭线程 
  coord.request_stop() 
  coord.join(threads) 
  sess.close()

好了,就介绍到这里。。,有什么问题可以留言。。大家一起学习。。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
python微信公众号之关键词自动回复
Jun 15 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
浅析python内置模块collections
Nov 15 Python
Python算法中的时间复杂度问题
Nov 19 Python
Python3 元组tuple入门基础
Feb 09 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
python接口测试返回数据为字典取值方式
Feb 12 Python
TensorFlow实现创建分类器
Feb 06 #Python
Python模拟随机游走图形效果示例
Feb 06 #Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 #Python
TensorFlow高效读取数据的方法示例
Feb 06 #Python
django使用xlwt导出excel文件实例代码
Feb 06 #Python
Python使用装饰器进行django开发实例代码
Feb 06 #Python
Python yield与实现方法代码分析
Feb 06 #Python
You might like
PHP通用检测函数集合
2006/11/25 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
python requests post多层字典的方法
2018/12/27 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
校班主任推荐信范文
2013/12/03 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
信息技术课后反思
2014/04/27 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
支部鉴定材料
2014/06/02 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python