Tensorflow读取数据--TFrecord格式

2023-05-16

一. 什么是Tfrecord?
 TFRecords可以允许你讲任意的数据转换为TensorFlow所支持的格式, 这种方法可以使TensorFlow的数据集更容易与网络应用架构相匹配。这种建议的方法就是使用TFRecords文件,TFRecords文件包含了[tf.train.Example 协议内存块(protocol buffer)](协议内存块包含了字段[Features]。你可以写一段代码获取你的数据, 将数据填入到Example协议内存块(protocol buffer),将协议内存块序列化为一个字符串, 并且通过[tf.python_io.TFRecordWriter class]写入到TFRecords文件。

TFRecords文件格式在图像识别中有很好的使用,其可以将二进制数据和标签数据(训练的类别标签)数据存储在同一个文件中,它可以在模型进行训练之前通过预处理步骤将图像转换为TFRecords格式,此格式最大的优点实践每幅输入图像和与之关联的标签放在同一个文件中.TFRecords文件是一种二进制文件,其不对数据进行压缩,所以可以被快速加载到内存中.格式不支持随机访问,因此它适合于大量的数据流,但不适用于快速分片或其他非连续存取。
总的来说,TFrecord是tensorflow支持的对数据进行快速处理的一种格式,所以当我们的数据集非常大时,我们可以选择将数据转换为tfrecord格式
二.如何转换为TFrecord格式?
首先我们需要对TFrecord格式进行一个了解,TFrecord格式一般是这样的:

message Example {
 Features features = 1;
};

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


从上述代码可以看出,tf.train.Example 的数据结构很简单。tf.train.Example中包含了一个从属性名称到取值的字典,其中属性名称为一个字符串,属性的取值可以为字符串(BytesList ),浮点数列表(FloatList )或整数列表(Int64List )。例如我们可以将图片转换为字符串进行存储,图像对应的类别标号作为整数存储,而用于回归任务的ground-truth可以作为浮点数存储。通过后面的代码我们会对tfrecord的这种字典形式有更直观的认识。
二.如何将我们的数据转换为tfrecord呢?

总的来说,一共分为了三步:
1.我们可以写一段代码获取你的原始数据。
2.通过修改 tf.train.Example 的Features,将数据填入到Example协议内存块(protocol buffer)。
3.将协议内存块(protocol buffer)序列化为一个字符串,并且通过tf.python_io.TFRecordWriter将序列化的字符串写入到TFRecords文件。 
先上一段代码,然后我们对代码进行详细解释:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from scipy import misc
import scipy.io as sio


def _bytes_feature(value):
    return tf.train.Feature(bytes_list = tf.train.BytesList(value=[value]))

def _int64_feature(value):
    return tf.train.Feature(int64_list = tf.train.Int64List(value=[value]))


root_path = '/mount/temp/WZG/Multitask/Data/'
tfrecords_filename = root_path + 'tfrecords/train.tfrecords'
writer = tf.python_io.TFRecordWriter(tfrecords_filename)


height = 300
width = 300
meanfile = sio.loadmat(root_path + 'mats/mean300.mat')
meanvalue = meanfile['mean']

txtfile = root_path + 'txt/train.txt'
fr = open(txtfile)

for i in fr.readlines():
    item = i.split()
    img = np.float64(misc.imread(root_path + '/images/train_images/' + item[0]))
    img = img - meanvalue
    maskmat = sio.loadmat(root_path + '/mats/train_mats/' + item[1])
    mask = np.float64(maskmat['seg_mask'])
    label = int(item[2])
    img_raw = img.tostring()
    mask_raw = mask.tostring()
    example = tf.train.Example(features=tf.train.Features(feature={
        'height': _int64_feature(height),
        'width': _int64_feature(width),
        'name': _bytes_feature(item[0]),
        'image_raw': _bytes_feature(img_raw),
        'mask_raw': _bytes_feature(mask_raw),
        'label': _int64_feature(label)}))

    writer.write(example.SerializeToString())

writer.close()
fr.close()


代码中前两个函数(_bytes_feature和_int64_feature)是将我们的原生数据进行转换用的,尤其是图片要转换成字符串再进行存储。这两个函数的定义来自官方的示例。 
接下来,我定义了数据的(路径-label文件)txtfile,它大概长这个样子:

这里稍微啰嗦下,介绍一下我的实验内容。我做的是一个multi-task的实验,一支task做分割,一支task做分类。所以txtfile中每一行是一个样本,每个样本又包含3项,第一项为图片名称,第二项为相应的ground-truth segmentation mask的名称,第三项是图片的标签。(txtfile中内容形式无所谓,只要能读到想读的数据就可以)

接着回到主题继续讲代码,之后我又定义了即将生成的tfrecord的文件路径和名称,即tfrecord_filename,还有一个writer,这个writer是进行写操作用的。

接下来是图片的高度、宽度以及我事先在整个数据集上计算好的图像均值文件。高度、宽度其实完全没必要引入,这里只是为了说明tfrecord的生成而写的。而均值文件是为了对图像进行事先的去均值化操作而引入的,在大多数机器学习任务中,图像去均值化对提高算法的性能还是很有帮助的。

最后就是根据txtfile中的每一行进行相关数据的读取、转换以及tfrecord的生成了。首先是根据图片路径读取图片内容,然后图像减去之前读入的均值,接着根据segmentation mask的路径读取mask(如果只是图像分类任务,那么就不会有这些额外的mask),txtfile中的label读出来是string格式,这里要转换成int。然后图像和mask数据也要用相应的tosring函数转换成string。

真正的核心是下面这一小段代码:

example = tf.train.Example(features=tf.train.Features(feature={
        'height': _int64_feature(height),
        'width': _int64_feature(width),
        'name': _bytes_feature(item[0]),
        'image_raw': _bytes_feature(img_raw),
        'mask_raw': _bytes_feature(mask_raw),
        'label': _int64_feature(label)}))

writer.write(example.SerializeToString())


这里很好地体现了tfrecord的字典特性,tfrecord中每一个样本都是一个小字典,这个字典可以包含任意多个键值对。比如我这里就存储了图片的高度、宽度、图片名称、图片内容、mask内容以及图片的label。对于我的任务来说,其实height、width、name都不是必需的,这里仅仅是为了展示。键值对的键全都是字符串,键起什么名字都可以,只要能方便以后使用就可以。

定义好一个example后就可以用之前的writer来把它真正写入tfrecord文件了,这其实就跟把一行内容写入一个txt文件一样。代码的最后就是writer和txt文件对象的关闭了。
最后,附上一些讲解的较好的文章来方便回顾和学习:
[https://www.jianshu.com/p/78467f297ab5](url)
[https://blog.csdn.net/u010358677/article/details/70544241](url)
[https://blog.csdn.net/briblue/article/details/80789608](url)
[https://blog.csdn.net/fu6543210/article/details/80263425](url)
[https://blog.csdn.net/u013555719/article/details/77894827](url)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow读取数据--TFrecord格式 的相关文章

随机推荐

  • 在 ASP.NET 中执行 URL 重写

    发布日期 xff1a 8 23 2004 更新日期 xff1a 8 23 2004 Scott Mitchell 4GuysFromRolla com 适用范围 xff1a Microsoft ASP NET 摘要 xff1a 介绍如何使用
  • 我的近况(随时更新)

    2007年9月23日 最近在开发ASP NET Web服务器 xff0c 因为使用IIS 太受限制了 xff0c 要升级还得升级操作系统 现在的开发阶段为内核开发 xff0c 已经完成基本的开发 xff0c 还没有包装起来
  • adb dumpsys命令用法

    dumpsys命令功能很强大 xff0c 能dump系统服务的各种状态 xff0c 非常有必要熟悉该命令的用法以及含义 一 概述 1 1 dumpsys命令用法 可通过dumpsys命令查询系统服务的运行状态 对象的成员变量属性值 xff0
  • Python if-else使用

    1 从键盘上输 个数 xff0c 显示它的绝对值 不允许使 abs num 61 float input 34 请输入一个实数 xff1a 34 if num gt 0 print num else print num 2 假设 户名为ad
  • Ubuntu 串口工具 —— cutecom

    串口调试工具 xff1a cutecom xff08 非常好用 xff09 安装 xff1a span class token function sudo span span class token function apt get spa
  • Android Camera 预览拉伸问题

    预览会出现拉伸的问题代码 xff1a 预览拉伸Demo 预览画面拉伸问题改正的 gitee 代码在文章最后给出 预览拉伸的原因 xff1a 每颗Camera都支持一些分辨率 xff0c Camera的这些图像如果和预览画面的宽高比例不一致就
  • Dockerfile关键字详解

    文章目录 一 Dockerfile基础知识二 Dockerfile常用的指令三 Dockerfile实战测试1 编写如下Dockerfile文件 xff0c 创建自己的centos镜像2 编译镜像3 测试运行 一 Dockerfile基础知
  • docker search 命令详解

    原文链接 docker search 命令详解 文章目录 一 docker search 命令选项二 docker search 使用实例2 1 通过指定镜像名搜索2 2 搜索结果不进行截断显示2 3 设置搜索结果只显示10个2 4 搜索结
  • “lib32ncurses5 : Depends: libc6-i386 (>= 2.18) but it is not going to be installed”类似问题解决办法

    问题背景 在64位Linux操作系统的主机上安装32位的交叉编译链时 xff0c 如果64位系统与32位的工具链不兼容 xff0c 在我们使用工具链对代码进行交叉编译时 xff0c 往往会出现明明工具链已经安装到了指定的目录下 xff0c
  • Spring框架基础知识概述

    目录 第一章 xff1a Spring概述第二章 xff1a Spring的第一个核心功能 xff1a ioc第三章 xff1a spring的第二个核心功能 xff1a aop第四章 xff1a 把mybatis框架和spring集成在一
  • 有关Opencv Undefined Reference to cv::Mat::updateContinuityFlag()编译问题的解决

    VScode编译中opencv的undefined reference 问题 一般来说 xff0c undefined reference to cv 等的问题是关于编译时依赖文件的问题 xff0c 应该将包含库的路径弄好了就没问题 xff
  • 利用MVC编写GUI程序-----梯形的面积(JAVA实用教程2-第五版 第九章 编程题 三(3)小题)

    span class token punctuation span span class token number 3 span span class token punctuation span 编写一个体现MVC结构的GUI程序 首先编
  • VMware安装Centos7系统(命令行模式)

    文章目录 一 准备软件 系统镜像二 创建新虚拟机三 安装CentOS7系统四 配置固定IP便于远程管理 一 准备软件 系统镜像 软件 xff1a VMware 14 镜像 xff1a CentOS7 镜像官网下载地址 xff1a http
  • mariadb(mysql)数据库字符集设置(二)(centos7)

    mariadb xff08 mysql xff09 数据库在存储数据时 xff0c 默认编码为latinl xff0c 当存储数据为中文字符时 xff0c 在显示或者web调用时会显示为乱码 xff0c 为解决该乱码问题 xff0c 需修改
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • ubuntu安装chrome报错libnss3

    1 下载官网提供的最新版本 xff08 注意区分32位和64位 xff09 2 进入到文件所在路径 xff0c 执行安装命令 xff1a cd Downloads Downloads sudo dpkg i google chrome st
  • 16-命令模式Quarkus实现

    摘要 xff1a 本文用一个实例场景描述Gof 23设计模式中的命令 xff08 Command xff09 模式 xff0c 并用Quarkus框架代码给予实现 xff0c 同时也给出实现代码的UML模型 关键字 xff1a Gof 23
  • ubuntu16.04设置root用户登陆图形界面的方法

    因为 ubuntu 默认不能使用root登录图形界面 xff0c 且Ubuntu默认的是root用户不能登录图形界面的 xff0c 只能以其他用户登录图形界面 这样就很麻烦 xff0c 因为权限的问题 xff0c 不能随意复制删除文件 xf
  • 详解MariaDB数据库的存储过程

    1 什么是存储过程 很多时候 xff0c SQL语句都是针对一个或多个表的单条语句 但是也有时候有的查询语句需要进行多次联表查询才能完成 xff0c 此时就需要用到存储过程了 存储过程 xff08 Stored Procedure xff0
  • Tensorflow读取数据--TFrecord格式

    一 什么是Tfrecord xff1f TFRecords可以允许你讲任意的数据转换为TensorFlow所支持的格式 xff0c 这种方法可以使TensorFlow的数据集更容易与网络应用架构相匹配 这种建议的方法就是使用TFRecord