什么是 TFRecord

PS:这段内容摘自 http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/reading_data.html

一种保存记录的方法可以允许你讲任意的数据转换为TensorFlow所支持的格式, 这种方法可以使TensorFlow的数据集更容易与网络应用架构相匹配。这种建议的方法就是使用TFRecords文件,TFRecords文件包含了tf.train.Example 协议内存块(protocol buffer)(协议内存块包含了字段 Features)。你可以写一段代码获取你的数据, 将数据填入到Example协议内存块(protocolbuffer),将协议内存块序列化为一个字符串, 并且通过tf.python_io.TFRecordWriterclass写入到TFRecords文件。tensorflow/g3doc/how_tos/reading_data/convert_to_records.py就是这样的一个例子。
            从TFRecords文件中读取数据,
可以使用tf.TFRecordReader的tf.parse_single_example解析器。这个parse_single_example操作可以将Example协议内存块(protocolbuffer)解析为张量。
MNIST的例子就使用了convert_to_records 所构建的数据。
请参看tensorflow/g3doc/how_tos/reading_data/fully_connected_reader.py,

代码

adjust_pic.py

单纯的转换图片大小

  1. # -*- coding: utf-8 -*-
  2. import tensorflow as tf
  3. def resize(img_data, width, high, method=0):
  4. return tf.image.resize_images(img_data,[width, high], method)

pic2tfrecords.py

将图片保存成TFRecord

  1. # -*- coding: utf-8 -*-
  2. # 将图片保存成 TFRecord
  3. import os.path
  4. import matplotlib.image as mpimg
  5. import tensorflow as tf
  6. import adjust_pic as ap
  7. from PIL import Image
  8. SAVE_PATH = 'data/dataset.tfrecords'
  9. def _int64_feature(value):
  10. return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
  11. def _bytes_feature(value):
  12. return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
  13. def load_data(datafile, width, high, method=0, save=False):
  14. train_list = open(datafile,'r')
  15. # 准备一个 writer 用来写 TFRecord 文件
  16. writer = tf.python_io.TFRecordWriter(SAVE_PATH)
  17. with tf.Session() as sess:
  18. for line in train_list:
  19. # 获得图片的路径和类型
  20. tmp = line.strip().split(' ')
  21. img_path = tmp[0]
  22. label = int(tmp[1])
  23. # 读取图片
  24. image = tf.gfile.FastGFile(img_path, 'r').read()
  25. # 解码图片(如果是 png 格式就使用 decode_png)
  26. image = tf.image.decode_jpeg(image)
  27. # 转换数据类型
  28. # 因为为了将图片数据能够保存到 TFRecord 结构体中,所以需要将其图片矩阵转换成 string,所以为了在使用时能够转换回来,这里确定下数据格式为 tf.float32
  29. image = tf.image.convert_image_dtype(image, dtype=tf.float32)
  30. # 既然都将图片保存成 TFRecord 了,那就先把图片转换成希望的大小吧
  31. image = ap.resize(image, width, high)
  32. # 执行 op: image
  33. image = sess.run(image)
  34. # 将其图片矩阵转换成 string
  35. image_raw = image.tostring()
  36. # 将数据整理成 TFRecord 需要的数据结构
  37. example = tf.train.Example(features=tf.train.Features(feature={
  38. 'image_raw': _bytes_feature(image_raw),
  39. 'label': _int64_feature(label),
  40. }))
  41. # 写 TFRecord
  42. writer.write(example.SerializeToString())
  43. writer.close()
  44. load_data('train_list.txt_bak', 224, 224)

tfrecords2data.py

从TFRecord中读取并保存成图片

  1. # -*- coding: utf-8 -*-
  2. # 从 TFRecord 中读取并保存图片
  3. import tensorflow as tf
  4. import numpy as np
  5. SAVE_PATH = 'data/dataset.tfrecords'
  6. def load_data(width, high):
  7. reader = tf.TFRecordReader()
  8. filename_queue = tf.train.string_input_producer([SAVE_PATH])
  9. # 从 TFRecord 读取内容并保存到 serialized_example 中
  10. _, serialized_example = reader.read(filename_queue)
  11. # 读取 serialized_example 的格式
  12. features = tf.parse_single_example(
  13. serialized_example,
  14. features={
  15. 'image_raw': tf.FixedLenFeature([], tf.string),
  16. 'label': tf.FixedLenFeature([], tf.int64),
  17. })
  18. # 解析从 serialized_example 读取到的内容
  19. images = tf.decode_raw(features['image_raw'], tf.uint8)
  20. labels = tf.cast(features['label'], tf.int64)
  21. with tf.Session() as sess:
  22. # 启动多线程
  23. coord = tf.train.Coordinator()
  24. threads = tf.train.start_queue_runners(sess=sess, coord=coord)
  25. # 因为我这里只有 2 张图片,所以下面循环 2 次
  26. for i in range(2):
  27. # 获取一张图片和其对应的类型
  28. label, image = sess.run([labels, images])
  29. # 这里特别说明下:
  30. #   因为要想把图片保存成 TFRecord,那就必须先将图片矩阵转换成 string,即:
  31. #       pic2tfrecords.py 中 image_raw = image.tostring() 这行
  32. #   所以这里需要执行下面这行将 string 转换回来,否则会无法 reshape 成图片矩阵,请看下面的小例子:
  33. #       a = np.array([[1, 2], [3, 4]], dtype=np.int64) # 2*2 的矩阵
  34. #       b = a.tostring()
  35. #       # 下面这行的输出是 32,即: 2*2 之后还要再乘 8
  36. #       # 如果 tostring 之后的长度是 2*2=4 的话,那可以将 b 直接 reshape([2, 2]),但现在的长度是 2*2*8 = 32,所以无法直接 reshape
  37. #       # 同理如果你的图片是 500*500*3 的话,那 tostring() 之后的长度是 500*500*3 后再乘上一个数
  38. #       print len(b)
  39. #
  40. #   但在网上有很多提供的代码里都没有下面这一行,你们那真的能 reshape ?
  41. image = np.fromstring(image, dtype=np.float32)
  42. # reshape 成图片矩阵
  43. image = tf.reshape(image, [224, 224, 3])
  44. # 因为要保存图片,所以将其转换成 uint8
  45. image = tf.image.convert_image_dtype(image, dtype=tf.uint8)
  46. # 按照 jpeg 格式编码
  47. image = tf.image.encode_jpeg(image)
  48. # 保存图片
  49. with tf.gfile.GFile('pic_%d.jpg' % label, 'wb') as f:
  50. f.write(sess.run(image))
  51. load_data(224, 224)

train_list.txt_bak 中的内容如下:

image_1093.jpg 13
image_0805.jpg 10

TFRecord 的使用的更多相关文章

  1. Tensorflow 处理libsvm格式数据生成TFRecord (parse libsvm data to TFRecord)

    #写libsvm格式 数据 write libsvm     #!/usr/bin/env python #coding=gbk # ================================= ...

  2. 学习笔记TF016:CNN实现、数据集、TFRecord、加载图像、模型、训练、调试

    AlexNet(Alex Krizhevsky,ILSVRC2012冠军)适合做图像分类.层自左向右.自上向下读取,关联层分为一组,高度.宽度减小,深度增加.深度增加减少网络计算量. 训练模型数据集 ...

  3. [TFRecord格式数据]利用TFRecords存储与读取带标签的图片

    利用TFRecords存储与读取带标签的图片 原创文章,转载请注明出处~ 觉得有用的话,欢迎一起讨论相互学习~Follow Me TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是 ...

  4. 深度学习原理与框架-Tfrecord数据集的读取与训练(代码) 1.tf.train.batch(获取batch图片) 2.tf.image.resize_image_with_crop_or_pad(图片压缩) 3.tf.train.per_image_stand..(图片标准化) 4.tf.train.string_input_producer(字符串入队列) 5.tf.TFRecord(读

    1.tf.train.batch(image, batch_size=batch_size, num_threads=1) # 获取一个batch的数据 参数说明:image表示输入图片,batch_ ...

  5. 深度学习原理与框架-Tfrecord数据集的制作 1.tf.train.Examples(数据转换为二进制) 3.tf.image.encode_jpeg(解码图片加码成jpeg) 4.tf.train.Coordinator(构建多线程通道) 5.threading.Thread(建立单线程) 6.tf.python_io.TFR(TFR读入器)

    1. 配套使用: tf.train.Examples将数据转换为二进制,提升IO效率和方便管理 对于int类型 : tf.train.Examples(features=tf.train.Featur ...

  6. 3. Tensorflow生成TFRecord

    1. Tensorflow高效流水线Pipeline 2. Tensorflow的数据处理中的Dataset和Iterator 3. Tensorflow生成TFRecord 4. Tensorflo ...

  7. TFRecord文件的读写

    前言在跑通了官网的mnist和cifar10数据之后,笔者尝试着制作自己的数据集,并保存,读入,显示. TensorFlow可以支持cifar10的数据格式, 也提供了标准的TFRecord 格式,而 ...

  8. 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练

    将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...

  9. tfrecord

    制作自己的TFRecord数据集,读取,显示及代码详解 http://blog.csdn.net/miaomiaoyuan/article/details/56865361

  10. 3 TFRecord样例程序实战

    将图片数据写入Record文件 # 定义函数转化变量类型. def _int64_feature(value): return tf.train.Feature(int64_list=tf.train ...

随机推荐

  1. 51nod 1201:整数划分 超级好的DP题目

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} { ...

  2. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

  3. 大数据高可用集群环境安装与配置(10)——安装Kafka高可用集群

    1. 获取安装包下载链接 访问https://kafka.apache.org/downloads 找到kafka对应版本 需要与服务器安装的scala版本一致(运行spark-shell可以看到当前 ...

  4. oracle查询语句注意事项:

    我想查出datatype 不等于1的所有结果,包括空. '; //这条sql查不出datatype为空的数据 发现oracle需要使用  is  null  .is  not null查询空或非空 ' ...

  5. Java学习笔记(一) 面向对象---封装

    面向对象---封装 封装是面向对象思想的三大特征之一. 理解: 隐藏对象的属性和实现细节,仅对外提供公共访问方式. 优点: 将变化隔离 便于使用 提升代码复用性 提高安全性 封装原则: 将不需要对外提 ...

  6. React yarn安装umi后 umi -v查询版本失败

    采坑描述:yarn全局安装模块后但仍提示无法找到 解决: 1.先查看一下yarn的bin目录,输入yarn global bin 2.然后将该路径加入到path中,对于windows中直接将该目录加入 ...

  7. 文献阅读报告 - Context-Based Cyclist Path Prediction using RNN

    原文引用 Pool, Ewoud & Kooij, Julian & Gavrila, Dariu. (2019). Context-based cyclist path predic ...

  8. 第二阶段scrum-2

    1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 正在连接配置数据库部分

  9. UVA 11997 The K smallest Sums

    给出K*K的矩阵,每一行取一个数,构成K个数的和,总共有 k^k种可能,从中取出前k个最小的. 一开始犯了错,因为只要对每行排序,最小的必定是第一列的和,然后我当时就想着,逐步推进,每次将某行的那个数 ...

  10. 吴裕雄--天生自然 PHP开发学习:echo 和 print 语句

    <?php echo "<h2>PHP 很有趣!</h2>"; echo "Hello world!<br>"; ec ...