Tensorflow数据读取有三种方式:
-
<李>加载数据:预加载数据李>
<李>喂养:Python产生数据,再把数据喂给后端。李>
<李>阅读文件:从文件中直接读取李>
这三种有读取方式有什么区别呢?我们首先要知道TensorFlow (TF)是怎么样工作的。
TF的核心是用c++写的,这样的好处是运行快,缺点是调用不灵活。而Python恰好相反,所以结合两种语言的优势,涉及计算的核心算子和运行框架是用c++写的,并提供API给Python.Python调用这些API,设计训练模型(图),再将设计好的图给后端去执行。简而言之,Python的角色是设计,c++是运行。
进口tensorflow特遣部队 #设计图 x1=特遣部队。常数([2、3、4) x2=特遣部队。常数([4,0,1]) y=特遣部队。add (x1, x2) #打开一个会议,在计算y 与tf.Session税(): 打印sess.run (y) >之前
进口tensorflow特遣部队 #设计图 x1=tf.placeholder (tf.int16) x2=tf.placeholder (tf.int16) y=特遣部队。add (x1, x2) #用Python产生数据 li1=(2、3、4) li2=[4, 0, 1] #打开一个会议,在喂数据——比;计算y 与tf.Session税(): 打印sess.run (y, feed_dict={x1: li1 x2: li2}) >之前说明:在这里x1, x2只是占位符,没有具体的值,那么运行的时候去哪取值呢?这时候就要用到sess.run()中的feed_dict参数,将Python产生的数据喂给后端,并计算y。
这两种方案的缺点:
1,预加载:将数据直接内嵌到图中,再把图传入会话中运行。当数据量比较大时,图形的传输会遇到效率问题。
2,用占位符替代数据,待运行的时候填充数据。
前两种方法很方便,但是遇到大型数据的时候就会很吃力,即使是喂养,中间环节的增加也是不小的开销,比如数据类型转换等等。最优的方案就是在图定义好文件读取的方法,让TF自己去从文件中读取数据,并解码成可使用的样本集。
1,准备数据,构造三个文件,A.csv, B.csv, C.csv
$ echo - e "α1 A1 \ nAlpha2 A2 \ nAlpha3 A3”比;A.csv $ echo - e " Bee1、B1 \ nBee2 B2 \ nBee3 B3”比;B.csv $ echo - e " Sea1, C1 \ nSea2 C2 \ nSea3 C3”比;C。csv2,单个读者,单个样本
# - * -编码:utf - 8 - * 进口tensorflow特遣部队 #生成一个先入先出队列和一个QueueRunner,生成文件名队列 文件名=['。csv ', ' B。csv”、“C.csv '] filename_queue=tf.train。string_input_producer(文件名,洗牌=False) #定义读者 读者=tf.TextLineReader () 键,值=https://www.yisu.com/zixun/reader.read (filename_queue) #定义译码器 例子中,标签=tf.decode_csv(价值,record_defaults=[[‘零’],[‘零’]]) # example_batch, label_batch=tf.train。shuffle_batch(示例中,标签,batch_size=1,能力=200,min_after_dequeue=100, num_threads=2) #运行图 与tf.Session税(): coord=tf.train.Coordinator() #创建一个协调器,管理线程 线程=tf.train.start_queue_runners (coord=coord) #启动QueueRunner,此时文件名队列已经进队。 因为我在范围(10): 打印example.eval (), label.eval () coord.request_stop () coord.join(线程)说明:这里没有使用tf.train。shuffle_batch,会导致生成的样本和标签之间对应不上,乱序了。生成结果如下:
α1 A2
引用>
Alpha3 B1
Bee2 B3
Sea1 C2
Sea3 A1
Alpha2 A3
Bee1 B2
Bee3 C1
Sea2 C3
α1 A2解决方案:用tf.train。shuffle_batch,那么生成的结果就能够对应上。
# - * -编码:utf - 8 - * 进口tensorflow特遣部队 #生成一个先入先出队列和一个QueueRunner,生成文件名队列 文件名=['。csv ', ' B。csv”、“C.csv '] filename_queue=tf.train。string_input_producer(文件名,洗牌=False) #定义读者 读者=tf.TextLineReader () 键,值=https://www.yisu.com/zixun/reader.read (filename_queue) #定义译码器 例子中,标签=tf.decode_csv(价值,record_defaults=[[‘零’],[‘零’]]) example_batch label_batch=tf.train。shuffle_batch(示例中,标签,batch_size=1,能力=200,min_after_dequeue=100, num_threads=2) #运行图 与tf.Session税(): coord=tf.train.Coordinator() #创建一个协调器,管理线程 线程=tf.train.start_queue_runners (coord=coord) #启动QueueRunner,此时文件名队列已经进队。 因为我在范围(10): e_val l_val=sess.run ([example_batch label_batch]) 打印e_val, l_val coord.request_stop () coord.join(线程)详解tensorflow载入数据的三种方式