tensorflow二进制文件读取与tfrecords文件读取
1、知识点
- """
- TFRecords介绍:
- TFRecords是Tensorflow设计的一种内置文件格式,是一种二进制文件,它能更好的利用内存,
- 更方便复制和移动,为了将二进制数据和标签(训练的类别标签)数据存储在同一个文件中
- CIFAR-10批处理结果存入tfrecords流程:
- 1、构造存储器
- a)TFRecord存储器API:tf.python_io.TFRecordWriter(path) 写入tfrecords文件
- 参数:
- path: TFRecords文件的路径
- return:写文件
- 方法:
- write(record):向文件中写入一个字符串记录
- record:字符串为一个序列化的Example,Example.SerializeToString()
- close():关闭文件写入器
- 2、构造每一个样本的Example协议块
- a)tf.train.Example(features=None)写入tfrecords文件
- features:tf.train.Features类型的特征实例
- return:example格式协议块
- b)tf.train.Features(feature=None)构建每个样本的信息键值对
- feature:字典数据,key为要保存的名字,
- value为tf.train.Feature实例
- return:Features类型
- c)tf.train.Feature(**options)
- **options:例如
- bytes_list=tf.train.BytesList(value=[Bytes])
- int64_list=tf.train.Int64List(value=[Value])
- 数据类型:
- tf.train.Int64List(value=[Value])
- tf.train.BytesList(value=[Bytes])
- tf.train.FloatList(value=[value])
- 3、写入序列化的Example
- writer.write(example.SerializeToString())
- 报错:
- 1、ValueError: Protocol message Feature has no "Bytes_list" field.
- 因为没有Bytes_list属性字段,只有bytes_list字段
- 读取tfrecords流程:
- 1、构建文件队列
- file_queue = tf.train.string_input_producer([FLAGS.cifar_tfrecords])
- 2、构造TFRecords阅读器
- reader = tf.TFRecordReader()
- 3、解析Example,获取数据
- a) tf.parse_single_example(serialized,features=None,name=None)解析TFRecords的example协议内存块
- serialized:标量字符串Tensor,一个序列化的Example
- features:dict字典数据,键为读取的名字,值为FixedLenFeature
- return:一个键值对组成的字典,键为读取的名字
- b)tf.FixedLenFeature(shape,dtype) 类型只能是float32,int64,string
- shape:输入数据的形状,一般不指定,为空列表
- dtype:输入数据类型,与存储进文件的类型要一致
- 4、转换格式,bytes解码
- image = tf.decode_raw(features["image"],tf.uint8)
- #固定图像大小,有利于批处理操作
- image_reshape = tf.reshape(image,[self.height,self.width,self.channel])
- label = tf.cast(features["label"],tf.int32)
- 5、批处理
- image_batch , label_batch = tf.train.batch([image_reshape,label],batch_size=5,num_threads=1,capacity=20)
- 报错:
- 1、ValueError: Shape () must have rank at least 1
- """
2、代码
- # coding = utf-8
- import tensorflow as tf
- import os
- FLAGS = tf.app.flags.FLAGS
- tf.app.flags.DEFINE_string("cifar_dir","./cifar10/", "文件的目录")
- tf.app.flags.DEFINE_string("cifar_tfrecords", "./tfrecords/cifar.tfrecords", "存进tfrecords的文件")
- class CifarRead(object):
- """
- 完成读取二进制文件,写进tfrecords,读取tfrecords
- """
- def __init__(self,file_list):
- self.file_list = file_list
- #图片属性
- self.height = 32
- self.width = 32
- self.channel = 3
- #二进制字节
- self.label_bytes = 1
- self.image_bytes = self.height*self.width*self.channel
- self.bytes = self.label_bytes + self.image_bytes
- def read_and_encode(self):
- """
- 读取二进制文件,并进行解码操作
- :return:
- """
- #1、创建文件队列
- file_quque = tf.train.string_input_producer(self.file_list)
- #2、创建阅读器,读取二进制文件
- reader = tf.FixedLengthRecordReader(self.bytes)
- key, value = reader.read(file_quque)#key为文件名,value为文件内容
- #3、解码操作
- label_image = tf.decode_raw(value,tf.uint8)
- #分割图片和标签数据, tf.cast(),数据类型转换 tf.slice()tensor数据进行切片
- label = tf.cast(tf.slice(label_image, [0], [self.label_bytes]), tf.int32)
- image = tf.slice(label_image,[self.label_bytes],[self.image_bytes])
- #对图像进行形状改变
- image_reshape = tf.reshape(image,[self.height,self.width,self.channel])
- # 4、批处理操作
- image_batch , label_batch = tf.train.batch([image_reshape,label],batch_size=5,num_threads=1,capacity=20)
- print(image_batch,label_batch)
- return image_batch,label_batch
- def write_ro_tfrecords(self,image_batch,label_batch):
- """
- 将读取的二进制文件写入 tfrecords文件中
- :param image_batch: 图像 (32,32,3)
- :param label_batch: 标签
- :return:
- """
- # 1、构造存储器
- writer = tf.python_io.TFRecordWriter(FLAGS.cifar_tfrecords)
- #循环写入
- for i in range(5):
- image = image_batch[i].eval().tostring()
- label = int(label_batch[i].eval()[0])
- # 2、构造每一个样本的Example
- example = tf.train.Example(features=tf.train.Features(feature={
- "image":tf.train.Feature(bytes_list = tf.train.BytesList(value = [image])) ,
- "label":tf.train.Feature(int64_list = tf.train.Int64List(value = [label])) ,
- }))
- # 3、写入序列化的Example
- writer.write(example.SerializeToString())
- #关闭流
- writer.close()
- return None
- def read_from_tfrecords(self):
- """
- 从tfrecords文件读取数据
- :return:
- """
- #1、构建文件队列
- file_queue = tf.train.string_input_producer([FLAGS.cifar_tfrecords])
- #2、构造TFRecords阅读器
- reader = tf.TFRecordReader()
- key , value = reader.read(file_queue)
- #3、解析Example
- features = tf.parse_single_example(value,features={
- "image":tf.FixedLenFeature([],tf.string),
- "label":tf.FixedLenFeature([],tf.int64)
- })
- #4、解码内容, 如果读取的内容格式是string需要解码, 如果是int64,float32不需要解码
- image = tf.decode_raw(features["image"],tf.uint8)
- #固定图像大小,有利于批处理操作
- image_reshape = tf.reshape(image,[self.height,self.width,self.channel])
- label = tf.cast(features["label"],tf.int32)
- #5、批处理
- image_batch , label_batch = tf.train.batch([image_reshape,label],batch_size=5,num_threads=1,capacity=20)
- return image_batch,label_batch
- if __name__ == '__main__':
- #################二进制文件读取###############
- # file_name = os.listdir(FLAGS.cifar_dir)
- # file_list = [os.path.join(FLAGS.cifar_dir, file) for file in file_name if file[-3:] == "bin"]
- # cf = CifarRead(file_list)
- # image_batch, label_batch = cf.read_and_encode()
- # with tf.Session() as sess:
- # # 创建协调器
- # coord = tf.train.Coordinator()
- # # 开启线程
- # threads = tf.train.start_queue_runners(sess, coord=coord)
- #
- # print(sess.run([image_batch, label_batch]))
- # # 回收线程
- # coord.request_stop()
- # coord.join(threads)
- #############################################
- #####二进制文件读取,并写入tfrecords文件######
- # file_name = os.listdir(FLAGS.cifar_dir)
- # file_list = [os.path.join(FLAGS.cifar_dir, file) for file in file_name if file[-3:] == "bin"]
- # cf = CifarRead(file_list)
- # image_batch, label_batch = cf.read_and_encode()
- # with tf.Session() as sess:
- # # 创建协调器
- # coord = tf.train.Coordinator()
- # # 开启线程
- # threads = tf.train.start_queue_runners(sess, coord=coord)
- # #########保存文件到tfrecords##########
- # cf.write_ro_tfrecords(image_batch, label_batch)
- # #########保存文件到tfrecords##########
- #
- # print(sess.run([image_batch, label_batch]))
- # # 回收线程
- # coord.request_stop()
- # coord.join(threads)
- ##############################################
- #############从tfrecords文件读取###############
- file_name = os.listdir(FLAGS.cifar_dir)
- file_list = [os.path.join(FLAGS.cifar_dir, file) for file in file_name if file[-3:] == "bin"]
- cf = CifarRead(file_list)
- image_batch, label_batch = cf.read_from_tfrecords()
- with tf.Session() as sess:
- # 创建协调器
- coord = tf.train.Coordinator()
- # 开启线程
- threads = tf.train.start_queue_runners(sess, coord=coord)
- print(sess.run([image_batch, label_batch]))
- # 回收线程
- coord.request_stop()
- coord.join(threads)
- ##############################################
tensorflow二进制文件读取与tfrecords文件读取的更多相关文章
- JXLS使用方法(文件上传读取)xlsx文件读取
1.官方文档:http://jxls.sourceforge.net/reference/reader.html 2.demo git地址:https://bitbucket.org/leonate/ ...
- TensorFlow中数据读取之tfrecords
关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow ...
- 深度学习tensorflow实战笔记(2)图像转换成tfrecords和读取
1.准备数据 首选将自己的图像数据分类分别放在不同的文件夹下,比如新建data文件夹,data文件夹下分别存放up和low文件夹,up和low文件夹下存放对应的图像数据.也可以把up和low文件夹换成 ...
- Tensorflow读写TFRecords文件
在使用slim之类的tensorflow自带框架的时候一般默认的数据格式就是TFRecords,在训练的时候使用TFRecords中数据的流程如下:使用input pipeline读取tfrecord ...
- 安全研究 | Jenkins 任意文件读取漏洞分析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室 发表于云+社区专栏 一.漏洞背景 漏洞编号:CVE-2018-1999002 漏洞等级:高危 Jenkins 7 月 18 ...
- node基础:文件系统-文件读取
node的文件读取主要分为同步读取.异步读取,常用API有fs.readFile.fs.readFileSync.还有诸如更底层的fs.read,以及数据流(stream),后面再总结下咯~ 直接上简 ...
- HDFS数据流-剖析文件读取及写入
HDFS数据流-剖析文件读取及写入 文件读取 1. 客户端通过调用FileSystem对象的open方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例.2. Distrib ...
- H5C3--语义标签以及语义标签IE8兼容,表单元素新属性,度量器,自定义属性,dataList,网络监听,文件读取
HTML5新增标签以及HTML5新增的api 1.H5并不是新的语言,而是html语言的第五次重大修改--版本 2.支持:所有的主流浏览器都支持h5.(chrome,firefox,s ...
- 【学习笔记】tensorflow文件读取
目录 文件读取 文件队列构造 文件阅读器 文件内容解码器 开启线程操作 管道读端批处理 CSV文件读取案例 先看下文件读取以及读取数据处理成张量结果的过程: 一般数据文件格式有文本.excel和图片数 ...
随机推荐
- 《python解释器源码剖析》第3章--python中的str对象
3.0 序 我们知道python中的字符串属于变长对象,当然和int也是一样,底层的结构体实例所维护的数据的长度,在对象没有定义的时候是不知道的.当然如果是python2的话,底层PyIntObjec ...
- 【原创】马哥 文本三剑客之awk
命令 awk 全称: man搜索: 简述 基本用法 选项 用法与实验 print 打印 (1)(2)(3) 变量 1.内建变量 FS与OFS RS与ORS NR与FNR NF ARGC与ARGC 2. ...
- 手机 简易浏览器 WebView的基本使用 返回 缓存 进度条
public class MainActivity extends AppCompatActivity { private WebView webView; private String url = ...
- 【网络协议】动态主机配置协议DHCP
动态主机配置协议DHCP 当某组织获得一块地址后,就可以为本组织内的主机或者路由器分配IP地址.这个分配工作可以由系统管理员手动通过网络管理工具来完成.也可以由动态主机配置协议(Dynamic Hos ...
- redis-数据淘汰策略
博客标题:Redis的数据淘汰策略及相关注意事项 配置redis.conf中的maxmemory这个值来开启内存淘汰功能 volatile-lru:从已设置过期时间的数据集(server.db[i]. ...
- 【CF335 E】Counting Skyscrapers
题意 有一排高楼,每一栋高楼有一个正整数高度,高度为 \(i\) 的概率为 \(2^{-i}\).一栋楼的每层从下往上依次编号为 \(0,1,2,\cdots,i-1\). 为了出题,大楼之间安装了溜 ...
- Tampermonkey油猴脚本管理插件-最强浏览器插件的安装使用全攻略
对于接触过谷歌浏览器插件的“玩家”们来说,应该没有人没听说过Tampermonkey用户脚本管理器,也就是中文所说的“油猴”这个chrome插件了. 油猴号称全商店最强的浏览器插件绝非浪得虚名,一 ...
- 本地文件上传到gitlab
1.本地创建目录gbdt_model 2.进入文件目录,在文件中点击鼠标右键选择bash控制台进入 3.运行git init 命令,文件中会多出一个.git 命令 4. git commit -m & ...
- 如何在vue项目中引入elementUI组件
个人博客同步文章 https://mr-houzi.com/2018/02/... 前提:已经安装好Vue 初始化vue vue init webpack itemname 运行初始化demo 运行一 ...
- Java程序中使用 Jsoup 爬虫( 简单示例 )
一.maven项目里pom添加jsoup依赖 <dependency> <groupId>org.jsoup</groupId> <artifactId> ...