2016-03-01 11 views
11

からの復元変数:Aは、変数a1a2、およびa3で構成されていTensorFlow:私は次のような状況持つ複数のチェックポイント

  • モデル:

    • は、私は2つの別々のスクリプトで記述された2つのモデルを持っています、で書かれていますA.py

    • モデルBは変数から成りますb1,b2、およびb3、およびA.pyB.pyのそれぞれにおいて

    B.pyで書かれて、私はすべてのローカル変数のチェックポイントを保存しtf.train.Saverを持っている、とのそれぞれのチェックポイントファイルckptAckptBを呼びましょう。

    ここで、a1b1を使用するモデルCを作成します。私はそれを作ることができますように正確な同じ変数名a1は、AとCの両方でvar_scopeを使用して(と同じのb1)を使用します。

    a1b1ckptAckptBからモデルCにロードするにはどうすればよいですか?たとえば、次のように動作しますか?

    saver.restore(session, ckptA_location) 
    saver.restore(session, ckptB_location) 
    

    同じセッションを2回復元するとエラーが発生しますか?余分な変数(b2b3a2a3)に割り当てられた "スロット"がない、または単純に変数を復元するだけで、Cで初期化されていない他の変数がある場合にのみ不平を言いますか?

    私は今これをテストするためのコードを書こうとしていますが、事前に訓練されたウェイトを再利用しようとするとこの問題に頻繁に遭遇するため、この問題に対する正式なアプローチが大好きです。

    ありがとうございます!

  • 答えて

    16

    セーバー(デフォルトでは6つの変数すべてを表す)を使用して、セーバーが表す変数のすべてを含まないチェックポイントから復元しようとすると、tf.errors.NotFoundErrorが返されます。ただし、要求された変数がすべて対応するファイルに存在する限り、変数のサブセットについては、同じセッションでSaver.restore()を複数回呼び出すことは自由です)。

    標準的なアプローチは、 2つの個別のtf.train.Saverインスタンスは、単一のチェックポイントに完全に含まれる変数の各サブセットをカバーします。たとえば:あなたはローカルスコープ内a1b1呼ばtf.Variableオブジェクトへのポインタを持っている場合は、あなたのコードが構築されている方法に応じて

    saver_a = tf.train.Saver([a1]) 
    saver_b = tf.train.Saver([b1]) 
    
    saver_a.restore(session, ckptA_location) 
    saver_b.restore(session, ckptB_location) 
    

    、あなたはここで読むのをやめできます。

    一方、変数a1b1が別々のファイルで定義されている場合は、これらの変数へのポインタを取得するために何かクリエイティブな処理を行う必要があります。それは理想的ではないですが、以下のように、どのような人々は一般的にやっていることは(変数名は、それぞれ"a1:0""b1:0"あると仮定した場合)例えば、共通の接頭辞を使用することです:

    saver_a = tf.train.Saver([v for v in tf.all_variables() if v.name == "a1:0"]) 
    saver_b = tf.train.Saver([v for v in tf.all_variables() if v.name == "b1:0"]) 
    

    最後の注意:あなたが作る必要はありません英雄的な努力はあなたがtf.train.Saverコンストラクタの最初の引数として名前ツーVariable辞書を渡すことができ、変数はAとCで同じ名前を持っていることを確認し、それによってあなたのコード内Variableのオブジェクトにチェックポイントファイルに名前を再マッピングします。これは、A.pyB.pyに同様の名前の変数がある場合、またはC.pyにある場合、それらのファイルからモデルコードをtf.name_scope()に編成したい場合に役立ちます。

    +0

    最初のコードフラグメントは、正確にC.pyで書かれるべきものを指しますか? a1 a2 a3とb1 b2 b3がCpyで定義されているグラフ定義の最後に書き込まれます。 私の元来の質問は、a1とb1だけがC言語で定義されていて、他に何も定義されていないのですか? –

    +0

    申し訳ありません - このケースをカバーする回答が更新されました。 C.pyで変数を再定義すると、作業がはるかに簡単になります! – mrry

    +0

    もう1つのフォローアップ:「saver_a.restore(session、ckptA_location)」というステートメントを実行すると、saver_aは単一変数[a1]でインスタンス化されますが、それ以外はckptAにすべてのa1、a2、a3の値が含まれます。 a2とa3を無視して、ckptでa1のみを検索し、a1をモデルCに復元するので、これは問題ではないと言っていますか?そして、最後の1つの質問:両方のa1が(CとAで)同じ名前でインスタンス化されている限り、Cのa1はckptAのa1として識別されますか? –