我有一个似乎工作正常的线性回归模型。我首先将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
,但在实现过程中遇到了问题。文档说它需要两个参数,labels
和predictions
,所以我尝试了以下代码…
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激活。