2016-08-26 3 views
4

TensorFlowでクラシファイアを構築しながら、勢いを持ったグラデーションディセントを使用したい(前のグラディエントを追跡する)。TensorFlowに付属のものを使用せずにTensorFlowでグラデーションディセントを実装する

tensorflow.train.GradientDescentOptimizerを使用したくないですが、tensorflow.gradientsを使用してグラデーションを計算し、以前のグラデーションを追跡し、それらのすべてに基づいてウェイトを更新します。

TensorFlowでこれを行うにはどうすればよいですか?

+0

'AdamOptimizer'または' RMSPropOptimizer'の使用を検討しましたか? – titus

答えて

5

TensorFlowは、勾配降下の運動量を有するimplementationを有する。

独自の最適化アルゴリズムの実装に関する一般的な質問に答えるために、TensorFlowはグラデーションを計算するための基本要素を提供し、計算されたグラデーションを使用して変数を更新します。次のようにあなたのモデルでは、lossは、損失関数を指定したとし、かつvar_listはあなたがtf.all_variablestf.trainable_variablesを呼び出すことによって取得することができ、あなたのモデルでTensorFlow変数(のpythonのリストである、あなたは計算することができ勾配があなたの変数をWRT:

grads = tf.gradients(loss, var_list) 
シンプルな勾配降下のために

、あなたは単に勾配の積と変数から学習率を引くでしょう、次のようにそのためのコードがなります。

var_updates = [] 
for grad, var in zip(grads, var_list): 
    var_updates.append(var.assign_sub(learning_rate * grad)) 
train_op = tf.group(*var_updates) 

あなたはを呼び出すことによって、あなたのモデルをトレーニングすることができます。実際に変数を更新する前に、いろいろなことができるようになりました。たとえば、異なる変数セットのグラジエントを追跡し、モメンタムアルゴリズムに使用することができます。また、変数を更新する前にグラデーションをクリップすることもできます。グラデーションテンソルはTensorFlowで計算した他のテンソルと変わらないので、これらはすべて単純なTensorFlow演算です。独自の実装方法を理解するには、いくつかのより洗練された最適化アルゴリズムの実装(MomentumRMSPropAdam)を見てください。

+0

ありがとうございました! – prepmath

+0

これは動作しますが、少し混乱します。私はmnistデータにsoftmax回帰を適合させています。だから私はtf.all_variablesが2つのテンソルのリストを生成することを期待しました。バイアスの場合は1で10、重みの場合は784で10です。しかし、120のリスト(スクリプトを実行するたびにこの数が増え続ける)が生成され、そのうちの60個は1テンソル×10個、60個は784×10テンソルです。 tf.all_variablesで何が起こっているのか理解してもらえますか? – prepmath

関連する問題