tensorflow的数据读取

转载一下文章:
https://blog.csdn.net/duanyajun987/article/details/82352596
文件写入与读取
tensorflow程序读取数据一种3中方法

  • 供给数据(feeding):在tensorflow程序运行的每一步,让python代码供给数据
  • 从文件读取数据:在tensorflow图的起始,让一个输入管道从文件中读取数据
  • 预加载数据:在tensorflow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)

1.预加载数据:

import tensorflow as tf
x1=tf.constant([2,3,4])
x2=tf.constant([4,0,1])

y=tf.add(x1,x2)

with tf.Session() as sess:
	print(sess.run(y))

x1,x2保存具体的值,将数据直接内嵌到图中,再将图传入会话中执行,当数据量较大时,图的输出会遇到效率问题。

2.供给数据

import tensorflow as tf
x1=tf.placeholder(tf.int32)
x2=tf.placeholder(tf.int32)
v1=[2,3,4]
v2=[4,0,1]
y=tf.add(x1,x2)
with tf.Session() as sess:
	print(sess.run(y,feed_dict={x1:v1,x2:v2}))

x1,x2只是占位符,跟get_variable和variable定义出的变量不同。没有具体的值,运行的时候需要sess.run()中的feed_dict参数,将python产生的参数传入计算图并计算y。

以上两种方法在遇到大型数据的时候,就很吃力,feed_dict中间环节的增加。最优方案是在计算图中定义好文件读取的方法,让tensorflow自己从文件中读取数据,并解码成可用的样本集。

3.Tensorflow中的队列机制,从文件读取数据

从文件中读取数据的方法有很多,从文本里写入图片数据的路径和标签,用tensorflow的read_file()读入图片;也可以将图片和标签的值直接存放在CSV或者txt文件。

  • 从字典结构的数据文件读取
  • 从bin文件读取
  • 从CSV(TXT)读取
  • 从原图读取
  • TFRecord格式文件的读取

Tensorflow的队列机制:
通过多线程将读取与计算数据两个操作分开,海量数据无法一次性载入内存,需要一边从硬盘中读取,一边进行训练,为了加快训练速度,可以采用多个线程读取数据,一个线程消耗数据。
Tensorflow中Queue的概念和用法

  • Queue是TF队列和缓存机制的实现
  • QueueRunner是TF中对操作Queue的线程的封装
  • Coordinator是TF中用来协调线程运行的工具
    三者互相配合也可以单独使用

1.Queue
根据实现方式不同,分成以下几种类型:

  • tf.FIFOQueu:按先入先出顺序的队列
  • tf.RandomShuffleQueue:随机顺序出列的队列
  • tf.PaddingFIFOQueue:以固定长度批量出列的队列
  • tf.PriorityQueue:带优先级出列的队列
  • 。。。
    上述类型创建使用方法基本相同
    创建函数的参数:
    tf.FIFOQueue(capacity,dbytes,shapes=None,names=None,shared_name=None,name=“fifo_queue”)
    Queue主要包含入列enqueue和出列的dequeue两个操作。队列本身也是图中的一个节点,其他节点(enqueue和dequeue)可以修改队列节点中的内容。enqueue操作返回计算图中的Operation节点,dequeue操作返回一个Tensor值。Tensor在创建时同样只是一个定义(或“声明”),需要在Session中运行才能获得真正的数值。
    2.QueueRunner
    在数据输入的应用场景中,入队操作从硬盘上读取,放入内存中,速度较慢。使用QueueRunner可以创建一系列新的线程进行入队操作,让主线程继续使用数据。如果在神经网络训练场景中,就是训练网络和读取数据是异步的,主线程在训练网络,另一个线程在将数据从硬盘读入内存。
q=tf.FIFOQueue(10,"float")
counter=tf.Variable(0.0)
increment_op=tf.assign_add(counter,1.0)
enqueue_op=q.enqueue(counter)
qr=tf.train.QueueRunner(q,enqueue_ops=[increment_op,enqueue]*2])
#主线程
sess=tf.Session()
sess.run(tf.initialize_all_variables())
#启动入队线程
enqueue_threads=qr.create_threads(sess,start=True)
#主线程
for i in range(0,10):
	print(sess.run(q.dequeue()))

没有使用sess.close()主线程就没有结束,入队线程也会一直运行。
增加计数的线程不断在后台运行,执行入队的线程会先执行10次,因为队列长度只有10,然后主线程开始消费,当一部分数据消费后,入队的进行又会开始执行,最终主线程消费完10个数据后停止,但其他线程继续运行,程序不会结束,如果使用功能sess.close()则该线程停止,且入队线程会报错。因为会话停止。
因为tensorflow在图上进行,要驱动一张图进行运算,必须送入数据,如果没有数据,则sess.run()无法执行,tf也不会报错,会一直挂起,等待数据准备好。
3.Coordinator
是用来保存线程组运行状态的协调器对象,可以单独和python线程使用。

将QueueRunner和Coordinator一起使用,当任何一个线程出现异常时,能够正常结束整个程序,同时主线程也可以直接调用request_stop()方法来停止所有子线程的执行。

从文件中读取数据

1.从字典结构的数据文件读取(python数据格式)
创建字典结构的数据文件:

  • 先要准备好图片结构,使用功能opencv进行图像读取
  • 把cv2.imread()读取到的图像进行裁切、扭曲等处理
  • 使用numpy对数据进行处理,比如维度合并
  • 把处理好的每一张图像的数据和标签分别存放在对应的list或ndarray中
  • 创建一个字典,包含两个元素,"data"和“labels”,分别赋值为上面的list
  • 使用功能pickle模块对字典进行序列化,并保存到文件中
    针对图片较多的情况,不太可能把所有图像都写入文件,可以分批把图像写入几个文件中。
    2.从bin文件读取
    bin文件需要一定长度的size格式存储,比如每个样本的值占多少字节,label占多少字节。这对于每个样本都是固定的,然后一个接一个存储,因此可以使用tf.FixedLengthRecordReader类每次读取固定长度的字节,正好可以对应一个样本存储的字节,并用tfdecode_raw进行解析。
    具体操作详见上述参考文章。
    3.从CSV(TXT)文件读取
    数据量不是很大的时候,可以从CSV或者TXT 文件进行读取。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow是一个开源的机器学习框架,通常用于创建神经网络模型。在训练模型之前,需要准备好数据集,本文将介绍如何使用TensorFlow读取数据TensorFlow提供了多种读取数据的方法,其中最常用的是使用tf.data模块。首先,我们需要定义一个数据集对象,并通过读取文件的方式将数据加载进来。TensorFlow支持多种文件格式,如csv、txt、json、tfrecord等,可以根据自己的需求选择合适的格式。 加载数据后,我们可以对数据进行一些预处理,比如做数据增强、进行归一化等操作。预处理完数据后,我们需要将数据转化为张量类型,并将其打包成batch。通过这种方式,我们可以在每次训练中同时处理多个数据。 随后,我们可以使用tf.data.Dataset中的shuffle()函数打乱数据集顺序,防止模型只学习到特定顺序下的模式,然后使用batch()函数将数据划分成批次。最后,我们可以使用repeat()函数让数据集每次可以被使用多次,达到更好的效果。 在TensorFlow中,我们可以通过输入函数将数据集传入模型中,使模型能够直接从数据集中读取数据。使用输入函数还有一个好处,即能够在模型训练时动态地修改数据的内容,特别是在使用esimator模块进行模型训练时,输入函数是必须要的。 总结一下,在TensorFlow读取数据的流程如下:定义数据集对象-读取文件-预处理数据-打包数据为batch-打乱数据集-划分批次数据-重复数据集-使用输入函数读取数据。 在实际应用过程中,我们还可以通过其他方式来读取数据,如使用numpy、pandas等工具库,也可以自定义数据集类来处理数据。无论使用何种方式,读取数据都是机器学习训练中重要的一步,需要仔细处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值