什么是 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. bat 卸载程序的脚本

    @echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions & ...

  2. NVIDIA TX2--3--NVIDIA Jetson TX2 查看系统版本参数状态及重要指令

    NVIDIA Jetson TX2 查看系统参数状态. 当前博主的TX2更新的版本为:Jetpack 3.3, cuda 9.0.252, cudnn7.0, opencv3.3.1, TensorR ...

  3. mysql字符串操作

    https://h.w.com/lin/h ) 效果: https://h.w.com huangwanlin ) 效果: huang huangwanlin ) 效果: wanlin huangxi ...

  4. Django——URL详解/Django中URL是如何与urls文件匹配的

    URL标准语法 protocol://hostname[:port]/path/[:parameters][?query]#fragment https://i.cnblogs.com/EditPos ...

  5. 第42章 AWR报表的使用

    第42章 AWR报表的使用exec dbms_gather.gather_table_stats('scott','emp');exec dbms_gather_gather_index_stats( ...

  6. lp_wizard 安装和使用

    lp_wizard 安装好之后,安装下面的步骤来和谐: 生成封装安装下面的步骤来做: 封装生成完了之后,注意后缀是 .pad 的需要放入自己的 pad 文件夹,.fsm 的放入 flash 文件夹,. ...

  7. hive的join优化

    “国际大学生节”又称“世界大学生节”.“世界学生日”.“国际学生日”.1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友 ...

  8. 《Thinking in Java》中讲到了final,发现自己有部分地方迷糊

    1.1当给全局的静态字段加上final时,系统是不会给其赋默认值的,若不手动初始化,会编译时错误——Variable 'xxx' might not have been initialized. 1. ...

  9. trove module使用说明

    原文来自:https://github.com/openstack/openstack-manuals/blob/master/doc/user-guide/source/database-modul ...

  10. Java8集合框架——基本知识点

    前言 Java的基础集合框架的内容并不复杂,List.Map.Set 中大概10个常见的集合类,建议多看几遍源码(Java8),然后回过头再来看看这些各路博客总结的知识点,会有一种豁然开朗的感觉. 本 ...