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 uuid模块使用实例
Apr 08 Python
Python中类的定义、继承及使用对象实例详解
Apr 30 Python
python如何查看系统网络流量的信息
Sep 12 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 Python
python使用rpc框架gRPC的方法
Aug 24 Python
python文件拆分与重组实例
Dec 10 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
Python理解递归的方法总结
Jan 28 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
tensorflow 重置/清除计算图的实现
Jan 19 Python
Django --Xadmin 判断登录者身份实例
Jul 03 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使用MySQL保存session会话的方法
2015/06/18 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
php精度计算的问题解析
2019/06/21 PHP
xss文件页面内容读取(解决)
2010/11/28 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
js实现图片360度旋转
2017/01/22 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
Python3.5 创建文件的简单实例
2018/04/26 Python
详解python3中的真值测试
2018/08/13 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
深圳茁壮笔试题
2015/05/28 面试题
市场营销毕业生自荐信
2013/11/23 职场文书
交通事故协议书范文
2014/04/16 职场文书
优质服务活动实施方案
2014/05/02 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
六查六看六改心得体会
2014/10/14 职场文书
技术员个人工作总结
2015/03/03 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python