2017-10-20 48 views
1

此刻我尝试使用Tensorflow的新Estimator API在自定义图像数据集上训练自动编码器。Tensorflow Estimator API以eval模式保存图像摘要

到目前为止一切正常。我遇到的唯一问题是当模型处于评估模式时,将输入和输出图像保存为摘要。我在列车模式下创建的所有图像摘要均已妥善保存并显示在Tensorboard中。

这里是我的代码:

def model_fn_autoencoder(features, labels, mode, params): 
    is_training = mode == ModeKeys.TRAIN 

    # Define model's architecture 
    logits = architecture_autoencoder(features, is_training=is_training) 

    # Loss, training and eval operations are not needed during inference. 
    loss = None 
    train_op = None 
    #eval_metric_ops = {} 

    if mode != ModeKeys.INFER: 
     loss = tf.reduce_mean(tf.square(logits - features)) 
     train_op = get_train_op_fn(loss, params) 

     #eval_metric_ops = get_eval_metric_ops(labels, predictions) 

    if mode == ModeKeys.TRAIN: 
     for i in range(10): 
      tf.summary.image("Input/Train/" + str(i), tf.reshape(features[i],[1, 150, 150, 3])) 
      tf.summary.image("Output/Train/" + str(i), tf.reshape(logits[i],[1, 150, 150, 3])) 

    if mode == ModeKeys.EVAL: 
     for i in range(10): 
      tf.summary.image("Input/Eval/" + str(i), tf.reshape(features[i], [1, 150, 150, 3])) 
      tf.summary.image("Output/Eval/" + str(i), tf.reshape(logits[i], [1, 150, 150, 3])) 

    return tf.estimator.EstimatorSpec(
     mode=mode, 
     predictions=logits, 
     loss=loss, 
     train_op=train_op, 
     #eval_metric_ops=eval_metric_ops 

也许有人可以告诉我什么,我做错了什么?

更新 下面是估计和实验创作功能:

估算:

def get_estimator(run_config, params): 
    return tf.estimator.Estimator(
     model_fn=model_fn_autoencoder, # First-class function 
     params=params, # HParams 
     config=run_config # RunConfig 
    ) 

实验:

def experiment_fn(run_config, params): 
    run_config = run_config.replace(save_checkpoints_steps=params.min_eval_frequency) 

    estimator = get_estimator(run_config, params) 

    tf_path = 'path/to/tfrecord' 
    train_file = 'Crops-Faces-Negtives-150-150.tfrecord' 
    val_file = 'Crops-Faces-Negtives-150-150-TEST.tfrecord' 
    tfrecords_train = [os.path.join(tf_path, train_file)] 
    tfrecords_test = [os.path.join(tf_path, val_file)] 

    # Setup data loaders 
    train_input_fn = get_train_inputs(batch_size=128, tfrecord_files=tfrecords_train) 
    eval_input_fn = get_train_inputs(batch_size=128, tfrecord_files=tfrecords_test) 

    # Define the experiment 
    experiment = tf.contrib.learn.Experiment(
     estimator=estimator, # Estimator 
     train_input_fn=train_input_fn, # First-class function 
     eval_input_fn=eval_input_fn, # First-class function 
     train_steps=params.train_steps, # Minibatch steps 
     min_eval_frequency=params.min_eval_frequency, # Eval frequency 
     eval_steps=10 # Number of eval batches 
    ) 

    return experiment 
+0

你能更新你的代码,包括你怎么称呼的估计? – Mingxing

+0

对不起,我添加了估算器和实验创建的代码。 –

+2

TF团队正在努力增加一种方法来在eval模式下保存摘要,就像您在EstimatorSpec构造函数中使用'training_hooks'进行训练模式一样。看看这里的github问题:https://github.com/tensorflow/tensorflow/issues/14042 –

回答

0

随着TF1.4,你可以通过TF .estimator.EstimatorSpec evaluation_hooks。 的evaluation_hooks是挂钩的列表,并且必须添加到它下面的挂钩:

# Create a SummarySaverHook 
eval_summary_hook = tf.train.SummarySaverHook(
           save_steps=1, 
           output_dir= self.job_dir + "/eval_core", 
           summary_op=tf.summary.merge_all()) 
# Add it to the evaluation_hook list 
evaluation_hooks.append(eval_summary_hook) 

#Now, return the estimator: 
return tf.estimator.EstimatorSpec(
       mode=mode, 
       predictions=predictions, 
       loss=loss, 
       train_op=train_op, 
       training_hooks=training_hooks, 
       eval_metric_ops=eval_metric_ops, 
       evaluation_hooks=evaluation_hooks) 

现在,你可以简单地添加tf.summary.image和有它在Tensorboard。 使用您在eval_summary挂钩中使用的指定输出目录的父目录上打开Tensrobaord。在我的例子中,它被称为'eval_core',所以我在其父目录上打开了Tensorboard,正如您在下面的图片中看到的,它在蓝色框中显示得很好。

enter image description here