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

我有一个似乎工作正常的线性回归模型。我首先将data加载到X中,并将目标列加载到Y中,之后我实现了以下代码…

X_train, X_test, Y_train, Y_test = train_test_split(    X_data,     Y_data,     test_size=0.2)rng = np.randomn_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})        # 每轮显示日志        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("优化完成!")    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″]]

这到底该如何实现?


回答:

在阅读了您发布的完整代码后,我注意到了一些其他问题:

  • 在计算pred时,您使用了pred = tf.add(tf.multiply(X, W), b)tf.multiply执行逐元素乘法,不会为您提供神经网络所需的全连接层(我假设这是您最终的目标,因为您使用的是TensorFlow)。要实现全连接层,其中每层i(包括输入和输出层)有ni个节点,您需要为每一对连续层提供单独的权重和偏置矩阵。第i个权重矩阵(i层与i+1层之间的权重)的维度应为(ni,ni + 1),第i个偏置矩阵的维度应为(ni + 1,1)。然后,回到乘法操作 – 将tf.multiply替换为tf.matmul,您就可以了。我认为您现在的设置对于单类线性回归问题可能没问题,但如果您计划解决多类回归问题或实现更深的网络,这绝对是您想要的方式。
  • 您的权重和偏置张量的形状为(1, 1)。您为变量提供了np.random.randn()的初始值,根据文档,当没有提供参数时,会生成一个浮点数。您的权重和偏置张量的维度需要作为参数提供给np.random.randn()。更好的是,您实际上可以在Tensorflow中将这些初始化为随机值:W = tf.Variable(tf.random_normal([dim0, dim1], seed = seed)(我总是使用种子值初始化随机变量以确保可重复性)
  • 仅供参考,如果您还不知道这一点,但神经网络要有效,需要非线性激活函数。如果所有激活都是线性的,那么无论您有多少层,最终都会简化为简单的线性回归。许多人对隐藏层使用relu激活。对于输出层,对于输出类别互斥的多类分类问题(即,对于任何给定输入只能有一个正确类别),使用softmax激活,对于输出类别不互斥的多类分类问题,使用sigmoid激活。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注