Tensorflowは一定の反復回数後にあるパラメータに対する訓練を停止する

10025 ワード

私の需要は:ネットワークの中で多くのパラメータが訓練を必要として、その中の1つのパラメータAは比較的に特殊で、私は前の100のiterationの過程の中ですべてのパラメータが同期して訓練を行うことを望んで、100のiterationの後で、Aの更新を停止して、間もなくAの値が固定して、他のパラメータを訓練し続けます.
このニーズを実現するために、私が使っている方法には以下の2つの部分が含まれています.
1.ネットワークに複数のオプティマイザを設定する
StackOverflowからの回答を参照https://stackoverflow.com/questions/35298326/freeze-some-variables-scopes-in-tensorflow-stop-gradient-vs-passing-variables
この問題は私たちのニーズとは異なり、GANの訓練過程でG(enerator)D(iscriminator)を交互に訓練することを望んでいると述べ、高賛回答は2つのオプティマイザを設置し、それぞれ異なるパラメータに対して訓練することを提供している.
optimizer = tf.train.AdagradOptimzer(0.01)

first_train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
                				"scope/prefix/for/first/vars")
first_train_op = optimizer.minimize(cost, var_list=first_train_vars)

second_train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
								"scope/prefix/for/second/vars")                     
second_train_op = optimizer.minimize(cost, var_list=second_train_vars)

すべてのパラメータ(多くの)からパラメータAを単独で取り出すために、私のコードで実現される方法はこうです.
optim = tf.train.AdamOptimizer(opt.learning_rate, opt.beta1)

first_train_vars = [var for var in tf.trainable_variables() if var.name!='scope/A:0']
first_train_op = optim.minimize(loss, var_list=first_train_vars)

second_train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, 'scope/A:0')
second_train_op = optim.minimize(loss, var_list=second_train_vars)

焦らないで、ここはまだ終わっていません.私たちは100のiterationの後にAの訓練を停止することを望んでいます.学習率を設定することで実現することができます.
2.動的学習率の設定
私たちは100のiterationの後にAの学習を停止することを望んでいるので、tensorflowにはこの機能を直接実現する関数がないようです(知っていることがあれば教えてください).tf.stop_gradient()は勾配伝搬を阻止することができるが、これは最初に図を確立したときに決定されたので、訓練中にAの更新を停止することは実現できない.次の部分は主に参考にしています.https://blog.csdn.net/akadiao/article/details/79560731
学習率を0に設定することで、更新の停止を実現することができ、学習率を動的に変更することができます.tensorflowは多くの形式の学習率減衰関数を提供している.
  • tf.train.piecewise_constantセグメント定数減衰
  • tf.train.inverse_time_decay反時間減衰
  • tf.train.polynomial_decay多項式減衰
  • tf.train.exponential_decay指数減衰
  • tf.train.natural_exp_decay自然指数減衰
  • tf.train.cosine_decayコサイン減衰
  • tf.train.linear_cosine_decay線形コサイン減衰
  • tf.train.noisy_linear_cosine_decayノイズ線形コサイン減衰
  • 具体的には、公式ドキュメントを参照してください.ここでは、セグメント定数減衰の学習率を簡単に採用し、100 iterationを設定する前の学習率は0.0002で、その後の学習率は0です.
    boundaries=[100]
    learning_rates=[0.00020.]
    learning_rate = tf.train.piecewise_constant(
                    global_step,
                    boundaries=boundaries, 
                    values=learning_rates)
    
    second_optim = tf.train.AdamOptimizer(learning_rate, opt.beta1)
    second_train_op = second_optim.minimize(loss, var_list=second_train_vars)
    

    最終的に結合されたコードは
    first_train_vars = [var for var in tf.trainable_variables() if var.name!='scope/A:0']
    first_optim = tf.train.AdamOptimizer(first_learning_rate, opt.beta1)
    first_train_op = first_optim.minimize(loss, var_list=first_train_vars)
    
    boundaries=[100]
    learning_rates=[0.00020.]
    second_learning_rate = tf.train.piecewise_constant(
                    global_step,
                    boundaries=boundaries, 
                    values=learning_rates)
    second_train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, 'scope/A:0')
    second_optim = tf.train.AdamOptimizer(second_learning_rate, opt.beta1)
    second_train_op = second_optim.minimize(loss, var_list=second_train_vars)