如何*实际*读取TensorFlow中的CSV数据?

如何*实际*读取TensorFlow中的CSV数据?,第1张

如何*实际*读取TensorFlow中的CSV数据

我认为您在这里混淆了命令性和图形构造部分。该 *** 作将

tf.train.shuffle_batch
创建一个新的队列节点,并且可以使用一个节点来处理整个数据集。因此,我认为您之所以绞尽脑汁,是因为您
shuffle_batch
在for循环中创建了一堆队列,而没有为其启动队列运行器。

正常的输入管道用法如下所示:

  1. 添加喜欢的节点
    shuffle_batch
    到输入管道
  2. (可选,以防止意外修改图)完成图

-–图形构造结束,命令式编程开始-

  1. tf.start_queue_runners
  2. while(True): session.run()

为了更具可扩展性(避免使用Python
GIL),您可以使用TensorFlow管道生成所有数据。但是,如果性能不是很关键,则可以使用

slice_input_producer.
以下示例将一个numpy数组连接到输入管道:这是一个带有一些
Print
节点的示例,以查看发生了什么(
Print
运行节点时进入stdout的消息)

tf.reset_default_graph()num_examples = 5num_features = 2data = np.reshape(np.arange(num_examples*num_features), (num_examples, num_features))print data(data_node,) = tf.slice_input_producer([tf.constant(data)], num_epochs=1, shuffle=False)data_node_debug = tf.Print(data_node, [data_node], "Dequeueing from data_node ")data_batch = tf.batch([data_node_debug], batch_size=2)data_batch_debug = tf.Print(data_batch, [data_batch], "Dequeueing from data_batch ")sess = tf.InteractiveSession()sess.run(tf.initialize_all_variables())tf.get_default_graph().finalize()tf.start_queue_runners()try:  while True:    print sess.run(data_batch_debug)except tf.errors.OutOfRangeError as e:  print "No more inputs."

你应该看到这样的东西

[[0 1] [2 3] [4 5] [6 7] [8 9]][[0 1] [2 3]][[4 5] [6 7]]No more inputs.

“ 8、9”数字没有填满整个批次,因此没有得到生产。还

tf.Print
可以打印到sys.stdout,因此它们对我来说分别显示在Terminal中。

PS:连接

batch
到手动初始化的队列的最低要求在github问题2193中

另外,出于调试目的,您可能需要

timeout
在会话上进行设置,以使IPython Notebook不挂在空队列出队中。我在会话中使用此帮助器功能

def create_session():  config = tf.ConfigProto(log_device_placement=True)  config.gpu_options.per_process_gpu_memory_fraction=0.3 # don't hog all vRAM  config.operation_timeout_in_ms=60000   # terminate on long hangs  # create interactive session to register a default session  sess = tf.InteractiveSession("", config=config)  return sess

可伸缩性注意事项:

  1. tf.constant
    将您的数据副本内联到Graph中。Graph定义的大小有2GB的基本限制,因此这是数据大小的上限
  2. 你可以避开这一限制使用
    v=tf.Variable
    和保存数据到那里通过运行
    v.assign_op
    一个
    tf.placeholder
    在右侧和喂养numpy的阵列到占位符(
    feed_dict
  3. 这样仍然会创建两个数据副本,因此,为了节省内存,您可以使自己的版本
    slice_input_producer
    在numpy数组上运行,并使用
    feed_dict


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5623644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存