【发布时间】:2018-11-03 23:35:23
【问题描述】:
我正在使用 tf.estimator.train_and_evaluate 和 tf.data.Dataset 将数据提供给估算器:
输入数据函数:
def data_fn(data_dict, batch_size, mode, num_epochs=10):
dataset = {}
if mode == tf.estimator.ModeKeys.TRAIN:
dataset = tf.data.Dataset.from_tensor_slices(data_dict['train_data'].astype(np.float32))
dataset = dataset.cache()
dataset = dataset.shuffle(buffer_size= batch_size * 10).repeat(num_epochs).batch(batch_size)
else:
dataset = tf.data.Dataset.from_tensor_slices(data_dict['valid_data'].astype(np.float32))
dataset = dataset.cache()
dataset = dataset.batch(batch_size)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()
return next_element
训练功能:
def train_model(data):
tf.logging.set_verbosity(tf.logging.INFO)
config = tf.ConfigProto(allow_soft_placement=True,
log_device_placement=False)
config.gpu_options.allow_growth = True
run_config = tf.contrib.learn.RunConfig(
save_checkpoints_steps=10,
keep_checkpoint_max=10,
session_config=config
)
train_input = lambda: data_fn(data, 100, tf.estimator.ModeKeys.TRAIN, num_epochs=1)
eval_input = lambda: data_fn(data, 1000, tf.estimator.ModeKeys.EVAL)
estimator = tf.estimator.Estimator(model_fn=model_fn, params=hps, config=run_config)
train_spec = tf.estimator.TrainSpec(train_input, max_steps=100)
eval_spec = tf.estimator.EvalSpec(eval_input,
steps=None,
throttle_secs = 30)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
训练进行得很顺利,但在评估时出现此错误:
OutOfRangeError (see above for traceback): End of sequence
如果我不在评估数据集上使用Dataset.batch(通过在data_fn 中省略dataset[name] = dataset[name].batch(batch_size) 行)我会得到同样的错误,但时间要长得多。
如果我不对数据进行批处理并使用steps=1 进行评估,我只能避免此错误,但这是否会对整个数据集执行评估?
我不明白是什么导致了这个错误,因为文档表明我也应该能够对批次进行评估。
注意:在数据批次上使用tf.estimator.evaluate 时,我遇到了同样的错误。
【问题讨论】:
标签: tensorflow tensorflow-datasets