详解Tensorflow数据读取有三种方式(next_batch)

  

  
      <李>加载数据:预加载数据李   <李>喂养: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)      

<强>二,python产生数据,再将数据喂给后端

        进口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自己去从文件中读取数据,并解码成可使用的样本集。
  

  

<强>三,从文件中读取,简单来说就是将数据读取模块的图搭好

  

详解Tensorflow数据读取有三种方式(next_batch)

  

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。csv      

2,单个读者,单个样本

        # - * -编码: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数据读取有三种方式(next_batch)