最近学习tensorflow,发现其读取数据的方式看起来有些不同,所以又重新系统地看了一下文档,总得来说,tensorflow 有三种主流的数据读取方式:

1) 传送 (feeding): Python 可以在程序的运行过程中,将数据传送进定义好的 tensor 变量中

2) 从文件读取 (reading from files): 一个输入流从文件中直接读取数据

3) 预加载数据 (preloaded data): 这个很好理解,就是将所有的数据一次性全部读进内存里。

对于第三种方式,在数据量小的时候,是非常高效的,但是如果数据量很大的时候,这种方法显然非常耗内存,所以在数据量很大的时候,一般选择第二种读取方式,即从文件读取。在利用第二种方式读取的时候,我们常常会用到一种 TFRecords 的格式来保存读取的文件。TFRecords 是一种二进制文件。可以在TensorFlow 中方便的进行各种存取操作以及预处理。

我们先来看看,如何将一张图片转换成字符流

import os
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import skimage.io as io dir_path = 'Face'
file_list = os.listdir(dir_path) print file_list for f in file_list:
print (dir_path + os.sep + f) img_1 = io.imread(dir_path + os.sep + file_list[0]) #plt.imshow(img_1, cmap='gray')
#plt.show() # 将图像转换成字符
img_str = img_1.tostring() # 将字符流还原成图像
img_rec_vec = np.fromstring(img_str, dtype=np.uint8) img_rec = img_rec_vec.reshape(img_1.shape) #plt.imshow(img_rec, cmap='gray')
#plt.show()

接下来,我们看看,如何生成 TFRecords 文件:


def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) def _int64_feature(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) tfrecords_filename = 'Face.tfrecords' writer = tf.python_io.TFRecordWriter(tfrecords_filename) for img_path in file_list:
img = np.array(io.imread(dir_path + os.sep + img_path)) # 从文件夹里读取图像
# 获取图像的宽和高,图像的维度需要存入 TFRecords 文件中
# 以方便后续的处理
#
height = img.shape[0]
width = img.shape[1] # 将图像转换成字符流
img_raw = img.tostring() # 将字符流以及图像的尺度信息存入TFRecords 文件
example = tf.train.Example(features=tf.train.Features(feature={
'height': _int64_feature(height),
'width': _int64_feature(width),
'image_raw': _bytes_feature(img_raw)})) writer.write(example.SerializeToString()) writer.close()

最后,我们看看如何从 TFrecords 文件中读数据,并且做批处理:


# 可以重新定义图像的宽和高,
IMAGE_HEIGHT = 224
IMAGE_WIDTH = 224 # 定义读取与解码函数
def read_and_decode(filename_queue): reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue) # 获取 features,包含图像,以及图像宽和高
features = tf.parse_single_example(
serialized_example,
features={
'height': tf.FixedLenFeature([], tf.int64),
'width': tf.FixedLenFeature([], tf.int64),
'image_raw': tf.FixedLenFeature([], tf.string),
}) # 获取图像信息
image = tf.decode_raw(features['image_raw'], tf.uint8) height = tf.cast(features['height'], tf.int32)
width = tf.cast(features['width'], tf.int32) # 将图像转换成多维数组的形式
image_shape = [height, width, 1]
image = tf.reshape(image, image_shape) # 重新定义图像的尺度
image_size_const = tf.constant((IMAGE_HEIGHT, IMAGE_WIDTH, 1), dtype=tf.int32) # Random transformations can be put here: right before you crop images
# to predefined size. To get more information look at the stackoverflow
# question linked above. # 对图像进行预处理,包括裁剪,增边等 resized_image = tf.image.resize_image_with_crop_or_pad(image=image,
target_height=IMAGE_HEIGHT,
target_width=IMAGE_WIDTH) return resized_image #
filename_queue = tf.train.string_input_producer(
[tfrecords_filename], num_epochs=10) # Even when reading in multiple threads, share the filename
# queue.
train_images = read_and_decode(filename_queue) # 要注意 min_after_dequeue 不能超过 capacity
image = tf.train.shuffle_batch([train_images],
batch_size=1,
capacity=5,
num_threads=2,
min_after_dequeue=1) # The op for initializing the variables.
init_op = tf.group(tf.global_variables_initializer(),
tf.local_variables_initializer()) with tf.Session() as sess:
sess.run(init_op) coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord) # Let's read off 3 batches just for example
for i in xrange(1):
img = sess.run([image])
img_batch = img[0]
img_1 = tf.reshape(img_batch[0, :, :, :], [IMAGE_HEIGHT, IMAGE_WIDTH])
print (img_1.shape)
plt.imshow(sess.run(img_1), cmap='gray')
# coord.request_stop()
# coord.join(threads) plt.show()
print 'all is well'

参考来源:

http://codecloud.net/16485.html

http://warmspringwinds.github.io/tensorflow/tf-slim/2016/12/21/tfrecords-guide/

https://www.tensorflow.org/programmers_guide/reading_data

机器学习: TensorFlow 的数据读取与TFRecords 格式的更多相关文章

  1. TensorFlow中数据读取之tfrecords

    关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow ...

  2. 由浅入深之Tensorflow(3)----数据读取之TFRecords

    转载自http://blog.csdn.net/u012759136/article/details/52232266 原文作者github地址 概述 关于Tensorflow读取数据,官网给出了三种 ...

  3. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  4. tensorflow之数据读取探究(1)

    Tensorflow中之前主要用的数据读取方式主要有: 建立placeholder,然后使用feed_dict将数据feed进placeholder进行使用.使用这种方法十分灵活,可以一下子将所有数据 ...

  5. 关于Tensorflow 的数据读取环节

    Tensorflow读取数据的一般方式有下面3种: preloaded直接创建变量:在tensorflow定义图的过程中,创建常量或变量来存储数据 feed:在运行程序时,通过feed_dict传入数 ...

  6. Tensorflow学习-数据读取

    Tensorflow数据读取方式主要包括以下三种 Preloaded data:预加载数据 Feeding: 通过Python代码读取或者产生数据,然后给后端 Reading from file: 通 ...

  7. 『TensorFlow』数据读取类_data.Dataset

    一.资料 参考原文: TensorFlow全新的数据读取方式:Dataset API入门教程 API接口简介: TensorFlow的数据集 二.背景 注意,在TensorFlow 1.3中,Data ...

  8. tensorflow之数据读取探究(2)

    tensorflow之tfrecord数据读取 Tensorflow关于TFRecord格式文件的处理.模型的训练的架构为: 1.获取文件列表.创建文件队列:http://blog.csdn.net/ ...

  9. TensorFlow的数据读取机制

    一.tensorflow读取机制图解 首先需要思考的一个问题是,什么是数据读取?以图像数据为例,读取的过程可以用下图来表示 假设我们的硬盘中有一个图片数据集0001.jpg,0002.jpg,0003 ...

随机推荐

  1. Flume Sink Processors官网剖析(博主推荐)

    不多说,直接上干货! Flume Sources官网剖析(博主推荐) Flume Channels官网剖析(博主推荐) Flume Channel Selectors官网剖析(博主推荐) Flume ...

  2. React render return 空行问题

    Uncaught Invariant Violation: App.render(): A valid React element (or null) must be returned. You ma ...

  3. Appium_Java_API

    1. driver.findElement(MobileBy.AndroidUIAutomator("邀请")).click();2. driver.findElementById ...

  4. dbms_stats

    dbms_stats全部的功能包例如以下: GATHER_INDEX_STATS:分析索引信息 GATHER_TABLE_STATS:分析表信息,当cascade为true时,分析表.列(索引)信息 ...

  5. 11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方式。

    <span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</s ...

  6. 汉字的ascii

  7. 异步FIFO设计

    参考http://www.cnblogs.com/BitArt/archive/2013/04/10/3010073.html http://blog.sina.com.cn/s/blog_6d30f ...

  8. C语言深度剖析-----指针数组和数组指针的分析

    指针数组和数组指针的分析 数组类型 定义数组类型 数组指针 这个不可能为数组指针,指向数组首元素 例 指针数组 例    main函数的参数 例 小结

  9. Spring Boot 静态资源处理(转)

    Spring Boot 静态资源处理 Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring Bo ...

  10. Summary Day30

    1.内存管理 1.1 进程中的内存区域划分 代码区   仅仅读常理区    全局区    BSS     堆   栈 1.2 字符串存储形式之间的比較 字符指针,字符数组.字符动态内存 1.3 虚拟内 ...