【问题标题】:Huge loss in regression exercise! Testing with batch input?回归练习中的巨大损失!批量输入测试?
【发布时间】:2018-05-12 14:51:52
【问题描述】:

我目前正在运行以下代码,以便根据 6 个参数预测房屋价格:

import pandas as pd
import tensorflow as tf
import numpy as np

housing = pd.read_csv('cal_housing_clean.csv')

X = housing.iloc[:,0:6]
y = housing.iloc[:,6:]

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = pd.DataFrame(data=scaler.transform(X_train),columns = X_train.columns,index=X_train.index)
X_test = pd.DataFrame(data=scaler.transform(X_test),columns = X_test.columns,index=X_test.index)

X_data = tf.placeholder(dtype = "float", shape=[None,6])
y_target = tf.placeholder(dtype = "float", shape=[None,1])

hidden_layer_nodes = 10

w1 = tf.Variable(tf.random_normal(shape=[6,hidden_layer_nodes]))
b1 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes]))
w2 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1]))
b2 = tf.Variable(tf.random_normal(shape=[1]))

hidden_output = tf.nn.relu(tf.add(tf.matmul(X_data,w1),b1))
y_output = tf.add(tf.matmul(hidden_output,w2),b2)

loss = tf.reduce_mean(tf.square(y_target-y_output))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.00001)
train = optimizer.minimize(loss)

init = tf.global_variables_initializer()

steps = 100000

with tf.Session() as sess:

    sess.run(init)

    for i in range(steps):

        sess.run(train, feed_dict={X_data:X_train,y_target:y_train})

        if i%500 == 0:

            print('Currently on step {}'.format(i))

            training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test})
            print("Training cost=", training_cost/6192)

    training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test})
    print("Training cost=", training_cost/6192)

我在此认为由于 test_set 包含 6192 行数据,只需将总损失或错误除以该值即可解决问题,但不幸的是,我得到以下输出:

Currently on step 0
Training cost= 9190063.95866
Currently on step 500
Training cost= 9062077.85013
Currently on step 1000
Training cost= 8927415.89664
Currently on step 1500
Training cost= 8795428.38243
Currently on step 2000
Training cost= 8666037.25065
Currently on step 2500
Training cost= 8539182.30491
Currently on step 3000
Training cost= 8414841.71576

其中错误将下降到大约 200 万,而我希望值接近 100 或 200000。

也许我的代码中有一个错误导致近似值如此糟糕。我还尝试了不同的 learning_rates,结果相同。

我还想尝试通过批量发送测试数据来测试模型。我试过这个:

if i%500 == 0:

    rand_ind = np.random.randint(len(X_test),size=8)

    feed = {X_data:X_test[rand_ind],y_target:y_test[rand_ind]}

    loss = tf.reduce_sum(tf.square(y_target-y_output)) / 8

    print(sess.run(loss,feed_dict=feed))

但不幸的是,我总是被告知我用 rand_ind 选择的索引“不在索引中”。

【问题讨论】:

    标签: python tensorflow neural-network batch-processing linear-regression


    【解决方案1】:

    您可以尝试 tf.train.AdamOptimizer 并提高您的学习率(可能在 0.1 左右)。这将提高收敛速度。

    【讨论】:

    • 不幸的是,错误越来越大
    • 对不起,损失真的变低了,现在860000左右,已经是进步了。我的代码中是否还有其他错误使我无法获得更好的损失。我不得不说我对这个话题很陌生,并且在选择正确的损失和优化器函数方面特别有问题。只检查小批量而不是整组的损失可能会有所帮助吗?我尝试使用 rand_ind = np.random.random_integers(len(X_test)+1) 和 feed = {X_data:X_test.iloc[rand_ind:rand_ind+8,:],y_target:y_test.iloc[rand_ind :rand_ind+8,:]}
    • 对不起,我不清楚你的问题。如果 StackOverflow 与此不同,您可能会在 StackOverflow 中提出不同的问题。顺便说一句,如果损失越来越低,您可以进一步提高学习率(1、1.5 等)。
    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2019-02-16
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多