Tensorflowは一定の反復回数後にあるパラメータに対する訓練を停止する
10025 ワード
私の需要は:ネットワークの中で多くのパラメータが訓練を必要として、その中の1つのパラメータ
このニーズを実現するために、私が使っている方法には以下の2つの部分が含まれています.
1.ネットワークに複数のオプティマイザを設定する
StackOverflowからの回答を参照https://stackoverflow.com/questions/35298326/freeze-some-variables-scopes-in-tensorflow-stop-gradient-vs-passing-variables
この問題は私たちのニーズとは異なり、GANの訓練過程で
すべてのパラメータ(多くの)からパラメータ
焦らないで、ここはまだ終わっていません.私たちは100のiterationの後に
2.動的学習率の設定
私たちは100のiterationの後に
学習率を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です.
最終的に結合されたコードは
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は多くの形式の学習率減衰関数を提供している.
boundaries=[100]
learning_rates=[0.0002, 0.]
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.0002, 0.]
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)