我认为您在这里混淆了命令性和图形构造部分。该 *** 作将
tf.train.shuffle_batch创建一个新的队列节点,并且可以使用一个节点来处理整个数据集。因此,我认为您之所以绞尽脑汁,是因为您
shuffle_batch在for循环中创建了一堆队列,而没有为其启动队列运行器。
正常的输入管道用法如下所示:
- 添加喜欢的节点
shuffle_batch
到输入管道 - (可选,以防止意外修改图)完成图
-–图形构造结束,命令式编程开始-
tf.start_queue_runners
while(True): session.run()
为了更具可扩展性(避免使用Python
GIL),您可以使用TensorFlow管道生成所有数据。但是,如果性能不是很关键,则可以使用
slice_input_producer.以下示例将一个numpy数组连接到输入管道:这是一个带有一些
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
可伸缩性注意事项:
tf.constant
将您的数据副本内联到Graph中。Graph定义的大小有2GB的基本限制,因此这是数据大小的上限- 你可以避开这一限制使用
v=tf.Variable
和保存数据到那里通过运行v.assign_op
一个tf.placeholder
在右侧和喂养numpy的阵列到占位符(feed_dict
) - 这样仍然会创建两个数据副本,因此,为了节省内存,您可以使自己的版本
slice_input_producer
在numpy数组上运行,并使用feed_dict
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)