Tensorflow数据读取之tfrecord

Tensorflow数据读取之tfrecord文章目录tfrecordtfrecord的使用流程写入tfrecord文件读取tfrecord文件tfrecord中的数据格式tfrecord中对于变长数据和定长数据的处理tfrecord中生成batch_data的方法插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

tfrecord

这次只记录我在实验中遇到的情况和略懂的几点,多余的我没有怎么看【笑哭】,一个是因为懒,一个是因为官网介绍页太少了8,有点心塞~~
开门见山,关于Tensorflow读取数据,官网给出了三种方法,分别是:
1.供给数据(Feeding): 在TensorFlow程序训练或者测试的每一个epoch,在tf.Session().run()函数中,以字典的形式通过feed_dict参数进行赋值。
2.从文件读取数据: 在TensorFlow图的起始, 让一个输入管线从文件中读取数据。
3.预加载数据: 在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。

截止到目前为止,由于我使用tensorflow的时间不长,次数不多,所以只是尝试过第一种和第三种方法。最近刚刚尝试了第三种方法,使用的是tensorflow内定的标准读取数据的格式—tfrecord,在这里记录一下。(好像并没有开门见山,尴尬脸)

TFRecords是一种二进制文件,这个格式我真的理解无能,据说它不对数据进行压缩,所以可以被快速加载到内存中,要复制和移动的时候也是咻的一下就搞定,所以说人家作为内定格式是有原因的,嗯,没错,凭实力内定。但是这种格式不支持随机访问,因此它适合于大量的数据流,但不适用于快速分片或其他非连续存取。

tfrecord的使用流程

写入tfrecord文件

TFRecords文件包含了tf.train.Example 协议内存块(protocol buffer)(协议内存块包含了字段 Features)。我们可以写一段代码获取你的数据, 将数据填入到Example协议内存块(protocol buffer),将协议内存块序列化为一个字符串, 并且通过tf.python_io.TFRecordWriter 写入到TFRecords文件。

上面这段话是从别人那里复制来的。用更通俗的话来解释一下。分两种情况来说:
1.一次往tfrecord文件中存储一个样本数据
2.一次往tfrecord文件中存储一个bacth的样本数据
对于第一种情况(一次往tfrecord文件中存储一个样本数据),每一个样本的特征构造一个dict={‘特征1’:“value1”,”特征2”:“value2”,…,“特征n”:“value n”}。
首先通过tf.python_io.TFRecordWriter函数打开要写入的tfrecord文件。

writer = tf.python_io.TFRecordWriter(outfile)

Jetbrains全家桶1年46,售后保障稳定

然后通过下面这种形式把样本特征存到example中。

example = tf.train.Example(
                    features=tf.train.Features( #构造每个样本的信息键值对
                        feature={ 
   
                            'fm_feat_indices': tf.train.Feature(
                                bytes_list=tf.train.BytesList(value=[fm_feat_indices_str])),
                            'fm_feat_values': tf.train.Feature(
                                float_list=tf.train.FloatList(value=fm_feat_values)),
                            'fm_feat_shape': tf.train.Feature(
                                int64_list=tf.train.Int64List(value=fm_feat_shape)),
                            'labels': tf.train.Feature(
                                bytes_list=tf.train.BytesList(value=[labels_str]))
                        }
                    )
                )

然后在对example进行序列化。

serialized = example.SerializeToString()

最后将序列化好的样本特征写入tfrecord文件。

writer.write(serialized)

这样就能成功写入tfrecord文件啦【转圈圈】。但是呢,在深度学习中要使用的时候通常是用batch_size作为使用单位的,每次取出一个batch的数据。所以在读的时候要自己构造batch生成器。个人感觉这样会麻烦一些。所以想省事的童鞋第二种情况就比较适合你们啦。

对于第二种情况(一次往tfrecord文件中存储一个batch样本数据),步骤也是和上面一样。唯一的差别是存入feature的每一项特征不再是每一个样本的特征,而是一个batch中的样本的所有特征组成的list或者array。这样之后读取的时候,每次读取一个样本值,所得到的就是batch的内容。

读取tfrecord文件

从TFRecords文件中读取数据, 可以使用tf.TFRecordReader的tf.parse_single_example解析器。这个操作可以将Example协议内存块(protocol buffer)解析为张量。

 def get_iterator(self, src_dataset):
     src_dataset = src_dataset.map(self.parser)
     iterator = src_dataset.make_initializable_iterator()
     # 所需数据格式
     _fm_feat_indices, _fm_feat_values,  _fm_feat_shape, _labels = iterator.get_next()
     self.initializer = iterator.initializer
     self.fm_feat_indices = _fm_feat_indices
     self.fm_feat_values = _fm_feat_values
     self.fm_feat_shape = _fm_feat_shape
     self.labels = _labels

 def parser(self, record):
     keys_to_features = { 
   
         'fm_feat_indices': tf.FixedLenFeature([], tf.string), # (batch_size,'fm_feat_values': tf.VarLenFeature(tf.float32), # (batch_size)
         'fm_feat_shape': tf.FixedLenFeature([2], tf.int64), # (batch_size,2'labels': tf.FixedLenFeature([], tf.string), # (batch_size,}
     parsed = tf.parse_single_example(record, keys_to_features)
     fm_feat_indices = tf.reshape(tf.decode_raw(parsed['fm_feat_indices'], tf.int64), [-1, 2])  # (batch_size,2)
     fm_feat_values = tf.sparse_tensor_to_dense(parsed['fm_feat_values'])
     fm_feat_shape = parsed['fm_feat_shape']
     labels = tf.reshape(tf.decode_raw(parsed['labels'], tf.float32), [-1, 1])
     return fm_feat_indices, fm_feat_values, fm_feat_shape, labels,

由于从 tfrecord 文件中导入的样本是刚才写入的 tf_serialized 序列化样本,所以我们需要对每一个样本进行解析。这里就用 dataset.map(parse_function) 来对 dataset 里的每个样本进行相同的解析操作。
注:dataset.map(输入) 中的输入是一个函数。
解析基本就是写入时的逆过程,所以会需要写入时的信息,上面先列出刚才写入时,所有 feature 的各项信息。
在这个过程中会用到两个函数,tf.FixedLenFeature()和 tf.VarLenFeature(),前者是取固定长度的特征的,后者是针对不定长的特征的,关于这两个函数的具体使用情况可以参照官方文档。但是需要注意的一个地方是,这两个函数都有一个参数是shape,除了字符串类型的特征在取的时候用tf.FixedLenFeature()不用指定要取的特征的shape,其余类型的特征在取的时候要标明取得shape。

tfrecord中的数据格式

接上面一部分,上面一部分中的feature里面的特征只能有三种类型。

  • int64:tf.train.Feature(int64_list = tf.train.Int64List(value=输入))

  • float32:tf.train.Feature(float_list = tf.train.FloatList(value=输入))

  • string:tf.train.Feature(bytes_list=tf.train.BytesList(value=输入))

注:输入必须是 list(向量),向量的嵌套是不合法的,比如输入=[[1,2],[2,3]]
这里必须要提一下,tfrecord文件中能存储任何类型的数据,不管是标量,向量,还是矩阵,tensor,都能被成功存储到文件中去。但是在存之前要先将矩阵和tensor通过tostring函数转成字符串形式,然后再存成striing类型的数据。对,就是这样,万物皆可存,万物皆可字符串化。

fm_feat_indices_str = fm_feat_indices.tostring()
labels_str = labels.tostring()

tfrecord中对于变长数据和定长数据的处理

对于定长数据,可以把它转化成int,float,byte三种类型之一,然后存储,在读取的时候使用tf.FixedLenFeature()来获取。
对于变长数据,首先也要转化成int,float,byte三种类型之一,存储的时候如果是把他压成字符形式来存储,这样会丢失数据的维度信息,所以不仅要存储数据本身的内容,还要另外再加一个特征字段用来存储数据的shape,方便后面用tf.VarLenFeature(),这个字段一般用int类型就可以。
读取出来再转换数据形状。

# 变长数据存储
'inp_mask': tf.train.Feature(bytes_list=tf.train.BytesList(value=[inp_mask])),
'inp_shape': tf.train.Feature(int64_list=tf.train.Int64List(value=inp_shape))

好了,这篇先到此结束。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234091.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux mail发邮件_python邮件发送

    linux mail发邮件_python邮件发送linux安装mailx发邮件文章目录linux安装mailx发邮件原理安装配置qq的smtps服务器配置Peer的证书发布者为信任​ mail命令是Linux终端发送邮件用的最多的命令。mailx是mail命令的更新版本,基于BerkeleyMail8.1,意在提供POSIXmailx命令的功能,并支持MIME、IMAP、POP3、SMTP和S/MIME扩展。mailx在某些交互特性上更加强大,如缓冲邮件消息、垃圾邮件评分和过滤等。在Linux发行版上,mail

    2022年10月20日
    2
  • 一篇文章,Vue快速入门!!!

    一篇文章,Vue快速入门!!!①Vue概述及第一个Vue程序(HelloWorld)1.1什么是MVVMMVVM(Model-View-ViewModel)是一种软件设计模式,由微软WPF(用于替代WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于JavaApplet,简单点说就是在浏览器上运行WPF)的架构师KenCooper和TedPeters开发,是一种简化用户界面的事件驱动编程方式。由JohnGossman(同样也是WPF和Sliverlight的架构师)与2005年在他的

    2022年5月4日
    52
  • 微信公众平台-微信服务号开发

    文章目录背景:一、微信各个平台介绍二、公众平台介绍三、开发前准备四、服务器配置五、服务器验证六、消息接收七、客服消息八、获取素材九、相关工具十、最终效果展示总结背景:近期接到了涉及微信开放平台和微信公众平台相关的开发需求,开发过程中踩了许多坑,把相关问题整理记录下来以便巩固记忆,并把总结的经验分享出来,本篇分享微信服务号开发,希望可以给大家提供帮助一、微信各个平台介绍1、微信开放平台:面向开发人员,为网站、App提供微信第三方登录功能,为App提供支付功能。2、微信公众平台:对应的是公众号,包括订

    2022年4月12日
    172
  • eclipse卸载android环境插件

    卸载eclipse-preference左侧导航栏中Android模块help-installnewsoftware–whatisalreadyinstalled?在弹出的界面选择android相关的插件卸载,重启eclipse

    2022年4月6日
    40
  • 图书销售管理系统的设计与实现

    图书销售管理系统的设计与实现图书销售管理系统的设计与实现本系统带程序说明书 有需要的可以去我上传的资源里面找,找不到的话,评论我,或者站内私信留下邮箱,我给你发,也可以联系我ID。因为最近太忙一直没有上传完。emmmm  跟着现代社会的开展越来越多的公司、企业、出售集体等现已不满意于仅仅只是静态网页技能介绍公司布景环境以及开展方向,愈加倾向于开展能够与用户进行动态交互的网站,尤其关于出售型企业来说更是如此。关于一个根…

    2022年6月11日
    34
  • ROS教程(一):ROS安装教程(详细图文)

    ROS教程(一):ROS安装教程(详细图文)前言关于ROS(RobotOS机器人操作系统),估计看这个教程的人已经大概知道是啥了,我在这就不废话了。首先对于ROS的安装,在它的官方网站:http://wiki.ros.org/ROS/Installation中有详细说明。但是。。。上面的教程都是英文的,如果感觉略有压力(本人就是)。所以文章目录前言一、版本选择二、开始安装2.1软件中心配置2.2添加源2.3安装2.4配置ROS环境到系统三、验证ROS

    2022年6月4日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号