2017-10-20 10 views
1

Tensorflow Estimator APIは、Tensorflowの新しいEstimator APIを使用してカスタムイメージデータセットにオートエンコーダーを訓練しようとしている瞬間、評価モードで画像の概要を保存します。

これまでのところすべてが機能しています。私が持っている唯一の問題は、モデルが評価モードのときに入力と出力の画像を要約として保存することです。列車モードで作成したすべての画像サマリーが保存され、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チームは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

関連する問題