【问题标题】:Immense error in regression exercise回归练习中的巨大错误
【发布时间】:2018-05-01 03:28:33
【问题描述】:

我目前正在尝试了解如何借助 Tensorflow 解决回归问题。不幸的是,一旦我尝试为我的输入数据引入第二个维度,错误或损失就会变得异常大。

我使用的数据集是自制的,非常简单。这些值都已排序,X2 只是 x1 + 1 中的每个值

X1 = [2.167,3.1,3.3,4.168,4.4,5.313,5.5,5.654,6.182,6.71,6.93,7.042,7.59,7.997,9.27,9.779,10.791]
X2 = [3.167,4.1,4.3,5.168,5.4,6.313,6.5,6.654,7.182,7.71,7.93,8.042,8.59,8.997,10.27,10.779,11.791]
y = [1.221,1.3,1.573,1.65,1.694,1.7,2.09,2.42,2.53,2.596,2.76,2.827,2.904,2.94,3.19,3.366,3.465]

我尝试使用线性回归来近似值:

numbers = pd.DataFrame({'x1': X1, 'x2':X2})

X_train, X_test, y_train, y_test = train_test_split(numbers,y,test_size=0.3,random_state=101)

X_data = tf.placeholder(shape=[None,2], dtype=tf.float32)
y_target = tf.placeholder(shape=[None], dtype=tf.float32)

w1 = tf.Variable(tf.random_normal(shape=[2,1])) 
b1 = tf.Variable(tf.random_normal(shape=[1]))

final_output = tf.add(tf.matmul(X_data, w1), b1)

loss = tf.reduce_sum(tf.square(final_output-y_target))

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

init = tf.global_variables_initializer()

steps = 5000

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})

        # PRINT OUT A MESSAGE EVERY 100 STEPS
        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/5)

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

这给了我输出

Currently on step 0
Training cost= 12376958566.4
Currently on step 500
Training cost= nan
Currently on step 1000
Training cost= nan
Currently on step 1500
Training cost= nan
Currently on step 2000
Training cost= nan
Currently on step 2500
Training cost= nan
Currently on step 3000
Training cost= nan
Currently on step 3500
Training cost= nan
Currently on step 4000
Training cost= nan
Currently on step 4500
Training cost= nan
Training cost= nan

我使用 Adagrad 优化器获得了更好的结果,错误为 5,但我仍然认为应该有更多可能。

这里可以选择添加隐藏层吗?我之前也试过这个,但是当我在层中使用 relu 作为我的激活函数并且在我的输出层上只使用 f(x)=x 时,我收到了类似的高 nan-errors。

【问题讨论】:

  • 好像是学习率的问题。试试optimizer = tf.train.GradientDescentOptimizer(learning_rate=5e-5)

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


【解决方案1】:

有两个问题。首先,您使用的是tf.reduce_sum 而不是tf.reduce_mean,因此您拥有的数据越多,损失就越大。这会向GradientDescentOptimizer 发送一个巨大的信号,因此学习到的权重会发生巨大的跳跃,并且您的模型会发散。

第二个问题是你的学习率还是太大了;正如 user2015762 所建议的那样,当您的损失越来越大时,这通常是问题所在。使用learning_rate=0.001 和您的代码,我得到了很好的结果。

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多