【问题标题】:Neural network for linear regression using tensorflow使用 tensorflow 进行线性回归的神经网络
【发布时间】:2017-03-10 18:59:54
【问题描述】:

我刚开始学习 tensorflow,正在实现一个用于线性回归的神经网络。我正在关注一些可用的在线教程能够编写代码。我没有使用激活函数,我使用的是 MSE(tf.reduce_sum(tf.square(output_layer - y)))。当我运行代码时,我得到Nan 作为预测精度。我使用的代码如下所示

# Placeholders
X = tf.placeholder("float", shape=[None, x_size])
y = tf.placeholder("float")

w_1 = tf.Variable(tf.random_normal([x_size, 1], seed=seed))

output_layer = tf.matmul(X, w_1)
predict = output_layer

cost = tf.reduce_sum(tf.square(output_layer - y))
optimizer =  tf.train.GradientDescentOptimizer(0.0001).minimize(cost)

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)


for epoch in range(100):
        # Train with each example
        for i in range(len(train_X)):
            sess.run(optimizer, feed_dict={X: train_X[i: i + 1], y: train_y[i: i + 1]})

            train_accuracy = np.mean(sess.run(predict, feed_dict={X: train_X, y: train_y}))
            test_accuracy  = np.mean(sess.run(predict, feed_dict={X: test_X, y: test_y}))

            print("Epoch = %d, train accuracy = %.2f%%, test accuracy = %.2f%%"
            % (epoch + 1, 100. * train_accuracy, 100. * test_accuracy))


# In[121]:

sess.close() 

下面给出了一个示例输出

Epoch = 1, train accuracy = -2643642714558682640372224491520000.000000%, test accuracy = -2683751730046365038353121175142400.000000%
Epoch = 1, train accuracy = 161895895004931631079134808611225600.000000%, test accuracy = 165095877160981392686228427295948800.000000%
Epoch = 1, train accuracy = -18669546053716288450687958380235980800.000000%, test accuracy = -19281734142647757560839513130087219200.000000%
Epoch = 1, train accuracy = inf%, test accuracy = inf%
Epoch = 1, train accuracy = nan%, test accuracy = nan%

感谢任何帮助。另外,如果你能提供调试提示,那就太好了。

谢谢。

注意: 当我运行单批次时,预测值变得太大

sess.run(optimizer, feed_dict={X: train_X[0:1], y: train_y[0:1]})
sess.run(optimizer, feed_dict={X: train_X[1:2], y: train_y[1:2]})
sess.run(optimizer, feed_dict={X: train_X[2:3], y: train_y[2:3]})
print(sess.run(predict, feed_dict={X: train_X[3:4], y: train_y[3:4]}))

输出

[[  1.64660544e+08]]

注意: 当我将学习率降低到一个小值(1e-8)时,它有点工作。尽管如此,当我在同一个数据集上运行回归时,更高的学习率工作得很好。 那么高学习率是这里的问题吗?

【问题讨论】:

    标签: python-3.x tensorflow neural-network linear-regression


    【解决方案1】:
    cost = tf.reduce_sum(tf.square(output_layer - y))
    

    在这一行,您正在计算批次中每个张量的总和,其中批次是批次的平方差。

    如果您的批次大小为 1(随机梯度下降),这没关系,相反,由于您想要进行小批量梯度下降(批次大小 > 1),您希望最小化 平均值批处理出错。

    因此,你想最小化这个函数:

    cost = tf.reduce_mean(tf.square(output_layer - y))
    

    tf.reduce_mean 计算其输入中元素的平均值。

    如果批量大小为 1,则公式的行为与您之前使用的完全相同,但是当批量大小大于 1 时,它会计算该批次的均方误差,这就是您想要的。

    【讨论】:

    • 我正在运行一个批量大小。无论如何,我尝试进行您建议的更改,但预测值仍然变得太大。我写的代码有错误吗?