Tensorflow- 如何显示线性回归模型的准确率

3

我有一个看起来可行的线性回归模型。首先将数据加载到X中,将目标列加载到Y中,之后我执行以下操作...

X_train, X_test, Y_train, Y_test = train_test_split(
    X_data, 
    Y_data, 
    test_size=0.2
)

rng = np.random

n_rows = X_train.shape[0]

X = tf.placeholder("float")
Y = tf.placeholder("float")


W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")

pred = tf.add(tf.multiply(X, W), b)

cost = tf.reduce_sum(tf.pow(pred-Y, 2)/(2*n_rows))

optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(cost)



init = tf.global_variables_initializer()
init_local = tf.local_variables_initializer()

with tf.Session() as sess:

    sess.run([init, init_local])

    for epoch in range(FLAGS.training_epochs):

        avg_cost = 0

        for (x, y) in zip(X_train, Y_train):

            sess.run(optimizer, feed_dict={X:x, Y:y})

        # display logs per epoch step
        if (epoch + 1) % FLAGS.display_step == 0:

            c = sess.run(
                cost, 
                feed_dict={X:X_train, Y:Y_train}
            )

            print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(c))

    print("Optimization Finished!")

    accuracy, accuracy_op = tf.metrics.accuracy(labels=tf.argmax(Y_test, 0), predictions=tf.argmax(pred, 0))

    print(sess.run(accuracy))

我不知道如何打印出模型的准确率。例如,在sklearn中,如果你有一个模型,你只需要打印model.score(X_test,Y_test)即可。但我不知道如何在tensorflow中执行此操作,甚至不知道是否可能。
我认为可以计算均方误差。这有任何帮助吗?
编辑
我尝试按照评论中建议的实现tf.metrics.accuracy,但我在实现时遇到了问题。文档中说它需要两个参数labelspredictions,所以我尝试了以下...
accuracy, accuracy_op = tf.metrics.accuracy(labels=tf.argmax(Y_test, 0), predictions=tf.argmax(pred, 0))

print(sess.run(accuracy))

但是这会给我一个错误...

FailedPreconditionError(请参见上面的回溯):尝试使用未初始化的值accuracy/count        [[Node:accuracy/count/read = IdentityT=DT_FLOAT,_class = ["loc:@accuracy/count"],_device =“/ job:localhost / replica:0 / task:0 / device:CPU:0”]]

那么如何实现这个呢?


tf.metrics.accuracy 是返回一个张量,表示准确率的函数,其值为总数除以计数。而MSE并不能告诉你准确度得分。 - Flika205
@Flika205 我正在尝试实现它,但是我遇到了错误。请看我的编辑。 - buydadip
3个回答

5
原来,由于这是一个多类线性回归问题,而不是分类问题,因此使用tf.metrics.accuracy并不正确。相反,我将重心放在了减少均方误差(MSE)上,而不是以百分比的形式显示模型的准确度。
从其他示例中看,tf.metrics.accuracy从未用于线性回归,只用于分类。通常情况下,tf.metric.mean_squared_error才是正确的方法。
我实现了两种方法来计算对测试数据的预测的总MSE...
pred = tf.add(tf.matmul(X, W), b)
...
...
Y_pred = sess.run(pred, feed_dict={X:X_test})
mse = tf.reduce_mean(tf.square(Y_pred - Y_test))

或者

mse = tf.metrics.mean_squared_error(labels=Y_test, predictions=Y_pred)

他们都可以实现相同的功能,但显然第二种方法更为简洁。
这里有一个很好的解释如何测量线性回归模型准确度,链接在这里

2

我觉得从Tensorflow文档中并不是很清楚,但在运行准确度计算之前,您必须声明准确度操作并初始化所有全局和本地变量:

accuracy, accuracy_op = tf.metrics.accuracy(labels=tf.argmax(Y_test, 0), predictions=tf.argmax(pred, 0))
# ...
init_global = tf.global_variables_initializer
init_local = tf.local_variables_initializer
sess.run([init_global, init_local])
# ...
# run accuracy calculation

我在Stack Overflow上读到了有关使用本地变量进行精度计算的内容,这就是为什么需要本地变量初始化程序的原因。


我尝试实现了这个,但是仍然出现错误。是的,文档不是很好,我找不到任何显示模型准确性的工作模型示例,最接近的是让模型显示其成本和MSE。 - buydadip
你在初始化本地变量之前定义了准确度计算吗? - Aweston
不是在初始化之后,而是在我的答案编辑部分添加了代码。 - buydadip
好的,我编辑了我的问题并添加了完整的代码。我认为我很可能没有正确实现 tf.metrics.accuracy,但无论如何。 - buydadip
需要在初始化变量之前声明精度的行。我正在编辑答案以更清晰明了。 - Aweston

1
阅读您发布的完整代码后,我注意到了其他一些事情:
  • 在计算pred时,您使用了pred = tf.add(tf.multiply(X, W), b)tf.multiply执行逐元素乘法,并且不会为您提供神经网络所需的完全连接层(我假设这是您最终要解决的问题,因为您正在使用TensorFlow)。 要实现完全连接层,其中每个层i(包括输入和输出层)都有n i 个节点,您需要为每对连续层的权重和偏置矩阵分别创建。 第i个权重矩阵(第i层和第i + 1层之间的权重)的维数应为(n i ,n i + 1 ),第i个偏置矩阵的维数应为(n i + 1 ,1)。 然后,回到乘法操作-将tf.multiply替换为tf.matmul,就可以了。 我假设您的内容可能适用于单类线性回归问题,但如果您打算解决多类回归问题或实现更深层次的网络,则绝对应该采用这种方法。
  • 您的权重和偏置张量的形状为(1,1)。 您将变量赋予了np.random.randn()的初始值,根据文档according to the documentation,当没有参数给出时,它生成一个单精度浮点数。 您需要将权重和偏置张量的维数作为参数提供给np.random.randn()。 更好的方法是,您实际上可以在Tensorflow中将它们初始化为随机值:W = tf.Variable(tf.random_normal([dim0, dim1], seed = seed)(我总是使用种子值初始化随机变量以进行可重复性)
  • 只是提醒一下,如果您还不知道这一点,那么神经网络需要非线性激活函数才能有效。 如果所有激活都是线性的,那么无论您有多少层,最终都将归结为简单的线性回归。 许多人在隐藏层中使用relu激活。 对于输出层,请在多类分类问题中使用softmax激活,其中输出类别是互斥的(即,在任何给定输入的情况下,只有一个类别可以正确),并在多类分类问题中使用sigmoid激活,其中输出类别不是互斥的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接