簡體   English   中英

Tensorflow線性回歸未收斂至正確成本

[英]Tensorflow Linear Regression not converging to correct cost

我正在嘗試在張量流中實現多元線性回歸(使用Boston Housing Dataset),但似乎我的成本函數正在收斂並且值不正確(在我的情況下為24000)。 我嘗試擴展功能,但仍然無法正常工作。 關於我在做什么錯的任何想法嗎? 這是代碼:

from sklearn.datasets import load_boston
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.cross_validation import train_test_split
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

rate = 0.000000011
epochs = 100
errors = []

def load_data():
    boston = load_boston()

    bos = pd.DataFrame(boston.data)

    output = pd.DataFrame(boston.target)

    return [bos, output]

xS, yS = load_data()

m = len(yS)

x_train, x_test, y_train, y_test = train_test_split(xS, yS, test_size=0.2)

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)

theta = tf.Variable(tf.zeros([len(xS.columns), 1]))
X = tf.placeholder(tf.float32, shape=[m, len(xS.columns)])
y = tf.placeholder(tf.float32, shape=[m, 1])
b = tf.Variable(tf.zeros([m, 1]))

model = tf.matmul(tf.transpose(theta), tf.transpose(X)) + b

cost = tf.reduce_sum(tf.square(y-model))/(2*m)

optimizer = tf.train.GradientDescentOptimizer(rate).minimize(cost)

init = [tf.global_variables_initializer(), tf.local_variables_initializer()]

with tf.Session() as sess:
    sess.run(init)
    for e in range(epochs):
        sess.run(optimizer, feed_dict={X:xS, y:yS})
        loss = sess.run(cost, feed_dict={X:xS, y:yS})
        print("cost at step", e, loss)
        errors.append(loss)
        if errors[len(errors)-1] > errors[len(errors)-2]:
            break

    theta_temp = np.array(sess.run(theta))
    b_temp = np.array(sess.run(b))

plt.plot(list(range(len(errors))), errors)
plt.show()
h = np.transpose(np.add(np.matmul(np.transpose(theta_temp), np.transpose(xS)), np.transpose(b_temp)))
print(r2_score(h, yS))

您正在正確地執行大多數操作。 我將建議您對代碼進行以下更改。

model = tf.matmul(X, theta) + b

以0.001和epoch 1000的學習率進行嘗試,請報告結果。

在你做的情況下

model = tf.matmul(tf.transpose(theta), tf.transpose(X)) + b

你在弄錯。 右側的第一部分的大小為(1,m),第二部分的大小為(m,1)。 然后,由於不期望的廣播,您將獲得一些結果。 這就是為什么您看到學習率僅為0.01或0.1的非常差的結果的原因。

我的第二個建議是刪除中斷標准。

if errors[len(errors)-1] > errors[len(errors)-2]: break

隨機梯度很嘈雜。 沒有證據表明,如果您沿較小的梯度方向前進,那么總會降低成本(也許對這個凸問題確實如此,但我必須思考)。

from sklearn.datasets import load_boston
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.cross_validation import train_test_split
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

rate = 0.1
epochs = 100
errors = []

def load_data():
    boston = load_boston()

    bos = pd.DataFrame(boston.data)

    output = pd.DataFrame(boston.target)

    return [bos, output]

xS, yS = load_data()


x_train, x_test, y_train, y_test = train_test_split(xS, yS, test_size=0.2)
m = len(y_train)

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)

theta = tf.Variable(tf.zeros([len(xS.columns), 1]))
X = tf.placeholder(tf.float32, shape=[m, len(xS.columns)])
y = tf.placeholder(tf.float32, shape=[m, 1])
b = tf.Variable(tf.zeros([1]))

model = tf.matmul(X, theta) + b

cost = tf.reduce_sum(tf.square(y-model))/(2*m)

optimizer = tf.train.GradientDescentOptimizer(rate).minimize(cost)

init = [tf.global_variables_initializer(), tf.local_variables_initializer()]

with tf.Session() as sess:
    sess.run(init)
    for e in range(epochs):
        sess.run(optimizer, feed_dict={X:x_train, y:y_train})
        loss = sess.run(cost, feed_dict={X:x_train, y:y_train})
        print("cost at step", e, loss)
        errors.append(loss)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM