2017-04-12 112 views
1

這是我第一次學嘗試在TensorFlow:我建立一個線性迴歸模型多個輸入TensorFlow:線性迴歸的多輸入返回NaN的

問題是,結果總是NaN,我懷疑這是因爲我是一個完整的noob矩陣操作使用numpy和tensorflow(matlab背景hehe)。

下面是代碼:

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

您需要添加keep_dims=True您的linear_model定義中。也就是說,

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