2016-11-07 14 views
1

私はテンソルの流れに新しいですし、私が使用する2種類の方法を参照してくださいループGradientDescentOptimiser:私は両方をテストしTensorflow学習の違いは

sess.run(train_op, feed_dict={X: trX, Y: trY}) 

私は統合されたループのこの種も参照

for (x, y) in zip(trX, trY): 
    sess.run(train_op, feed_dict={X: x, Y: y}) 

わずかに異なる結果が得られます。当分の間、私は簡単な線形回帰で自分自身を鍛えますが、それはANNに影響を与えるかもしれません。なぜ違いがあり、どちらがニューラルネットワークの最良のコードですか?

+1

こんにちは、JLBさん、第2のケースについてもっと詳しいコードを教えてください。 train_op、変数X、Yとは何ですか? – Corentin

+0

確かに、ここでは、コスト、gradientDescentの定義を持つより多くのコードがあります。 唯一の違いは、実際には上で述べた推定のループです。 コスト= tf.square(Y - y_model)#使用二乗誤差コスト関数の train_op = tf.train.GradientDescentOptimizer(0.001).minimize(コスト) var_grad = tf.gradients(コスト、W) TFを有します。セッション()をsess: tf.initialize_all_variables()。run() sess.run(train_op、feed_dict = {X:trX、Y:trY})範囲内のiについて – JLB

+0

おそらく後者が必要です - 実行を駆動するテンソルフローを取得します。 – drpng

答えて

0

勾配降下を用いて多くの時間をパラメータを更新することによって、コスト関数を最小化する反復プロセスである:= W

W」 - Wがセットされdelta_W

あなたのモデルのパラメータの学習率とdelta_Wは、コスト関数の勾配の近似値です。勾配を近似するためにXとYを使用して唯一の反復

sess.run(train_op, feed_dict={X:...,Y:...})

計算(詳細hereを参照されたいです)。

したがって、2番目のコードはすべてのトレーニングデータセット(高価ですが近似は正確です)を使用してグラデーションを近似し、の1つだけをに適用します。収束を最小限にするには十分ではありません。

最初のコードは良いですが、1つの更新例を適用しますが、1つの例しかないため、近似値はあまり正確ではありません。

私はあなたがそれに関連付けられたラベルであなたのトレーニングデータセット上のデータのランダムなセットを返す機能 generate_mini_batchを作成し、このループを実行することをお勧め

for i in range(N_STEPS) : # with N_STEPS very large 
     batch_x,batch_y = generate_mini_batch(trX,trY,s) # s is th size of the mini-batch 
     sess.run(train_op, feed_dict={X: batch_x, Y: batch_y}) 

この方法は、参照(ミニバッチ勾配法と呼ばれていますこのvideo)、実際には最適化の問題で広く使用されています。

+0

入手しました。私は、完全なデータセットと比較して、各点について推定された勾配を使用して、その解が非常に似ていることに驚く。 minibatchは実際には最適と思われる古典的な解決法です。ありがとう! – JLB

関連する問題