【问题标题】:Tensorflow Linear Regression predictions returning [nan]Tensorflow 线性回归预测返回 [nan]
【发布时间】:2019-12-31 10:25:46
【问题描述】:

我正在尝试使用 Tensor Flow(没有估计器的帮助)创建我的第一个线性回归器,并且在每次迭代中,我只看到 cost 的值 NaN。我认为我没有做正确的事情,但无法在这个问题上归零。有人可以帮我解决问题吗?

我正在使用 CA 住房数据集

# Common imports
import math
import numpy as np
import tensorflow as tf
import pandas as pd
from sklearn import metrics

california_housing_dataframe = pd.read_csv("https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv", sep=",")

我正在预测median_house_value

data_X = california_housing_dataframe.iloc[:, :8]
data_y = california_housing_dataframe.iloc[:, 8]
print('Features (X):\n', data_X.head(), '\n')
print('Target (y):\n', data_y.head(), '\n')

创建训练和验证集

from sklearn.model_selection import train_test_split

data_X_train, data_X_validate = train_test_split(data_X, test_size=0.2, random_state=42)
data_y_train, data_y_validate = train_test_split(data_y, test_size=0.2, random_state=42)

设置超空间参数和 TensorFlow 变量

# Hyperspace Params
learning_rate = 0.01
training_epochs = 1 #40
batch_size = 500 #50
totalBatches = len(data_X_train)/batch_size

n, m = data_X_train.shape # 17,000 Rows + 9 Features
print('n=', n, ', m=', m)

W = tf.Variable(tf.random_uniform([m, 1], -1.0, 1.0, dtype = tf.float64), name="theta") # Random initialization
b = tf.Variable(np.random.randn(), name = "b", dtype = tf.float64)
X = tf.placeholder(tf.float64, shape=(None, m), name="X")
y = tf.placeholder(tf.float64, shape=(None, 1), name="y")

print('X.shape :\n', X.shape, '\n')
print('y.shape :\n', y.shape, '\n')
print('b.shape :\n', b.shape, '\n')
print('Thetha.shape (W):\n', W.shape, '\n')

y_pred = tf.add(tf.matmul(X, W), b, name="predictions")
error = y_pred - y
cost = tf.reduce_mean(tf.square(error), name="mse")
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Global Variables Initializer
init = tf.global_variables_initializer()

现在,训练模型只返回 NaN

def get_batch(X, y, batch_size):
  rnd_idx = np.random.permutation(len(X))
  n_batches = len(X) // batch_size
  for batch_idx in np.array_split(rnd_idx, n_batches):
    X_batch, y_batch = X.iloc[batch_idx, :], y[batch_idx]
    yield X_batch, y_batch

# Global Variables Initializer
init = tf.global_variables_initializer()

with tf.Session() as sess:
  sess.run(init)
  for epoch in range(training_epochs):
    for X_batch, y_batch in get_batch(data_X_train, data_y_train, batch_size):
      y_batch = np.array(y_batch).reshape(-1, 1)
      sess.run(optimizer, feed_dict={X: X_batch, y: y_batch})
      curr_y_pred, curr_error, curr_cost = sess.run([y_pred, error, cost], {X: X_batch, y: y_batch})
      print('Training... batch.shape: ', X_batch.shape,'curr_error:', curr_error)

结果看起来像

Training... batch.shape:  (504, 8) curr_error: [[nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 ...

【问题讨论】:

    标签: python tensorflow regression linear-regression


    【解决方案1】:

    您的问题来自pd.read_csv(...) 函数。我把它换成了NumPy 版本(我不熟悉Pandas),它就像一个魅力。这是整个sn-p:

    import math
    import numpy as np
    import tensorflow as tf
    from sklearn import metrics
    
    california_housing_dataframe = np.genfromtxt('https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv', delimiter=',', skip_header=1)
    
    data_X = california_housing_dataframe[:, :8]
    data_y = california_housing_dataframe[:, 8]
    
    from sklearn.model_selection import train_test_split
    
    data_X_train, data_X_validate = train_test_split(data_X, test_size=0.2, random_state=42)
    data_y_train, data_y_validate = train_test_split(data_y, test_size=0.2, random_state=42)
    
    # Hyperspace Params
    learning_rate = 0.01
    training_epochs = 1 #40
    batch_size = 500 #50
    totalBatches = len(data_X_train)/batch_size
    
    n, m = data_X_train.shape # 17,000 Rows + 9 Features
    print('n=', n, ', m=', m)
    
    W = tf.Variable(tf.random_uniform([m, 1], -1.0, 1.0, dtype = tf.float64), name="theta") # Random initialization
    b = tf.Variable(np.random.randn(), name = "b", dtype = tf.float64)
    X = tf.placeholder(tf.float64, shape=(None, m), name="X")
    y = tf.placeholder(tf.float64, shape=(None, 1), name="y")
    
    print('X.shape :\n', X.shape, '\n')
    print('y.shape :\n', y.shape, '\n')
    print('b.shape :\n', b.shape, '\n')
    print('Thetha.shape (W):\n', W.shape, '\n')
    
    y_pred = tf.add(tf.matmul(X, W), b, name="predictions")
    error = y_pred - y
    cost = tf.reduce_mean(tf.square(error), name="mse")
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
    
    # Global Variables Initializer
    init = tf.global_variables_initializer()
    
    def get_batch(X, y, batch_size):
      rnd_idx = np.random.permutation(len(X))
      n_batches = len(X) // batch_size
      for batch_idx in np.array_split(rnd_idx, n_batches):
        X_batch, y_batch = X[batch_idx, :], y[batch_idx]
        yield X_batch, y_batch
    
    with tf.Session() as sess:
      sess.run(init)
      for epoch in range(training_epochs):
        for X_batch, y_batch in get_batch(data_X_train, data_y_train, batch_size):
          y_batch = np.array(y_batch).reshape(-1, 1)
          sess.run(optimizer, feed_dict={X: X_batch, y: y_batch})
          curr_y_pred, curr_error, curr_cost = sess.run([y_pred, error, cost], {X: X_batch, y: y_batch})
          print('Training... batch.shape: ', X_batch.shape,'curr_error:', curr_error)
    

    【讨论】:

    • 非常感谢!您能否告诉我们您是如何确定根本原因的?
    • 当然,我使用调试器进入,发现您的 X_batch 不是数组,而是某种对象。后来懒得看pandas的文档,就换成我心知肚明的NumPy
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2017-10-13
    相关资源
    最近更新 更多