2017-03-02 5 views
0

まず、私が愚かな間違いを犯しているとお詫び申し上げます - これは私の最初のテンソルフロープログラムの1つです。私の防衛に - 私は主題を捜し、合理的な説明を見つけなかった。Tensorflow:トレーニングベクトルに例を追加すると線形モデルが分岐する

コード

コードがGetting Started guideから適合されています。モデルは1000倍に訓練されている場合

[array([-0.97550046], dtype=float32), array([ 0.89605999], dtype=float32)] 

import tensorflow as tf 

# Define a linear model. The initial values are wrong (W=0.3, b=0.3), 
# and should converge to (W=-1, b=1). 

# Variables 
W = tf.Variable([.3], tf.float32) 
b = tf.Variable([.3], tf.float32) 
x = tf.placeholder(tf.float32) 

# Linear model 
linear_model = W * x + b 
y = tf.placeholder(tf.float32) 

# Loss function and optimizer 
square_deltas = tf.square(linear_model - y) 
loss = tf.reduce_sum(square_deltas) 
init = tf.global_variables_initializer() 
optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(loss) 

# Tensorflow session 
sess = tf.Session() 
sess.run(init) 

# Train! 
for i in range(100): 
    sess.run(train, {x:[1, 2, 3, 4, 5, 6], 
        y:[0, -1, -2, -3, -4, -5]}) 
print(sess.run([W, b])) 

結果

モデルは100回のために訓練されている場合、結果は次のとおりです。これは、単純な線形モデルを訓練するためにグラデーションを使用しています予想通り、結果は、(-1、1)に近い。

[array([-0.9999997], dtype=float32), array([ 0.99999875], dtype=float32)] 

問題

トレーニングサンプルに別の例を追加:

sess.run(train, {x:[1, 2, 3, 4, 5, 6, 7], 
       y:[0, -1, -2, -3, -4, -5, -6]}) 

結果(それぞれ、100〜1000回の反復)を発散:

[array([ 1.65981654e+28], dtype=float32), array([ 3.35185014e+27], dtype=float32)] 
[array([ nan], dtype=float32), array([ nan], dtype=float32)] 

なぜ他の例を追加することはないが、モデルに失敗しますか?

+1

学習率を0.001に変更するには、reduce_sumをreduce_meanにする必要があります(学習率の変更はサンプルを追加するときに意味があります) – lejlot

答えて

0

新しいデータを追加すると、以前のデータのサイズが小さいため、データ数が約15%増加しています。これは特に、新しいデータが現在の列車データのサンプルと大きく異なる場合に大きな変化です。勾配ステップは列車データの変動を補償できないため、学習の繰り返しを増やすだけでは問題を解決することはできません。勾配のステップを減らすだけで、訓練データへの採用が遅くなります。

関連する問題