什么是 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. 倍增求LCA(最近公共祖先)

    P3379 [模板]最近公共祖先(LCA) 题目描述: 读入一棵以1为根的树,q次询问,每次给定x和y,问x和y的最近公共祖先是哪一个节点. 树的读入格式:n-1行每行两个整数x.y,表示一条连接x和 ...

  2. Maccms后门分析复现(并非官网的Maccms){10.15 第二十二天}

    该复现参考网络中的文章,该漏洞复现仅仅是为了学习交流,严禁非法使用!!!! Maccms官网:http://www.maccms.cn/ Maccms网站基于PHP+MYSQL的系统,易用性.功能良好 ...

  3. jQuery表格隔行换色和全选的实现

    1.下载jQuery,并导入:https://blog.csdn.net/weixin_44718300/article/details/88746796 2.代码实现: <!DOCTYPE h ...

  4. jsp页面引入不了js路径没错

    最近搞开发,发现有个jsp页面引入不了js:很是神奇,路径什么的都没问题,同事的浏览器可以加载该js,发现放到其他的文件夹下可以加载该js:当时没研究出来,任务紧就没研究了. 最近闲下来了,有去研究, ...

  5. html 鼠标样式 鼠标悬停 小手样式

    在style中添加cursor:pointer 实现鼠标悬停变成小手样式 先来一个示例 <div style="float:right"> <a class=&q ...

  6. HDU _2546 01背包问题

    A - 饭卡 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  7. 标准JAVA工程结构

  8. LIS是什么?【质量控制】

    继续[LIS是什么?]中提到的[质量控制]. Ⅱ.质量控制要求非常专业,现在只说一说个人理解,以下仅为LIS检验中部分理解,实际上实验室质量控制还包含的报告时效,实验室温度.湿度等等一系列内容,是一个 ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring体系结构详解

    Spring 框架采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为 Data Access/Integration.Web.AOP.Aspects.Messaging.Instrum ...

  10. Nginx之epoll和select poll

    epoll和 select poll 都是做I/O多路复用的. 区别在于: epoll较灵活,如果有一百万个链接状态同时保持,但是在某个时刻,只有几百个链接是活跃的.epoll的处理是通过epoll_ ...