我有一个似乎有效的线性回归模型。我首先将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个参数labels
和predictions
,所以我尝试了以下内容......
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"]]
如何实现这一目标?
答案 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,你就好了。我假设你所拥有的对于单类线性回归问题可能是好的,但如果你计划解决多类回归问题或实现更深层的网络,这绝对是你想要的方式。np.random.randn()
的初始值,according to the documentation在没有给出参数时生成单个浮点数。您的体重和偏差张量的尺寸需要作为np.random.randn()
的参数提供。更好的是,您可以在Tensorflow中将这些值初始化为随机值:W = tf.Variable(tf.random_normal([dim0, dim1], seed = seed)
(我总是使用种子值初始化随机变量以获得再现性)