38

スコープにトレーニング可能な変数を作成しました。その後、同じスコープに入り、スコープを に設定し、同じ変数を取得するためにreuse_variables使用しました。get_variableただし、変数の trainable プロパティを に設定できませんFalse。私のget_variable行は次のようなものです:

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

しかし、変数'weights'はまだ の出力にありtf.trainable_variablesます。

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

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

4

4 に答える 4

13

事前にトレーニングされたネットワークの特定のレイヤーのみをトレーニングまたは最適化したい場合、これは知っておく必要があることです。

TensorFlow のメソッドは、逆伝播によって調整される変数のリストでminimizeあるオプションの引数 を取ります。var_list

を指定しない場合var_list、グラフ内の任意の TF 変数がオプティマイザーによって調整される可能性があります。でいくつかの変数を指定するとvar_list、TF は他のすべての変数を一定に保ちます。

これは、 jonbrunerと彼の協力者が使用したスクリプトの例です。

tvars = tf.trainable_variables()
g_vars = [var for var in tvars if 'g_' in var.name]
g_trainer = tf.train.AdamOptimizer(0.0001).minimize(g_loss, var_list=g_vars)

これにより、以前に定義した、変数名に「g_」が含まれるすべての変数が検索され、それらがリストに追加され、ADAM オプティマイザーが実行されます。

Quoraで関連する回答を見つけることができます。

于 2018-04-13T13:09:03.450 に答える
7

トレーニング可能な変数のリストから変数を削除するには、最初に次の方法でコレクションにアクセスできます。 trainable_collection = tf.get_collection_ref(tf.GraphKeys.TRAINABLE_VARIABLES) そこにtrainable_collectionは、トレーニング可能な変数のコレクションへの参照が含まれています。たとえば、このリストから要素をポップtrainable_collection.pop(0)すると、対応する変数がトレーニング可能な変数から削除されるため、この変数はトレーニングされません。

これは で機能しますが、正しい引数でpop正しく使用する方法を見つけるのにまだ苦労しているためremove、変数のインデックスには依存しません。

編集:グラフ内の変数の名前がわかっている場合 (グラフの protobuf を検査するか、Tensorboard を使用してより簡単に取得できます)、それを使用してトレーニング可能な変数のリストをループし、次にトレーニング可能なコレクションからの変数。例: 名前付きの変数をトレーニングしたくないが、それらは既にコレクションに追加されている"batch_normalization/gamma:0"とし"batch_normalization/beta:0" ますTRAINABLE_VARIABLES。私にできることは次のとおりです。

#gets a reference to the list containing the trainable variables
trainable_collection = tf.get_collection_ref(tf.GraphKeys.TRAINABLE_VARIABLES)
variables_to_remove = list()
for vari in trainable_collection:
    #uses the attribute 'name' of the variable
    if vari.name=="batch_normalization/gamma:0" or vari.name=="batch_normalization/beta:0":
        variables_to_remove.append(vari)
for rem in variables_to_remove:
    trainable_collection.remove(rem)

` これにより、コレクションから 2 つの変数が正常に削除され、それらはそれ以上トレーニングされなくなります。

于 2018-10-23T07:47:25.940 に答える