1

機械学習とTensorflowを初めて使用しています。現在私は、y = a * xという形式の単純な線形回帰モデルを作成するためのチュートリアルのロジックに従っています(バイアス項はありません)。しかし、何らかの理由でモデルが正しい値 "a"に収束しない。データセットは私がExcelで作成したものです。以下に示すよう:単純な線形回帰がテンソルフローに収束しない

enter image description here

ここで私は、生成、このダミーデータセットにtensorflow実行しようとする私のコードです。以下

import tensorflow as tf 
import pandas as pd 

w = tf.Variable([[5]],dtype=tf.float32) 
b = tf.Variable([-5],dtype=tf.float32) 
x = tf.placeholder(shape=(None,1),dtype=tf.float32) 
y = tf.add(tf.matmul(x,w),b) 

label = tf.placeholder(dtype=tf.float32) 
loss = tf.reduce_mean(tf.squared_difference(y,label)) 

data = pd.read_csv("D:\\dat2.csv") 
xs = data.iloc[:,:1].as_matrix() 
ys = data.iloc[:,1].as_matrix() 
optimizer = tf.train.GradientDescentOptimizer(0.000001).minimize(loss) 
sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer()) 

for i in range(10000): 
    sess.run(optimizer,{x:xs,label:ys}) 
    if i%100 == 0: print(i,sess.run(w)) 
print(sess.run(w)) 

あなたは第万反復の後に見ることができるよう、ipythonコンソールでプリントアウトされ、Wの値は、誰もが上のいくつかの光を当てることができれば、私は本当に感謝の周りの4.53代わりに、正しい値の6 です何がここで間違っているのか。私は0.01から0.0000001までのさまざまな学習率で遊んだが、設定のどれもが6に収束することはできない。標準正規分布に正規化することを提案しているが、これを正規化するかどうかを知りたい。必要がありますか?正規化なしでは、勾配勾配は解を見つけることができませんか?どうもありがとうございました!

enter image description here

+0

は 'randbetween'が0と0.1の代わりに渡された場合はどう-2,2、 –

+0

あなたの学習率は非常に低いです。いくつの異なる価値がありますか? (あなたのExcelにはいくつの行がありますか?)その数値が小さすぎると問題が発生する可能性があります... 十分なデータがある場合(十分に大きい範囲の場合)、正規化なしで収束する必要があります。 – gdelab

+0

@gdelabデータセットには約160データポイントが含まれています。私は0.1や1のようなもっと大きな学習率で遊んだことがありますが、役に立たないのです。私は10000回反復することでモデルはまだ収束するはずだと思った – Rookie

答えて

1

これは、シェーピングの問題があります。yとラベルが同じ形状([batch_size][batch_size, 1])を持っていません。 loss = tf.reduce_mean(tf.squared_difference(y, label))では、おそらく何らかの放送を使用して、テンソルの流れがあなたが望むものと違った解釈をするようになります...とにかく、あなたの損失はあなたが望むものではないという結果になります。

以下単に私のフル作業コード

y = tf.add(tf.matmul(x, w), b) 
y = tf.reshape(y, shape=[-1]) 
によって

y = tf.add(tf.matmul(x, w), b) 

を置き換え、それを修正するには:

import tensorflow as tf 
import pandas as pd 

w = tf.Variable([[4]], dtype=tf.float64) 
b = tf.Variable([10.0], dtype=tf.float64, trainable=True) 
x = tf.placeholder(shape=(None, 1), dtype=tf.float64) 
y = tf.add(tf.matmul(x, w), b) 
y = tf.reshape(y, shape=[-1]) 
label = tf.placeholder(shape=(None), dtype=tf.float64) 
loss = tf.reduce_mean(tf.squared_difference(y, label)) 

my_path = "/media/sf_ShareVM/data2.csv" 
data = pd.read_csv(my_path, sep=";") 
max_n_samples_to_use = 50 
xs = data.iloc[:max_n_samples_to_use, :1].as_matrix() 
ys = data.iloc[:max_n_samples_to_use, 1].as_matrix() 
lr = 0.000001 
optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) 
sess = tf.InteractiveSession() 
sess.run(tf.global_variables_initializer()) 

for i in range(100000): 
    _, loss_value, w_value, b_value, y_val, lab_val = sess.run([optimizer, loss, w, b, y, label], {x: xs, label: ys}) 
    if i % 100 == 0: print(i, loss_value, w_value, b_value) 
    if (i%2000 == 0 and 0< i < 10000): # We use a smaller LR at first to avoid exploding gradient. It would be MUCH cleaner to use gradient clipping (by global norm) 
     lr*=2 
     optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss) 

print(sess.run(w)) 
+0

もちろん、あなたがしたくないプリントを削除することができます – gdelab

+0

最初のいくつかの非常に良いステップの後、それは非常に収束することがわかりますゆっくり(特にバイアス)。それを修正するには、より大きな学習率が必要です。残念ながら、ここでは爆発的なグラデーションの境界にあります。特に、データからすべての値を保持している場合は、小さな学習率が必要です。理想的には、グラデーションをクリップし、より大きな学習率を使用する必要があります。 – gdelab

+0

ありがとう@gdelab、それは実際にシェイプの問題です。一度固定されると、モデルは非常に迅速に適切な値に収束します。ありがとう – Rookie

関連する問題