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

时间:2017-11-23 08:50:04

标签: python-3.x machine-learning tensorflow linear-regression

我有一个似乎有效的线性回归模型。我首先将data加载到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中完成此操作,或者甚至可能。

我想我能够计算Mean Squared Error。这有什么用?

修改

我尝试按照评论中的建议实施tf.metrics.accuracy,但我遇到了实施问题。文档说它需要2个参数labelspredictions,所以我尝试了以下内容......

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

print(sess.run(accuracy))

但这给了我一个错误......

  

FailedPreconditionError(参见上面的回溯):尝试使用未初始化的值准确度/计数        [[节点:准确度/计数/读取= IdentityT = DT_FLOAT,_class = [" loc:@ accuracy / count"],_ device =" / job:localhost / replica:0 / task:0 /装置:CPU:0"]]

如何实现这一目标?

2 个答案:

答案 0 :(得分: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上读到了关于使用局部变量进行精度计算的内容,这就是为什么局部变量初始化器是必要的。

答案 1 :(得分: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.matmul替换tf.multiply,你就好了。我假设你所拥有的对于单类线性回归问题可能是好的,但如果你计划解决多类回归问题或实现更深层的网络,这绝对是你想要的方式。
  • 您的体重和偏见张力的形状为(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激活。 / LI>