TensorFlow是否有某种方法可以使用tf.data.Dataset
API在训练的每N步自动对评估集进行评估?目前,我的输入函数如下所示:
def train_input_fn():
dataset = tf.data.Dataset.from_tensor_slices((dict(train_x), train_y))
return (
dataset
.repeat()
.shuffle(len(train_x) * 1.33)
.batch(128)
.make_one_shot_iterator().get_next()
)
def eval_input_fn():
dataset = tf.data.Dataset.from_tensor_slices((dict(eval_x), eval_y))
return (
dataset
.batch(len(eval_x)) # 使用整个评估集
.make_one_shot_iterator().get_next()
)
它们在一个tf.estimator.DNNRegressor
实例上被调用,如下所示:
est = tf.estimator.DNNRegressor(...)
est.train(input_fn=train_input_fn, steps=5000)
est.evaluate(input_fn=eval_input_fn, steps=1)
回答:
使用已废弃的tf.contrib.learn.monitors.ValidationMonitor
解决,如这个StackOverflow答案中所建议。使用monitors.replace_monitors_with_hooks
实用函数,ValidationMonitor
仍然可以用于Estimator
上。
这是我的实现:
from tensorflow.contrib.learn.python.learn import monitors as monitor_lib
est = tf.estimator.DNNRegressor(...)
validation_monitor = tf.contrib.learn.monitors.ValidationMonitor(
input_fn=eval_input_fn,
every_n_steps=100,
)
list_of_monitors_and_hooks = [validation_monitor]
hooks = monitor_lib.replace_monitors_with_hooks(list_of_monitors_and_hooks, est)
est.train(
input_fn=input_fn_train,
steps=1000,
hooks=hooks
)