2017-07-12 109 views
0

我目前使用線性迴歸運行TensorFlow模型。但是,我不明白爲什麼,即使我將learning_rate從0.01降低到0.001並將訓練迭代次數從1000增加到50000,我仍然可以獲得成本函數的「nan」結果以及兩個係數。任何人都可以請幫我檢測下面的代碼中的問題?TensorFlow線性迴歸給出'NaN'結果

from __future__ import print_function 

    import tensorflow as tf 
    import numpy 
    import matplotlib.pyplot as plt 
    import pandas as pd 
    from sklearn.model_selection import train_test_split 
    import random 

    rng = numpy.random 


    # Parameters 
    learning_rate = 0.001 
    training_epochs = 20000 #number of iterations 
    display_step = 400 



    #read csv file 
    datapath = [directory path] 

    Ha_Noi = pd.read_csv(datapath+"HaNoi_1month_LW_WeatherTest.csv") 
    #Add an additional column into the table 
    sLength = len(Ha_Noi['accept_rate']) 
    Ha_Noi['accept_rate_timeT'] = pd.Series(Ha_Noi['accept_rate'], index=Ha_Noi.index) 
    #Shift the entries in the accept_rate column upward 
    Ha_Noi.accept_rate = Ha_Noi.accept_rate.shift(-1) 

    Ha_Noi = Ha_Noi.dropna(subset = ["longwait_percent4"]) 
    Ha_Noi = Ha_Noi.dropna(subset=["accept_rate"]) 
    Ha_Noi = Ha_Noi.dropna(subset = ["longwait_percent2"]) 
    df2 = pd.DataFrame(Ha_Noi) 

    #split the dataset into training and testing sets 
    train_set, test_set = train_test_split(Ha_Noi, test_size=0.2, random_state = random.randint(20, 200)) 
    Xtrain = train_set['longwait_percent2'].reshape(-1,1) 
    Ytrain = train_set['accept_rate'].reshape(-1,1) 

    Xtrain2 = train_set['Weather Weight_Longwait_percent2'].reshape(-1,1) 
    Xtest2 = test_set['Weather Weight_Longwait_percent2'].reshape(-1,1) 

    # Xtest = test_set['longwait_percent2'].reshape(-1,1) 
    # Ytest = test_set['accept_rate'].reshape(-1,1) 

    # Training Data 
    train_X = Xtrain 
    train_Y = Ytrain 
    n_samples = train_X.shape[0] 

    #Testing Data 
    Xtest = np.asarray(test_set['longwait_percent2']) 
    Ytest = np.asarray(test_set['accept_rate']) 

    # tf Graph Input 
    X = tf.placeholder("float") 
    Y = tf.placeholder("float") 

    # Set model weights 
    W = tf.Variable(rng.randn(), name="weight") 
    b = tf.Variable(rng.randn(), name="bias") 

    # Construct a linear model 
    pred = tf.add(tf.multiply(X, W), b) 

    # Mean squared error 
    cost = tf.sqrt(tf.reduce_sum(tf.pow(pred-Y, 2))/(n_samples)) 

    # Gradient descent method 
    # Note, minimize() knows to modify W and b because Variable objects are "trained" (trainable=True by default) 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 

    # Initializing the variables 
    init = tf.global_variables_initializer() 
    saver = tf.train.Saver() #save all the initialized data 

    # Launch the graph 
    with tf.Session() as sess: 
     sess.run(init) 

     # Fit all training data 
     for epoch in range(training_epochs): 
      for (x, y) in zip(train_X, train_Y): 
       sess.run(optimizer, feed_dict={X: x, Y: y}) 

      # Display logs per epoch step 
      if (epoch+1) % display_step == 0: # checkpoint every 50 epochs 
       c = sess.run(cost, feed_dict={X: train_X, Y:train_Y}) 
       print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \ 
        "W=", sess.run(W), "b=", sess.run(b)) 

     print("Optimization Finished!") 
     training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y}) 
     print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n') 

     # Graphic display 
     plt.plot(train_X, train_Y, 'ro', label='Original data') 
     plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line') 
     plt.legend() 
     plt.show() 

     testing_cost = sess.run(
      tf.reduce_sum(tf.pow(pred - Y, 2))/(Xtest.shape[0]), 
      feed_dict={X: Xtest, Y: Ytest}) # square root of function cost above 
     print("Root Mean Square Error =", tf.sqrt(testing_cost)) 
     print("Absolute mean square loss difference:", abs(
      training_cost - testing_cost)) 

     plt.plot(Xtest, Ytest, 'bo', label='Testing data') 
     plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line') 
     plt.legend() 
     plt.show() 

回答

1

沒有您的數據,所以很難判斷問題是由數據還是培訓問題造成的。你可以使學習率和訓練迭代小得多,例如0.00005和100,看看還有NaN。

+0

奇怪的是,當我把成本函數的分母中的因子2放回去時,我仍然得到了nan。假設數據沒有問題,您是否可以幫助檢查上面的代碼中是否存在任何問題?我也想計算RMSE,我想我只需要把tf.sqrt()放在這個公式之外:tf.reduce_sum(tf.pow(pred - Y,2))/(Xtest.shape [0]) 。它是否正確? – user177196

+0

我能夠運行上面的代碼並獲得結果。然而,這種情況下的RMSE比Skit-Learn線性迴歸模型的* MUCH WORSE *大得多。這是否意味着我的代碼是錯誤的?我發現很難相信像上面這樣強大的方法(使用漸變下降)可以給出比Skit-Learn的線性迴歸()更大的RMSE。誰能請幫忙解釋一下? – user177196