2017-04-12 12 views
1

を返すこれがTensorFlowでの私の最初のattempです:私は複数の入力線形回帰モデルを構築しています。TensorFlow:線形回帰複数の入力とは、NaNを

結果は常にNaNであり、私はnumpyとtensorflow(matlab background hehe)を使用して行列演算を行う完全なnoobだからと考えています。ここで

はコードです:

import numpy as np 
import tensorflow as tf 

N_INP = 2 
N_OUT = 1 

# Model params 
w = tf.Variable(tf.zeros([1, N_INP]), name='w') 
b = tf.Variable(tf.zeros([1, N_INP]), name='b') 

# Model input and output 
x = tf.placeholder(tf.float32, [None, N_INP], name='x') 
y = tf.placeholder(tf.float32, [None, N_OUT], name='y') 
linear_model = tf.reduce_sum(x * w + b, axis=1, name='out') 

# Loss as sum(error^2) 
loss = tf.reduce_sum(tf.square(linear_model - y), name='loss') 

# Create optimizer 
optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(loss, name='train') 

# Define training data 
w_real = np.array([-1, 4]) 
b_real = np.array([1, -5]) 
x_train = np.array([[1, 2, 3, 4], [0, 0.5, 1, 1.5]]).T 
y_train = np.sum(x_train * w_real + b_real, 1)[np.newaxis].T 
print('Real X:\n', x_train) 
print('Real Y:\n', y_train) 

# Create session and init parameters 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

# Training loop 
train_data = {x: x_train, y: y_train} 
for i in range(1000): 
    sess.run(train, train_data) 

# Eval solution 
w_est, b_est, curr_loss, y_pred = sess.run([w, b, loss, linear_model], train_data) 
print("w: %s b: %s loss: %s" % (w_est, b_est, curr_loss)) 
print("y_pred: %s" % (y_pred,)) 

そして、ここでは、出力されます。

Real X: 
[[ 1. 0. ] 
[ 2. 0.5] 
[ 3. 1. ] 
[ 4. 1.5]] 
Real Y: 
[[-5.] 
[-4.] 
[-3.] 
[-2.]] 

w: [[ nan nan]] b: [[ nan nan]] loss: nan 
y_pred: [ nan nan nan nan] 

答えて

0

あなたはlinear_modelのあなたの定義内keep_dims=Trueを追加する必要があります。それは

linear_model = tf.reduce_sum(x * w + b, axis=1, name='out',keep_dims=True) 

理由は、そうでない場合、結果は「フラット化」されていることで、あなたはそれからyを引くことはできません。例えば

、解決

'x' is [[1,2,3], 
     [4,5,6]] 
tf.reduce_sum(x, axis=1) is [6, 15] 
tf.reduce_sum(x, axis=1, keep_dims=True) is [[6], [15]] 
+0

!ありがとう:) – ESala

関連する問題