テンソルフローグラフを実行してモデルをトレーニングし、別の評価データセットを使用して定期的に評価しようとしています。訓練と評価の両方のデータは、キューランナーを使用して実装されます。テンソルフロー:キューランナーを使用した効率的なeval/trainデータの供給
私の現在の解決策は、両方の入力を同じグラフに作成し、プレースホルダに依存するtf.cond
を使用することです。私の問題は、次のコードで強調表示されています:私もimage_summary
ラインtensorflow/models/image/cifar10/cifar10_inputs.py
の133
をコメントアウトしなければならなかった
import tensorflow as tf
from tensorflow.models.image.cifar10 import cifar10
from time import time
def get_train_inputs(is_training):
return cifar10.inputs(False)
def get_eval_inputs(is_training):
return cifar10.inputs(True)
def get_mixed_inputs(is_training):
train_inputs = get_train_inputs(None)
eval_inputs = get_eval_inputs(None)
return tf.cond(is_training, lambda: train_inputs, lambda: eval_inputs)
def time_inputs(inputs_fn, n_runs=10):
graph = tf.Graph()
with graph.as_default():
is_training = tf.placeholder(dtype=tf.bool, shape=(),
name='is_training')
images, labels = inputs_fn(is_training)
with tf.Session(graph=graph) as sess:
coordinator = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coordinator)
t = time()
for i in range(n_runs):
im, l = sess.run([images, labels], feed_dict={is_training: True})
dt = time() - t
coordinator.request_stop()
coordinator.join(threads)
return dt/n_runs
print('Train inputs: %.3f' % time_inputs(get_train_inputs))
print('Eval inputs: %.3f' % time_inputs(get_eval_inputs))
print('Mixed inputs: %.3f' % time_inputs(get_mixed_inputs))
。
これは、以下の結果が得られた:
Train inputs: 0.055
Eval inputs: 0.050
Mixed inputs: 0.105
には1つだけが使用されていても、両方の入力が解析され/読み出されている混合場合に思われます。この冗長な計算を避ける方法はありますか?キュー・ランナーの設定を引き続き活用するトレーニング/評価データをよりうまく切り替える方法はありますか?
を私は、スレッドを停止して接合した後、再びキューランナーを開始しようとしましたが、私はそれを動作させることはできません。後でキューが閉じられるようだ。 – piotr