トレーニング可能な変数をトレーニング不可能にすることは可能ですか? 質問する

トレーニング可能な変数をトレーニング不可能にすることは可能ですか? 質問する

私は訓練可能変数スコープ内。その後、同じスコープに入り、スコープを に設定しreuse_variablesget_variable同じ変数を取得するために使用しました。ただし、変数の trainable プロパティを に設定できませんFalse。私のget_variable行は次のようになります。

weight_var = tf.get_variable('weights', trainable = False)

しかし、変数は'weights'まだ の出力に残っていますtf.trainable_variables

を使用して共有変数のtrainableフラグを に設定できますか?Falseget_variable

これを実行する理由は、モデル内の VGG ネットから事前トレーニングされた低レベル フィルターを再利用し、以前と同じようにグラフを構築し、重み変数を取得し、重み変数に VGG フィルター値を割り当てて、次のトレーニング ステップでそれらを固定したままにしたいからです。

ベストアンサー1

ドキュメントとコードを見た後、私はないから変数を削除する方法を見つけることができましたTRAINABLE_VARIABLES

次のようなことが起こります:

  • 初めてtf.get_variable('weights', trainable=True)呼び出されると、変数が のリストに追加されますTRAINABLE_VARIABLES
  • 2回目に を呼び出すと、同じ変数が取得されますが、変数がすでに のリストに存在するため、tf.get_variable('weights', trainable=False)引数は効果がありません(そしてtrainable=FalseTRAINABLE_VARIABLES削除する方法はありませんそこから)

最初の解決策

minimizeオプティマイザのメソッドを呼び出すとき(ドキュメント。var_list=[...]) の場合は、最適化する変数を引数として渡すことができます。

たとえば、最後の 2 つのレイヤーを除く VGG のすべてのレイヤーをフリーズする場合は、最後の 2 つのレイヤーの重みを に渡すことができますvar_list

2番目の解決策

tf.train.Saver()変数を保存して後で復元するには、を使用します(このチュートリアル)。

  • まずVGGモデル全体をすべて訓練可能変数。 を呼び出してチェックポイント ファイルに保存しますsaver.save(sess, "/path/to/dir/model.ckpt")
  • 次に(別のファイルで)2番目のバージョンをトレーニングします。訓練不可能変数。 で以前に保存した変数を読み込みますsaver.restore(sess, "/path/to/dir/model.ckpt")

オプションで、チェックポイントファイルに一部の変数のみを保存することもできます。ドキュメント詳細については。

おすすめ記事