0
深いラーニングモデルのテンソルフローの実装を読むとき、私はトレーニングプロセスに含まれる次のコードセグメントを理解しようとしています。テンソルフローでのミニバッチグラディエントの適切な実装
self.net.gradients_node = tf.gradients(loss, self.variables)
for epoch in range(epochs):
total_loss = 0
for step in range((epoch*training_iters), ((epoch+1)*training_iters)):
batch_x, batch_y = data_provider(self.batch_size)
# Run optimization op (backprop)
_, loss, lr, gradients = sess.run((self.optimizer, self.net.cost, self.learning_rate_node, self.net.gradients_node),
feed_dict={self.net.x: batch_x,
self.net.y: util.crop_to_shape(batch_y, pred_shape),
self.net.keep_prob: dropout})
if avg_gradients is None:
avg_gradients = [np.zeros_like(gradient) for gradient in gradients]
for i in range(len(gradients)):
avg_gradients[i] = (avg_gradients[i] * (1.0 - (1.0/(step+1)))) + (gradients[i]/(step+1))
norm_gradients = [np.linalg.norm(gradient) for gradient in avg_gradients]
self.norm_gradients_node.assign(norm_gradients).eval()
total_loss += loss
私はそれがまともなミニバッチ勾配に関連していると思うが、私はそれが動作しない方法を理解することができない、または私はアルゴリズムにそれを接続するためのいくつかの困難を持っている
こんにちはlshamael、返信ありがとうございます。私は元の投稿にトレーニングの反復部分全体を含めます。私を混乱させるもう一つの要因は、もともとゼロと定義されていたavg_gradientsについてです。 avg_gradients [i] = 0であるため、avg_gradients [i] =(avg_gradients [i] *(1.0 - (1.0 /(step + 1))))+(gradients [i] /(step + 1)左辺の最初の項のように0に等しく、avg_gradients [i] = gradients [i] /(step + 1)はそうですか?この勾配操作が何を達成することを目指しているのか分かりません。 – user288609
はい、最初のステップ**では**ステップ+1 = 1となり、 'avg_gradients [i] = grandients [i]'となります。連続する各ステップで、 'avg_gradients is None'という条件は保持されないので、もはやゼロではありません。 – Ishamael
ありがとう、ありがとう。しかし、バッチSGDでない場合、この実装の基礎となるアルゴリズム(またはロジック)は何ですか。私は元の投稿を更新しました。 – user288609