当前位置:   article > 正文

tensorflow读取训练数据方法_tensorflow sess.run keep=

tensorflow sess.run keep=

1. 预加载数据 Preloaded data


  1. # coding: utf-8
  2. import tensorflow as tf
  3. # 设计Graph
  4. x1 = tf.constant([2, 3, 4])
  5. x2 = tf.constant([4, 0, 1])
  6. y = tf.add(x1, x2)
  7. with tf.Session() as sess:
  8. print sess.run(y)
  9. # output:
  10. # [6 3 5]

预加载数据方式是将训练数据直接内嵌到tf的图中,需要提前将数据加载到内存里,在数据量比较大,或者说在实际训练中,基本不可行。



2. 声明占位符,运行时Feeding数据


  1. # coding: utf-8
  2. import tensorflow as tf
  3. # 设计Graph
  4. x1 = tf.placeholder(tf.int16)
  5. x2 = tf.placeholder(tf.int16)
  6. epoch_num = 0
  7. # 用Python产生数据
  8. data = [2, 3, 4]
  9. label= [1, 0, 1]
  10. with tf.Session() as sess:
  11. while epoch_num <len(data):
  12. print sess.run((x1,x2), feed_dict={x1: data[epoch_num], x2: label[epoch_num]})
  13. epoch_num+=1
  14. # output:
  15. # (array(2, dtype=int16), array(1, dtype=int16))
  16. # (array(3, dtype=int16), array(0, dtype=int16))
  17. # (array(4, dtype=int16), array(1, dtype=int16))
声明占位符是在训练过程中Feeding填充数据,可以选择把所有数据一次性加载到内存,每次取一个batch的数据出来训练,也可以选择把数据通过python建立一个生成器,每次加载一个batch的数据出来训练,加载方式比较灵活但是效率相对比较低。


3. 从文件直接读取数据


从文件读取数据的方式是在Graph图中定义好文件读取的方式,在Session会话中启动(一个或多个)线程,把训练数据异步加载到内存(样本)队列中(先加载到文件名队列中,tf自动读取到内存队列中),通过队列管理器进行管理,执行效率较高,工作流程示意图:





  1. # -*- coding:utf-8 -*-
  2. import tensorflow as tf
  3. import numpy as np
  4. # 样本个数
  5. sample_num = 5
  6. # 设置迭代次数
  7. epoch_num = 2
  8. # 设置一个批次中包含样本个数
  9. batch_size = 3
  10. # 计算每一轮epoch中含有的batch个数
  11. batch_total = int(sample_num / batch_size) + 1
  12. # 生成4个数据和标签
  13. def generate_data(sample_num=sample_num):
  14. labels = np.asarray(range(0, sample_num))
  15. images = np.random.random([sample_num, 224, 224, 3])
  16. print('image size {},label size :{}'.format(images.shape, labels.shape))
  17. return images, labels
  18. def get_batch_data(batch_size=batch_size):
  19. images, label = generate_data()
  20. # 数据类型转换为tf.float32
  21. images = tf.cast(images, tf.float32)
  22. label = tf.cast(label, tf.int32)
  23. # 从tensor列表中按顺序或随机抽取一个tensor准备放入文件名称队列
  24. input_queue = tf.train.slice_input_producer([images, label], num_epochs=epoch_num, shuffle=False)
  25. # 从文件名称队列中读取文件准备放入文件队列
  26. image_batch, label_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=2, capacity=64,
  27. allow_smaller_final_batch=False)
  28. return image_batch, label_batch
  29. image_batch, label_batch = get_batch_data(batch_size=batch_size)
  30. with tf.Session() as sess:
  31. # 先执行初始化工作
  32. sess.run(tf.global_variables_initializer())
  33. sess.run(tf.local_variables_initializer())
  34. # 开启一个协调器
  35. coord = tf.train.Coordinator()
  36. # 使用start_queue_runners 启动队列填充
  37. threads = tf.train.start_queue_runners(sess, coord)
  38. try:
  39. while not coord.should_stop():
  40. print '************'
  41. # 获取每一个batch中batch_size个样本和标签
  42. image_batch_v, label_batch_v = sess.run([image_batch, label_batch])
  43. print(image_batch_v.shape, label_batch_v)
  44. except tf.errors.OutOfRangeError: # 如果读取到文件队列末尾会抛出此异常
  45. print("done! now lets kill all the threads……")
  46. finally:
  47. # 协调器coord发出所有线程终止信号
  48. coord.request_stop()
  49. print('all threads are asked to stop!')
  50. coord.join(threads) # 把开启的线程加入主线程,等待threads结束
  51. print('all threads are stopped!')
  52. # output:
  53. # image size (5, 224, 224, 3),label size :(5,)
  54. # ************
  55. # ((3, 224, 224, 3), array([0, 1, 2], dtype=int32))
  56. # ************
  57. # ((3, 224, 224, 3), array([3, 0, 4], dtype=int32))
  58. # ************
  59. # ((3, 224, 224, 3), array([1, 2, 3], dtype=int32))
  60. # ************
  61. # done! now lets kill all the threads……
  62. # all threads are asked to stop!
  63. # all threads are stopped!

与从文件直接读取训练数据对应的还有一种方式是先把数据写入TFRecords二进制文件,再从队列中读取

TFRecords方式相比直接读取训练文件,效率更高,特别是在训练文件比较多的情况下,缺点是需要额外编码处理TFRecords,不够直观。



4. Tensorflow 动态图机制(Eager Execution)下的Dataset数据读取


Tensorflow动态图机制支持图上的运算动态执行,更方便网络模型搭建和程序调试,不再需要通过sess.run()才能执行所定义的运算,调试时可以直接查看变量的值,做到了“所见即所得”,动态图运算应该是未来tensorflow发展的方向。

动图模式下就必须使用Dataset API来读取数据

tensorflow 1.3 版本中,Dataset API是在contrib包的,1.4以后版本中,Dataset 放到了data中:

  1. tf.contrib.data.Dataset #1.3
  2. tf.data.Dataset # 1.4


Dataset 读取数据示例:

  1. # -*- coding:utf-8 -*-
  2. import tensorflow as tf
  3. import numpy as np
  4. dataset = tf.contrib.data.Dataset.from_tensor_slices(np.array([0,1,2,3,4,5]))
  5. iterator = dataset.make_one_shot_iterator()
  6. one_element = iterator.get_next()
  7. with tf.Session() as sess:
  8. for i in range(5):
  9. print(sess.run(one_element))
  10. # output:
  11. # 0
  12. # 1
  13. # 2
  14. # 3
  15. # 4


Dataset 读取训练图片文件示例:

  1. # 将图片文件名列表中的图片文件读入,缩放到指定的size大小
  2. def _parse_function(filename, label, size=[128,128]):
  3. image_string = tf.read_file(filename)
  4. image_decoded = tf.image.decode_image(image_string)
  5. image_resized = tf.image.resize_images(image_decoded, size)
  6. return image_resized, label
  7. # 图片文件名列表
  8. filenames = tf.constant(["/var/data/image1.jpg", "/var/data/image2.jpg", ...])
  9. # 图片文件标签
  10. labels = tf.constant([0, 37, ...])
  11. # 建立一个数据集,它的每一个元素是文件列表的一个切片
  12. dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
  13. # 对数据集中的图片文件resize
  14. dataset = dataset.map(_parse_function)
  15. # 对数据集中的图片文件组成一个一个batch,并对数据集扩展10次,相当于可以训练10轮
  16. dataset = dataset.shuffle(buffersize=1000).batch(32).repeat(10)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/123918
推荐阅读
相关标签
  

闽ICP备14008679号