2017-08-16 5 views
0

私は1台のマシンでTensorFlow(1.2)モデルをトレーニングし、別のマシンで評価しようとしています。私は1台のマシンにローカルに滞在するとすべてうまく動作します。TensorFlowを1台のマシンで正しくトレーニングし、別のマシンで評価する方法は?

私はモデルにデータを取得する代わりにプレースホルダとフィードディクテーションを使用するのではなく、TFファイルキューとバッチジェネレータを使用します。私はプレースホルダーでこれがはるかに簡単だろうと思うが、私はTFのバッチ発電機の仕事をしようとしている。

saver = tf.train.Saver() 
ckpt = tf.train.get_checkpoint_state(os.path.dirname(ckpt_dir)) 
if ckpt and ckpt.model_checkpoint_path: 
    saver.restore(sess, ckpt.model_checkpoint_path) 

これは以下のようにエラーを生成します:

017-08-16 12:29:06.387435: W tensorflow/core/framework/op_kernel.cc:1158] Invalid argument: Unsuccessful TensorSliceReader constructor: Failed to get matching files on /data/perdue/minerva/tensorflow/models/11/20170816/checkpoints-20: Not found: /data/perdue/minerva/tensorflow/models/11/20170816 

参照するディレクトリ(/data/...)は評価機を私のトレーニングマシンに存在ではなく、私の評価コードで

は、私のようなラインを持っています。 、train_file_queue/limit_epochs/epochs

AttributeError: 'Tensor' object has no attribute 'initializer' 

ここで、私は明示的にすぐに復元した後に初期化関数を呼び出す場合、

tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value train_file_queue/limit_epochs/epochs 

か:私は

saver = tf.train.import_meta_graph(
    '/local-path/checkpoints-XXX.meta', 
    clear_devices=True 
) 
saver.restore(
    sess, '/local-path/checkpoints-XXX', 
) 

のようなものを試してみましたが、これは別のエラーを生成します私が評価関数を無視したいと思う訓練グラフの要素です(私は別の要素を持っています、新しい要素test_file_queueはdiffeを指しています)評価データファイルを含むファイルキューをレンタルする)。

私は、リストア直後にイニシャライザを呼び出している2番目のケースでは、 "通常の"テンソーのようには動作しないローカル変数に何かがあると思いますが、私はそうではありません問題が何であるか正確に確かめてください。

Saverrestore TFを使用すると、元のマシンで正しいことが実行されます。モデルパラメータを復元して評価用に新しいファイルキューを使用するだけです。しかし、私はそのマシンに限定することはできません、私は他のマシンでモデルを評価する必要があります。

私もprotobufといくつかのオプションをフリーズしようとしました。ファイルキューを最も上流の入力として使用する必要があるという事実には、常に困難が伴います。

TensorFlowのファイルキューとバッチジェネレータを使用して訓練し、異なるマシン/異なる環境にモデルを展開する適切な方法は何ですか?グラフにデータを取得するためにfeed-dictを使用していたのですが、これはかなりシンプルですが、ビルドされたファイルキューとバッチジェネレータを使用するときはあまり明確ではありません。

ご意見ありがとうございます。

+0

あなたは 'ckpt_dir'に保存しますが、次に' _s.path.dirname(ckpt_dir) 'を実行すると、_parent_ディレクトリが得られます。それはあなたが意図したものですか? – 4Oh4

+0

問題は、チェックポイントディレクトリへのパスではありません。私が言ったように、すべては1つのマシン上で動作します。だからマシンAで訓練と評価ができますが、マシンBで訓練と評価ができますが、マシンAでトレーニングをしてマシンBで評価することはできません。 'save.restore()'を呼び出すと、他のマシンからのディレクトリパス - これらのパスはチェックポイントファイル内に格納されます。私は彼らがグラフのバッチキュー要素の一部だと思うが、私は完全にはわからない。 –

+0

MonitoredTrainingSessionを使用しようとすると、自動的にチェックポイントが読み込まれて保存されます。それは助けるかもしれない。私はテンソル1.2の問題もあります。すべてのグラフを評価したくない場合は、とにかくそれを行い、失敗することがあります。私は1.3でこの問題を抱えていませんでした。また、モデルを作成した後に復元するためにこのコードを試してください: 'saver.restore(session、tf.train.latest_checkpoint(checkpoints_dir))' – jorgemf

答えて

1

このジレンマに対する答えの少なくとも一部は、TF 1.2または1.3で回答されました。 Saver()コンストラクタのための新しいフラグがあります:

saver = tf.train.Saver(save_relative_paths=True) 

チェックポイントディレクトリを保存し、別のマシンに移動し、restore()にモデルを、それを使用する場合、それがそのようになり、すべてが存在しないに関連するエラーなしで動作しますデータのパス(トレーニングが実行された古いマシンからのパス)。

私のAPIの使用は実際にはこの場合は慣習的ではありませんが、少なくともコードは1つのマシンから別のマシンに訓練されたモデルをエクスポートできるように機能します。

関連する問題