text TF数据读取机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text TF数据读取机制相关的知识,希望对你有一定的参考价值。

第一种读取训练验证测试数据是通过feed_dict来传入,自己手写数据读取,排列,解析,生成batch,通过placeholder输入到graph中。
第二种直接从文件中读取。这里写的是第二种,通过tensorflow自带API来实现:
使用tf.train.string_input_producer函数把我们需要的全部文件打包为一个tf内部的queue类型,之后tf开文件就从这个queue中取目录了,要注意一点的是这个函数的shuffle参数默认是True,也就是你传给他文件顺序是1234,但是到时候读就不一定了。
  files_in = ["./data/data_batch%d.bin" % i for i in range(1, 6)]  这里传入的所有的训练/验证/测试数据文件名称
  files = tf.train.string_input_producer(files_in,#原始文件位置队列
                          num_epochs=None,#每份数据要重复读取几次,也就是迭代的次数
                          shuffle=True,   #是否在队列中打乱顺序
                          seed=None,  #种子
                          capacity=32,#队列最大容量
                          shared_name=None,
                          name=None,
                          cancel_op=None)
不同reader对应不同的文件结构,比如bin文件用tf.FixedLengthRecordReader,而TFRecord文件采用tf.TFRecordReader,如果要读什么别的结构也有相应的reader:
  reader = tf.FixedLengthRecordReader(record_bytes=1+32*32*3)
用reader的read方法,reader从这个queue中取一个文件目录,然后打开它一次读取,reader的返回是一个tensor:
  key, value = reader.read(files)  #这里key,value只是对应一份数据不是files_in中指定的所有数据。此处key代指该份数据所在的位置,类型是tensor;value则是原始文件内容。cifar10比较特殊,它的原始数据把标签和图片数据放在了同一个文件中,所以下面要解析value得到label。
对这个tensor做些数据与处理:
  data = tf.decode_raw(value, tf.uint8)
  label = tf.cast(tf.slice(data, [0], [1]), tf.int64)
  raw_image = tf.reshape(tf.slice(data, [1], [32*32*3]), [3, 32, 32])
  image = tf.cast(tf.transpose(raw_image, [1, 2, 0]), tf.float32)

  lr_image = tf.image.random_flip_left_right(image)
  br_image = tf.image.random_brightness(lr_image, max_delta=63)
  rc_image = tf.image.random_contrast(br_image, lower=0.2, upper=1.8)

  std_image = tf.image.per_image_standardization(rc_image)
用tf.train.batch或者tf.train.shuffle_batch这个函数把一个一个小样本的tensor打包成一个高一维度的样本batch:
  images, labels = tf.train.batch([std_image, label],batch_size=100,num_threads=16,capacity=int(50000* 0.4 + 3 * batch_size))
tf.train.start_queue_runners(sess=sess)这一步一定要运行,且其位置要在定义好读取graph之后,在真正run之前,其作用是把queue里边的内容初始化,不跑这句一开始string_input_producer那里就没用,整个读取流水线都没用了:
  training_images = tf.train.batch(XXXXXXXXXXXXXXX)
  tf.train.start_queue_runners(sess=self.sess)
  real_images = sess.run(training_images)
image和label一定要一起run:
  real_images, real_labels = sess.run([training_images, training_labels])  这里调用一次就得到一个批次的data
然后再将其feed_dict给x和y。

以上是关于text TF数据读取机制的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow入门8 -- 导入数据之Dataset机制

TensorFlow:tf.summary.text 和换行符

tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数(转)

tensorflow读取数据

tf 数据读取

Tensorflow显示图片