2017-10-31 22 views
0

私はTensorFlowを学び、それを単純な線形回帰問題に適用しようとしています。 dataは、形状[42x2]のnumpy.ndarrayです。TensfoFlow:次のエポックで線形回帰の損失が増加する(代わりに減少する)

私はちょっと疑問に思って、それぞれの連続した時代の後に、損失が増えているのです。それぞれの連続した時代とともに失われることはないだろうか? (。どうもありがとう、それに答えるために、あなたの時間を割いて)

1)作成:ここで

は私のコードは、(!あなたは私が同様に出力を共有したい場合、私に知らせて)であります依存/独立変数

X = tf.placeholder(tf.float32, name='X') 
Y = tf.placeholder(tf.float32,name='Y') 

2)のプレースホルダが

w = tf.Variable(0.0,name='weights') 
b = tf.Variable(0.0,name='bias') 

3)が定義された各エポック後の重量、バイアス、total_lossためVARS()を作成した損失関数& OPTIM IZER

Y_pred = X * w + b 
loss = tf.reduce_sum(tf.square(Y - Y_pred), name = 'loss') 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.001).minimize(loss) 

4)は、要約イベントに&イベントファイルライタ

tf.summary.scalar(name = 'weight', tensor = w) 
tf.summary.scalar(name = 'bias', tensor = b) 
tf.summary.scalar(name = 'loss', tensor = loss) 
merged = tf.summary.merge_all() 

evt_file = tf.summary.FileWriter('def_g') 
evt_file.add_graph(tf.get_default_graph()) 

5)を作成し、

with tf.Session() as sess1: 
sess1.run(tf.variables_initializer(tf.global_variables())) 
for epoch in range(10): 
    summary, _,l = sess1.run([merged,optimizer,loss],feed_dict={X:data[:,0],Y:data[:,1]}) 
    evt_file.add_summary(summary,epoch+1) 
    evt_file.flush() 
    print(" new_loss: {}".format(sess1.run(loss,feed_dict={X:data[:,0],Y:data[:,1]})))    

乾杯セッションのすべてを実行します!

+0

あなたのデータのサンプルを投稿できますか?少なくとも10 –

+0

:20477196.0 :8389799424.0 :3440635019264.0 :9.731749171431463e + 22 :3.99097521643995e + 25 :1.6366924149690585e + 28 :6.712048633325622e 1410998762209280.0 :5.786483681258373e + 17 :+ 20 2.3730280954829e +30 –

+0

Iは非常に多数に、B/W -veと+地域重量スイングに気づく:E0:0.0ワット、0.0 E1 B:45.9618034362793ワット、2.828000068664551 E2 B:-885.352294921875 W、-43.586029052734375 E3 B:W 17974.052734375、b 906.8658447265625 e4:w -363946.125、b -18330.419921875 e5:w 7370275.5、 B 371251.5625 E6:-149254576.0 W、B -7518119.0 E7:3022537472.0ワット、152248672.0 E8 B:-61209063424.0 W、B -3083169792.0 E9:1239537811456.0ワット、62436925440.0 –

答えて

2

短い答えは、あなたの学習率が大きすぎるということです。私はそれを0.001から0.0001に変更することで合理的な結果を得ることができましたが、2番目の最後のコメントから23ポイントしか使用しませんでした(私は最初にあなたの最後のコメントに気付かなかった)ので、数。

0.001は本当に低い学習率のようです。しかし実際の問題は、あなたの損失関数がreduce_meanの代わりにreduce_sumを使用していることです。これにより、損失が大きくなり、GradientDescentOptimizerに非常に強い信号が送信されるため、学習率が低いにもかかわらずオーバーシュートしてしまいます。トレーニングデータにポイントを追加するだけで問題は悪化します。したがって平均平方誤差を得るにはreduce_meanを使用し、アルゴリズムの動作がはるかに良くなります。

+0

ありがとう!これは妥当と思われます。私はすでにあなたの回答をupvoted、あなたのお勧めごとにもう一度それを与えるだろうし、同様に答えを受け入れた!あなたの時間と努力のおかげで再びありがとう! –

+1

徹底的な説明に感謝します!私は今よく理解する。あなたの推奨事項が働いた:) –

関連する問題