私は訓練可能変数スコープ内。その後、同じスコープに入り、スコープを に設定しreuse_variables
、get_variable
同じ変数を取得するために使用しました。ただし、変数の trainable プロパティを に設定できませんFalse
。私のget_variable
行は次のようになります。
weight_var = tf.get_variable('weights', trainable = False)
しかし、変数は'weights'
まだ の出力に残っていますtf.trainable_variables
。
を使用して共有変数のtrainable
フラグを に設定できますか?False
get_variable
これを実行する理由は、モデル内の VGG ネットから事前トレーニングされた低レベル フィルターを再利用し、以前と同じようにグラフを構築し、重み変数を取得し、重み変数に VGG フィルター値を割り当てて、次のトレーニング ステップでそれらを固定したままにしたいからです。
ベストアンサー1
ドキュメントとコードを見た後、私はないから変数を削除する方法を見つけることができましたTRAINABLE_VARIABLES
。
次のようなことが起こります:
- 初めて
tf.get_variable('weights', trainable=True)
呼び出されると、変数が のリストに追加されますTRAINABLE_VARIABLES
。 - 2回目に を呼び出すと、同じ変数が取得されますが、変数がすでに のリストに存在するため、
tf.get_variable('weights', trainable=False)
引数は効果がありません(そしてtrainable=False
TRAINABLE_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")
。
オプションで、チェックポイントファイルに一部の変数のみを保存することもできます。ドキュメント詳細については。