使用Tensorflow Estimator API仅对验证集合图像的子集创建图像汇总API

我正在尝试添加图像汇总操作,以便可视化我的网络如何管理以重新构建验证集的输入。但是,由于验证集中的图像太多,我只想绘制它们的一小部分。使用Tensorflow Estimator API仅对验证集合图像的子集创建图像汇总API

我设法通过手动训练循环来达到这个目标,但我很努力地用新的Tensorflow估算器/实验/数据集API实现。有没有人做过这样的事情?

回答:

我想通了,使用估计/实验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以避免弄乱我的tensorboard仪表板。

最后,你需要通过钩在`model_fn”的返回对象

return tf.estimator.EstimatorSpec(

mode=mode,

predictions=predictions,

loss=loss,

train_op=train_op,

evaluation_hooks=evaluation_hooks

)

请注意,当你的批量大小是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

...

以上是 使用Tensorflow Estimator API仅对验证集合图像的子集创建图像汇总API 的全部内容, 来源链接: utcz.com/qa/258275.html

回到顶部