什么是 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. C语言拾遗——inttypes.h

    今天偶然间看到这个头文件inttypes,好奇有什么用,去找度娘玩了一波,发现这头文件挺有意思的. 这个头文件适配于C99标准,它提供整数输入的各种进制转换的宏,这是在Ubuntu上扣下来的代码(wi ...

  2. Java算法练习——正则表达式匹配

    题目链接 题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要 ...

  3. 洛谷 P2458 [SDOI2006]保安站岗

    题目传送门 解题思路: 树形DP 可知一个点被控制有且仅有一下三种情况: 1.被父亲节点上的保安控制 2.被儿子节点上的保安控制 3.被当前节点上的保安控制 我们设dp[0/1/2][u]表示u节点所 ...

  4. CF1217B Zmei Gorynich

    You are fighting with Zmei Gorynich — a ferocious monster from Slavic myths, a huge dragon-like rept ...

  5. ETL工具对比

    ETL工具对比 Informatica Kettle 起源 1993年创立于 (美国加利福尼亚州)并于1999年4月在纳斯达克上市 2006年加入了开源BI组织  自2017年9月起,已被(日立集团下 ...

  6. JavaWeb之监听器

    1. 介绍         监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程 ...

  7. POJ - 1631 Bridging signals(最长上升子序列---LIS)

    题意:左右各n个端口,已知n组线路,要求切除最少的线路,使剩下的线路各不相交,按照左端口递增的顺序输入. 分析: 1.设左端口为l,右端口为r,因为左端口递增输入,l[i] < l[j](i & ...

  8. Neo4j--windows下安装neo4j

    参考 https://www.cnblogs.com/ljhdo/archive/2017/05/19/5521577.html 安装包下载 https://neo4j.com/download-ce ...

  9. 什么是控制反转IOC

    1.IOC 是什么 IOC- Inversion of Control , 即“控制反转” ,不是一个技术,而是一个设计思想,在java 开发中,IOC意味着将你设计好的Java 对象交个容器控制,而 ...

  10. 通过Android的API对Sqlite数据库进行操作

    一.增删改查 增 改 查 删 这是删除之前 删除三条 Dao.java package com.example.databasedemo; import android.content.Content ...