2016-09-13 3 views
1

複数の線形回帰の2つの実装があります.1つはtensorflowを使用し、もう1つはnumpyを使用します。 numpy実装がhereである私は、データのダミーセットを生成し、私は私が使用される重みを回復しようとするが、numpy 1は、初期の重みを返すものの、tensorflow一つは常に(これも一種の仕事の)複数の線形回帰のためにTensorFlowを使用すると、異なる重みが得られるのはなぜですか?

を異なる重みを返します。ここでTFの実装です:numpyバージョンは私がデータを生成するのに使用される重みに非常に近いです[0.392, 0.907, 0.9288]周りの重みを取得する実行中

import numpy as np 
import tensorflow as tf 

x = np.array([[i, i + 10] for i in range(100)]).astype(np.float32) 
y = np.array([i * 0.4 + j * 0.9 + 1 for i, j in x]).astype(np.float32) 

# Add bias 
x = np.hstack((x, np.ones((x.shape[0], 1)))).astype(np.float32) 

# Create variable for weights 
n_features = x.shape[1] 
np.random.rand(n_features) 
w = tf.Variable(tf.random_normal([n_features, 1])) 
w = tf.Print(w, [w]) 

# Loss function 
y_hat = tf.matmul(x, w) 
loss = tf.reduce_mean(tf.square(tf.sub(y, y_hat))) 

operation = tf.train.GradientDescentOptimizer(learning_rate=0.000001).minimize(loss) 

with tf.Session() as session: 
    session.run(tf.initialize_all_variables()) 
    for iteration in range(5000): 
     session.run(operation) 
    weights = w.eval() 
    print(weights) 

スクリプトを実行するには、私に[-0.481, 1.403, 0.701]周りの重みを取得します。[0.4, 0.9, 1]

学習率とエポックパラメータの両方が同じであり、両方ともランダムに初期化されます。どちらの実装でもデータを正規化せず、複数回実行しました。

結果が異なるのはなぜですか?私はまた、w = tf.Variable(np.random.rand(n_features).reshape(n_features,1).astype(np.float32))を使ってTFバージョンの重みを初期化しようとしましたが、それも修正されませんでした。 TF実装に何か問題がありますか?

答えて

0

問題は放送されているようです。上記のy_hatの形状は(100,1)であり、y(100,)である。したがって、tf.sub(y, y_hat)を実行すると、(100,100)の行列が得られます。これは、2つのベクトル間のすべての可能な減算の組み合わせです。私は分かりませんが、あなたはこれを避けることができたと思います。あなたのコードを修正する

二つの方法:

y = np.array([[i * 0.4 + j * 0.9 + 1 for i, j in x]]).astype(np.float32).T 

または

y_hat = tf.squeeze(tf.matmul(x, w)) 

私はこれを実行すると、それはまだ実際にあなたが望む答えに収束、しかしではありません、それは言った、が、少なくとも実際には損失関数を最小化することができます。

関連する問題