0

現在、Tensorflowの助けを借りて回帰問題を解決する方法を理解しようとしています。残念ながら、私の入力データに2番目の次元を導入しようとすると、エラーまたは損失は非常に大きくなります。回帰練習で重大なエラーが発生する

私が使用しているデータセットは、自作で非常に簡単です。値は、すべてのソートおよびX2は、私は、線形回帰を使用して値を近似しようとしたX1 + 1

X1 = [2.167,3.1,3.3,4.168,4.4,5.313,5.5,5.654,6.182,6.71,6.93,7.042,7.59,7.997,9.27,9.779,10.791] 
X2 = [3.167,4.1,4.3,5.168,5.4,6.313,6.5,6.654,7.182,7.71,7.93,8.042,8.59,8.997,10.27,10.779,11.791] 
y = [1.221,1.3,1.573,1.65,1.694,1.7,2.09,2.42,2.53,2.596,2.76,2.827,2.904,2.94,3.19,3.366,3.465] 

からわずかすべての値であるされています

numbers = pd.DataFrame({'x1': X1, 'x2':X2}) 

X_train, X_test, y_train, y_test = train_test_split(numbers,y,test_size=0.3,random_state=101) 

X_data = tf.placeholder(shape=[None,2], dtype=tf.float32) 
y_target = tf.placeholder(shape=[None], dtype=tf.float32) 

w1 = tf.Variable(tf.random_normal(shape=[2,1])) 
b1 = tf.Variable(tf.random_normal(shape=[1])) 

final_output = tf.add(tf.matmul(X_data, w1), b1) 

loss = tf.reduce_sum(tf.square(final_output-y_target)) 

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1) 
train = optimizer.minimize(loss) 

init = tf.global_variables_initializer() 

steps = 5000 

with tf.Session() as sess: 

    sess.run(init) 

    for i in range(steps): 

     sess.run(train,feed_dict={X_data:X_train,y_target:y_train}) 

     # PRINT OUT A MESSAGE EVERY 100 STEPS 
     if i%500 == 0: 

      print('Currently on step {}'.format(i)) 

      training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test}) 
      print("Training cost=", training_cost/5) 

    training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test}) 
    print("Training cost=", training_cost) 

これは私に出力

Currently on step 0 
Training cost= 12376958566.4 
Currently on step 500 
Training cost= nan 
Currently on step 1000 
Training cost= nan 
Currently on step 1500 
Training cost= nan 
Currently on step 2000 
Training cost= nan 
Currently on step 2500 
Training cost= nan 
Currently on step 3000 
Training cost= nan 
Currently on step 3500 
Training cost= nan 
Currently on step 4000 
Training cost= nan 
Currently on step 4500 
Training cost= nan 
Training cost= nan 
を与えます

Adagradオプティマイザで5の誤差を与えた結果、少し良い結果が得られましたが、もっと多くの可能性があるはずです。

ここで隠れたレイヤーを追加するオプションはありますか?私も以前これを試しましたが、レイヤーの活性化機能としてreluを使用していて、出力レイヤーのf(x)=xだけを使用していましたが、同様の高いナノエラーを受けました。

+1

学習率の問題のようです。 'optimizer = tf.train.GradientDescentOptimizer(learning_rate = 5e-5)'を試してみてください。 – user2015762

答えて

0

2つの問題があります。まず、tf.reduce_meanの代わりにtf.reduce_sumを使用しています。データが多いほど、損失は大きくなります。これにより、巨大な信号がGradientDescentOptimizerに送信されるため、学習された重みが大きく飛躍し、モデルが分岐します。

2番目の問題は、学習率がまだ大きすぎることです。 user2015762の示唆しているように、これは損失が増えているときにしばしば問題になります。あなたのコードにlearning_rate=0.001を使って良い結果が得られました。

関連する問題