TFRecord文件查看包含的所有Features

TFRecord是TensorFlow推荐的数据格式,便于跨平台和高效处理。由于其二进制特性,直接查看内容较为困难。本文介绍了如何查看TFRecord中包含的Features,强调了在团队合作中快速理解数据结构的重要性,并提供了一个Python脚本来解析和展示TFRecord数据的属性名和类型。
部署运行你感兴趣的模型镜像

TFRecord作为tensorflow中广泛使用的数据格式,它跨平台,省空间,效率高。因为 Tensorflow开发者众多,统一训练时数据的文件格式是一件很有意义的事情,也有助于降低学习成本和迁移成本。

但是TFRecord数据是二进制格式,没法直接查看。因此,如何能够方便的查看TFRecord格式和数据,就显得尤为重要了。

为什么需要查看TFReocrd数据?首先我们先看下常规的写入和读取TFRecord数据的关键过程。

# 1. 写入过程
# 一张图片,我写入了其内容,label,长和宽几个信息
tf_example = tf.train.Example(
        features=tf.train.Features(feature={
            'encoded': bytes_feature(encoded_jpg),
            'label': int64_feature(label),
            'height': int64_feature(height),
            'width': int64_feature(width)}))
# 2. 读取过程
# 定义解析的TFRecord数据格式
def _parse_image(example_proto):
     features = {'encoded':tf.FixedLenFeature((),tf.string),
    'label': tf.FixedLenFeature((), tf.int64),
    'height': tf.FixedLenFeature((), tf.int64),
    'width': tf.FixedLenFeature((), tf.int64)
}
return tf.parse_single_example(example_proto, features)

# TFRecord数据按照Feature解析出对应的真实数据
ds = ds.map(lambda x : _parse_image(x), num_parallel_calls=4)

上面是一个标准的TFRecord数据的写入和读取部分过程,大家应该发现了,读取TFRecord数据的时候,得知道TFRecord数据保存的属性名和类型,任何一项不匹配,都会导致无法获取数据。

如果数据的写入和读取都是自己一个人完成,那就没问题。但是如果写入和读取是跨团队合作时候,如果每次读取数据都得让对方给完整的属性名和属性类型,那效率就太低了。毕竟TFRecord数据已经包含了一切,自己动手丰衣足食。

那么怎么查看TFRecord数据呢?使用python tf.train.Example.FromString(serialized_example)方法,方法的入参是TFRecord包含的数据字符串。

然后,我直接将上诉查看的过程写成了一个py脚本,需要自取。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import tensorflow as tf

# 用法:python trackTFRecord.py True file1 file2 
# trackTFRecord.py 就是当前这个py文件
# True 表示是否输出具体的数据
# file1 file2 表示的是需要查看的TFRecord文件的绝对路径
# 输出说明:tf.float32对应TFRecord的FloatList,tf.int64对应Int64List,tf.string对应BytesList
def main():
    print('TFRecord文件个数为{0}个'.format(len(sys.argv)-2))
    for i in range(2, len(sys.argv)):
        filepath = sys.argv[i]
        with tf.Session() as sess:
            filenames = [filepath]
            # 加载TFRecord数据
            ds = tf.data.TFRecordDataset(filenames)
            ds = ds.batch(10)
            ds = ds.prefetch(buffer_size=tf.contrib.data.AUTOTUNE)
            iterator = ds.make_one_shot_iterator()
            # 为了加快速度,仅仅简单拿一组数据看下结构
            batch_data = iterator.get_next()
            res = sess.run(batch_data)
            serialized_example = res[0]
            example_proto = tf.train.Example.FromString(serialized_example)
            features = example_proto.features
            print('{0} 信息如下:'.format(filepath))
            for key in features.feature:
                feature = features.feature[key]
                ftype = None
                fvalue = None
                if len(feature.bytes_list.value) > 0:
                    ftype = 'bytes_list'
                    fvalue = feature.bytes_list.value
                    
                if len(feature.float_list.value) > 0:
                    ftype = 'float_list'
                    fvalue = feature.float_list.value
                    
                if len(feature.int64_list.value) > 0:
                    ftype = 'int64_list'
                    fvalue = feature.int64_list.value
                
                result = '{0} : {1}'.format(key, ftype)
                if 'True' == sys.argv[1]:
                    result = '{0} : {1}'.format(result, fvalue)
                print(result) 

if __name__ == "__main__":
    main()

下面给大家实例演示,首先先随便找个图片,写入到TFRecord数据

import tensorflow as tf

filename = "/Users/zhanhaitao/Desktop/1.png"
# 使用tf.read_file读进图片数据
image = tf.read_file(filename)
# 主要是为了获取图片的宽高
image_jpeg = tf.image.decode_jpeg(image, channels=3, name="decode_jpeg_picture")
# reshape图片到原始大小2500x2000x3
image_jpeg = tf.reshape(image_jpeg, shape=(2500,2000,3))
# 获取图片shape数据
img_shape = image_jpeg.shape
width = img_shape[0]
height = img_shape[1]
# 将原图片tensor生成bytes对象, image将保存到tfrecord
sess = tf.Session()
image = sess.run(image)
sess.close()
# 定义TFRecords文件的保存路径及其文件名
path_none = "/Users/zhanhaitao/Desktop/a.tfrecord"
# 定义不同压缩选项的TFRecordWriter
writer_none = tf.python_io.TFRecordWriter(path_none, options=None)
# 将外层features生成特定格式的example
example_none = tf.train.Example(features=tf.train.Features(feature={
"float_val":tf.train.Feature(float_list=tf.train.FloatList(value=[9.99])),
"width":tf.train.Feature(int64_list=tf.train.Int64List(value=[width])),
"height":tf.train.Feature(int64_list=tf.train.Int64List(value=[height])),
"image_raw":tf.train.Feature(bytes_list=tf.train.BytesList(value=[image]))
}))
# example系列化字符串
example_str_none = example_none.SerializeToString()
# 将系列化字符串写入协议缓冲区
writer_none.write(example_str_none)

# 关闭TFRecords文件操作接口
writer_none.close()

print("finish to write data to tfrecord file!")

然后,使用上面的脚本看下这个TFRecord数据定义了哪些属性,以及对应的格式,先进入到脚本的目录下,因为图像数据内容太大,影响阅读,就只看属性名和type了:

python trackTFRecord.py False /Users/zhanhaitao/Desktop/a.tfrecord
# 结果,其中bytes_list对应tf.string,int64_list对应tf.int64 float_list对应tf.float32
# image_raw : bytes_list
# width : int64_list
# float_val : float_list
# height : int64_list

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 首先,用户的问题是:“我想查找TFRecord文件上传的相关方法或解决方案 请问TFRecord文件上传的方法”。这是一个关于如何处理TFRecord文件上传的查询。 回顾系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 用户提供了几个引用: - 引用[1]:关于使用tf.data.TFRecordDataset读取TFRecord文件,并进行解码。 - 引用[2]:解释TFRecord是二进制文件包含tf.train.Example,feature是key-value对。 - 引用[3]:关于在Hadoop分布式生成TFRecord文件时的问题。 - 引用[4]:关于文件数据查询、去重和压缩,但用户说“上述引用仅供参考”,并强调参考用户上一次的问题和我的回答。 用户提到:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在对话历史中,用户上一次的问题是:“我想查找TFRecord文件上传的相关方法或解决方案”,这是一个新的查询。之前的交互是系统指令示例,没有实际对话历史。所以,我应该基于当前问题回答。 用户的问题核心是“TFRecord文件上传的方法”。TFRecordTensorFlow数据格式,通常用于高效存储和读取数据。用户可能在问如何上传TFRecord文件到某个系统,比如云存储或服务器。 从引用中提取相关信息: - 引用[1]和[2]提到读取和解析TFRecord文件。 - 引用[3]涉及生成TFRecord文件在分布式系统中。 - 引用[4]是关于文件存储的元数据和去重,可能与上传相关但不直接。 用户说引用仅供参考,所以我需要聚焦于TFRecord文件上传。常见的场景可能包括: 1. **上传到云存储**:如Google Cloud Storage、AWS S3等。 2. **上传到TensorFlow服务**:如用于模型训练或推理。 3. **分布式系统中的上传**:如使用Hadoop或Spark。 用户提到“上传”,意思可能是“upload”,所以可能指向存储位置。 构建回答结构: 1. **理解TFRecord文件**:简要介绍TFRecord是什么,因为它可能影响上传方法。 2. **上传方法**:讨论如何上传TFRecord文件到不同平台。 - 使用云存储SDK(如boto3 for AWS)。 - TensorFlow工具(如tf.io.gfile)。 - 命令行工具(如gsutil for GCS)。 - 在分布式系统中生成和上传(如Hadoop)。 3. **最佳实践**:包括压缩、去重(如引用[4]提到的),但需相关。 4. **示例代码**:提供一些代码片段展示上传过程。 5. **相关问题生成**:结束时生成相关的问题。 回答必须使用中文。 引用标识:在引用相关段落时添加引用标识,如[^1]。但在回答中,我应该基于提供的reference来引用,但用户说引用仅供参考,所以我需要谨慎使用。 用户提供了引用[1]到[4],我可以从中提取点: - [^1]:读取TFRecord文件。 - [^2]:TFRecord结构。 - [^3]:分布式生成问题。 - [^4]:元数据索引和去重。 对于上传,[^4]中的去重和压缩可能相关,如果上传大量文件。 可能的TFRecord文件上传方法: - 直接上传文件:使用标准文件上传方法,但考虑TFRecord二进制格式。 - 集成到数据处理流水线:如使用TensorFlow的tf.data读取后上传。 - 上传到特定服务:如TensorFlow Serving。 生成相关问题: - 如何优化TFRecord文件上传速度? - TFRecord文件在云存储中的最佳实践? - 如何处理大型TFRecord文件的上传? 回答结构: 1. **引言**:解释TFRecord文件的上传场景。 2. **上传方法概述**:列出常见方法。 3. **详细步骤**:提供具体实现。 4. **注意事项**:如引用中的点。 5. **相关问题**。 </think> ### TFRecord文件上传的方法解析 TFRecordTensorFlow中用于高效存储数据的二进制格式文件,通常包含tf.train.Example消息(每个Example由key-value特征组成,例如 `{'image': bytes_feature, 'label': int64_feature}`)[^2]。当涉及到“上传”时,通常指将TFRecord文件从本地环境传输到远程存储或服务(如云存储桶、分布式文件系统或TensorFlow训练集群)。上传方法与标准文件上传类似,但由于TFRecord文件的二进制特性和潜在的大规模数据处理需求,需要考虑性能优化(如压缩、分片)和集成TensorFlow工具链。以下是完整的解决方案,基于实际场景总结。 --- ### 1. TFRecord文件上传的核心方法 TFRecord文件上传的本质是将文件从源位置(如本地磁盘)移动到目标位置(如云存储)。以下是常见方法,结合TensorFlow生态和分布式系统实践。 #### (1) **使用云存储SDK命令行工具** 这是最直接的方法,适用于上传到云存储服务(如Google Cloud Storage、AWS S3)。TFRecord文件作为普通二进制文件处理,无需特殊编码。 - **步骤**: 1. **准备TFRecord文件**:确保文件已正确生成(例如,使用TensorFlow的`tf.io.TFRecordWriter`)。 2. **上传命令**: - 对于Google Cloud Storage (GCS):使用`gsutil`工具。 ```bash # 上传单个文件 gsutil cp local_path/to/your/file.tfrecord gs://your-bucket/path/ # 上传整个目录(批量TFRecord文件) gsutil cp -r local_dir/*.tfrecord gs://your-bucket/path/ ``` - 对于AWS S3:使用`aws s3`命令。 ```bash # 上传文件 aws s3 cp local_file.tfrecord s3://your-bucket/path/ ``` 3. **验证上传**:使用SDK或控制台检查文件完整性。 - **优点**:简单快捷,适合小规模上传。 - **缺点**:手动操作,不适用于自动化流水线;需处理网络延迟和失败重试。 - **参考**:[^4]强调了在亿级文件场景下的元数据索引优化,上传后可结合Elasticsearch建立索引以加速查询。 #### (2) **集成TensorFlow API上传** 在TensorFlow代码中,使用`tf.io.gfile`模块直接在训练流水线中上传文件。这在模型训练或分布式任务中常见,避免额外步骤。 - **步骤**: 1. **读取本地TFRecord文件**:使用`tf.data.TFRecordDataset`解码文件,确保数据可访问[^1]。 2. **上传到远程存储**:利用`tf.io.gfile.copy`或`GFile`接口。 ```python import tensorflow as tf # 定义本地和远程路径 local_path = "local/data.tfrecord" remote_path = "gs://your-bucket/path/data.tfrecord" # 或s3://路径 # 直接复制上传 with tf.io.gfile.GFile(local_path, 'rb') as src_file: with tf.io.gfile.GFile(remote_path, 'wb') as dest_file: dest_file.write(src_file.read()) # 或者使用高级API(自动处理云存储认证) tf.io.gfile.copy(local_path, remote_path, overwrite=True) ``` 3. **处理认证**:确保环境设置好云凭证(如GCP的Service Account JSON)。 - **优点**:代码集成度高,支持自动重试和进度监控;可直接用于tf.data流水线。 - **缺点**:需依赖TensorFlow环境;不适合非Python环境。 - **参考**:[^2]提到TFRecord的二进制结构,上传时无需额外解码,但需验证特征一致性(如上传后使用`tf.data.TFRecordDataset`测试读取)。 #### (3) **分布式上传(通过Hadoop/Spark)** 当TFRecord文件在分布式系统(如Hadoop集群)中生成时,可直接上传到云存储或HDFS,避免本地中间步骤。引用[^3]指出在reducer阶段生成TFRecord时可能遇到解析问题,需确保数据序列化一致。 - **步骤**: 1. **生成TFRecord文件**:在MapReduce或Spark作业中,使用`tf.train.Example`序列化数据。 ```python # 示例:Spark生成TFRecord from pyspark.sql import SparkSession import tensorflow as tf spark = SparkSession.builder.appName("TFRecordUpload").getOrCreate() data_rdd = spark.sparkContext.parallelize([...]) # 输入数据 def create_example(row): # 将数据转为tf.train.Feature feature = tf.train.Feature(bytes_list=tf.train.BytesList(value=[row])) example = tf.train.Example(features=tf.train.Features(feature={"data": feature})) return example.SerializeToString() tfrecord_rdd = data_rdd.map(create_example) ``` 2. **上传到远程存储**:使用分布式文件系统接口。 - 上传到HDFS:`tfrecord_rdd.saveAsTextFile("hdfs://path/")` - 上传到云存储:集成Hadoop兼容工具(如S3A connector)。 ```bash # Hadoop命令上传到S3 hadoop fs -cp hdfs://input/path s3a://your-bucket/path/ ``` 3. **处理常见问题**:如[^3]所述,上传后解析失败可能源于数据类型不一致(如未指定dtype),需在上传前后验证Example格式。 - **优点**:适合大规模数据;自动处理并行上传。 - **缺点**:配置复杂,需处理集群网络和权限。 - **参考**:[^4]的去重算法可集成到此步骤(上传前对文件指纹去重,节省存储空间)。 --- ### 2. 上传优化和注意事项 - **性能优化**: - **压缩上传**:TFRecord文件通常已优化,但大文件可进一步压缩(如Snappy算法,速度快且兼容性好)[^4]。上传前使用Python压缩: ```python import gzip with open('data.tfrecord', 'rb') as f_in: with gzip.open('data.tfrecord.gz', 'wb') as f_out: f_out.write(f_in.read()) # 然后上传压缩文件 ``` - **分片上传**:对于超大文件(>100MB),拆分多个TFRecord文件上传(如`part-0001.tfrecord`),避免网络超时。 - **指纹去重**:上传前应用SHA-1哈希去重(引用[^4]的`deduplicate_files`函数),减少冗余传输。 - **安全与错误处理**: - 确保云存储权限(IAM角色或密钥认证)。 - 添加重试逻辑(如TensorFlow的`tf.data.experimental.service`)。 - **验证上传成功**: - 使用`tf.data.TFRecordDataset`读取远程文件验证: ```python dataset = tf.data.TFRecordDataset("gs://your-bucket/path/file.tfrecord") for example in dataset.take(1): print(tf.train.Example.FromString(example.numpy())) # 解码检查第一个Example ``` --- ### 相关问题 1. 如何优化TFRecord文件上传速度(特别是在高延迟网络中)? 2. TFRecord文件在云存储中如何建立高效索引和元数据查询(类似引用[^4]的Elasticsearch集成)? 3. 在分布式系统中生成TFRecord文件时,如何避免上传后解析失败(引用[^3]的问题)? 如果您有特定上传场景(如云服务商或文件规模),提供更多细节我可以进一步优化解答!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值