我正在尝试添加图像摘要操作,以便可视化我的网络管理从验证集重建输入的程度。但是,由于验证集中的图像太多,我只想绘制它们的一小部分。
我设法通过手动训练循环来实现这一目标,但我很难通过新的Tensorflow Estimator / Experiment / Datasets API实现相同的目标。有人做过这样的事吗?
答案 0 :(得分:1)
实验和估算工具是高级TensorFlow API。虽然您可以通过钩子解决问题,但如果您想要更好地控制培训过程中发生的事情,可能更容易不使用这些API。
也就是说,您仍然可以使用数据集API,它将为您带来许多有用的功能。
要使用数据集API解决您的问题,您需要在训练循环中切换训练和验证数据集。
一种方法是使用可馈送迭代器。有关详细信息,请参见此处 https://www.tensorflow.org/programmers_guide/datasets
您还可以在this notebook中看到使用数据集API在培训和验证之间切换的完整示例。
简而言之,在创建了train_dataset和val_dataset之后,你的训练循环可能是这样的:
# create TensorFlow Iterator objects
training_iterator = val_dataset.make_initializable_iterator()
val_iterator = val_dataset.make_initializable_iterator()
with tf.Session() as sess:
# Initialize variables
init = tf.global_variables_initializer()
sess.run(init)
# Create training data and validation data handles
training_handle = sess.run(training_iterator.string_handle())
validation_handle = sess.run(val_iterator.string_handle())
for epoch in range(number_of_epochs):
# Tell iterator to go to beginning of dataset
sess.run(training_iterator.initializer)
print ("Starting epoch: ", epoch)
# iterate over the training dataset and train
while True:
try:
sess.run(train_op, feed_dict={handle: training_handle})
except tf.errors.OutOfRangeError:
# End of epoch
break
# Tell validation iterator to go to beginning of dataset
sess.run(val_iterator.initializer)
# run validation on only 10 examples
for i in range(10):
my_value = sess.run(my_validation_op, feed_dict={handle: validation_handle}))
# Do whatever you want with my_value
...
答案 1 :(得分:1)
我找到了一个使用Estimator / Experiment API的解决方案。
首先,您需要修改数据集输入,以便不仅提供标签和功能,还需要为每个样本提供某种形式的标识符(在我的例子中,它是文件名)。然后在超参数字典(params
参数)中,您需要指定要绘制的验证样本。您还必须在这些参数中传递model_dir
。例如:
params = tf.contrib.training.HParams(
model_dir=model_dir,
images_to_plot=["100307_EMOTION.nii.gz", "100307_FACE-SHAPE.nii.gz",
"100307_GAMBLING.nii.gz", "100307_RELATIONAL.nii.gz",
"100307_SOCIAL.nii.gz"]
)
learn_runner.run(
experiment_fn=experiment_fn,
run_config=run_config,
schedule="train_and_evaluate",
hparams=params
)
完成此设置后,您可以在model_fn
和评估挂钩中创建条件摘要操作,以将它们包含在输出中。
if mode == tf.contrib.learn.ModeKeys.EVAL:
summaries = []
for image_to_plot in params.images_to_plot:
is_to_plot = tf.equal(tf.squeeze(filenames), image_to_plot)
summary = tf.cond(is_to_plot,
lambda: tf.summary.image('predicted', predictions),
lambda: tf.summary.histogram("ignore_me", [0]),
name="%s_predicted" % image_to_plot)
summaries.append(summary)
evaluation_hooks = [tf.train.SummarySaverHook(
save_steps=1,
output_dir=os.path.join(params.model_dir, "eval"),
summary_op=tf.summary.merge(summaries))]
else:
evaluation_hooks = None
请注意,摘要必须是有条件的 - 我们要么绘制图像(计算成本昂贵),要么保存常量(计算上便宜)。我选择使用histogram
与scalar
进行虚拟摘要,以避免混乱我的张量板控制台。
最后,您需要在`model_fn'
的return对象中传递钩子return tf.estimator.EstimatorSpec(
mode=mode,
predictions=predictions,
loss=loss,
train_op=train_op,
evaluation_hooks=evaluation_hooks
)
请注意,这只适用于评估模型时批量大小为1(这应该不是问题)。