带有TFrecords的GoogleML上的Tensorflow:OutOfRangeError(请参阅上面的回溯):序列结束

时间:2018-11-29 00:13:50

标签: tensorflow google-cloud-platform

当我们在本地运行Tensorflow(在没有GPU的PC上)时,Tensorflow训练成功(但速度很慢)。但是,当我们将其发送到GoogleML(单个GPU)时,它无法进行训练。代码或输入的数据没有变化。

从TF记录读取数据时发生错误。一些相关代码:

files = tf.data.Dataset.list_files(XXXX)
dataset = files.apply(tf.contrib.data.parallel_interleave(tf.data.TFRecordDataset, cycle_length=XXXX, sloppy=True, buffer_output_elements=XXXX))

dataset = dataset.apply(tf.contrib.data.map_and_batch(map_func=_parse_transform_function, batch_size=config.batch_size, num_parallel_calls=config.num_parallel_calls))
dataset = dataset.repeat()
dataset = dataset.prefetch(config.prefetch)

files = tf.data.Dataset.list_files(XXXX)
dataset = files.apply(tf.contrib.data.parallel_interleave(tf.data.TFRecordDataset, cycle_length=XXXX, sloppy=True, buffer_output_elements=XXXX))

dataset = dataset.apply(tf.contrib.data.map_and_batch(map_func=_parse_transform_function, batch_size=config.batch_size, num_parallel_calls=config.num_parallel_calls))
dataset = dataset.repeat()
dataset = dataset.prefetch(config.prefetch)

training_iterator = dataset.make_one_shot_iterator()
handle = tf.placeholder(tf.string, shape=[])
iterator = tf.data.Iterator.from_string_handle(handle, dataset.output_types, dataset.output_shapes)
next_element = iterator.get_next()

...

with tf.Session() as sess:
    training_handle = sess.run(training_iterator.string_handle())
    for i in range(config.epochs):
        _image, _landmarks, _height, _width, _size, _kp_true, _short_offsets_true, _long_offsets_true = sess.run(next_element, feed_dict={handle: training_handle})

这是我们得到的错误:

  

错误2018-11-28 15:32:55 -0800服务OutOfRangeError(请参见上文)   追溯):序列结束错误2018-11-28 15:32:55   -0800服务[[节点:IteratorGetNext = IteratorGetNextoutput_shapes = [[?, 416,416,3],[?, 34,5],[?],[?],[?],   [?,52,52,11],[?,52,52,22],[?,52,52,40]],output_types = [DT_FLOAT,   DT_FLOAT,DT_FLOAT,DT_FLOAT,DT_INT32,DT_FLOAT,DT_FLOAT,DT_FLOAT],   _device =“ / job:localhost /副本:0 /任务:0 /设备:CPU:0”]]

同样,我们没有更改数据或代码,因此我们认为Tensorflow代码中没有错误。为什么同一实现无法在GoogleML中训练?

1 个答案:

答案 0 :(得分:0)

“ OutOfRangeError(请参阅上面的回溯):序列结束”具有误导性。似乎表明我们已经达到了tfrecords的末尾,但事实并非如此。

问题是“ _parse_transform_function”(未显示)中的操作正在使用GPU不支持的操作。

解决方案:在代码的数据集部分周围使用“ with tf.device('/ cpu:0'):”,以使用CPU进行预处理。仍在训练中使用的GPU。