tf.metrics.accuracy 未按预期工作
tf.metrics.accuracy not working as intended
我的线性回归模型似乎工作正常,但我想显示模型的准确性。
首先,我初始化变量和占位符...
X_train, X_test, Y_train, Y_test = train_test_split(
X_data,
Y_data,
test_size=0.2
)
n_rows = X_train.shape[0]
X = tf.placeholder(tf.float32, [None, 89])
Y = tf.placeholder(tf.float32, [None, 1])
W_shape = tf.TensorShape([89, 1])
b_shape = tf.TensorShape([1])
W = tf.Variable(tf.random_normal(W_shape))
b = tf.Variable(tf.random_normal(b_shape))
pred = tf.add(tf.matmul(X, W), b)
cost = tf.reduce_sum(tf.pow(pred-Y, 2)/(2*n_rows-1))
optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(cost)
X_train
的形状为 (6702, 89)
,Y_train
的形状为 (6702, 1)
。接下来我 运行 会话并显示每个时期的成本以及总 MSE...
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for epoch in range(FLAGS.training_epochs):
avg_cost = 0
for (x, y) in zip(X_train, Y_train):
x = np.reshape(x, (1, 89))
y = np.reshape(y, (1,1))
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}
)
y_pred = sess.run(pred, feed_dict={X:X_test})
test_error = r2_score(Y_test, y_pred)
print(test_error)
print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(c))
print("Optimization Finished!")
pred_y = sess.run(pred, feed_dict={X:X_test})
mse = tf.reduce_mean(tf.square(pred_y - Y_test))
print("MSE: %4f" % sess.run(mse))
这一切似乎都能正常工作。但是,现在我想看看我的模型的准确性,所以我想实现 tf.metrics.accuracy
。文档说它有 2 个参数,labels
和 predictions
。我接下来添加了以下...
accuracy, accuracy_op = tf.metrics.accuracy(labels=Y_test, predictions=pred)
init_local = tf.local_variables_initializer()
sess.run(init_local)
print(sess.run(accuracy))
显然我需要初始化本地变量,但我认为我做错了什么,因为打印出来的准确度结果是 0.0
。
我到处搜索了一个工作示例,但我无法让它为我的模型工作,实现它的正确方法是什么?
我认为您正在学习 回归模型。对于 分类模型 ,tf.metrics.accuracy
应该是 运行。
当您的模型预测为 1.2 但您的目标值为 1.15 时,使用 accuracy
来衡量这是否是一个正确的预测是没有意义的。 accuracy
用于分类问题(例如,mnist),当您的模型预测数字为“9”并且您的目标图像也是“9”时:这是一个正确的预测,您将获得满分;或者当您的模型预测数字为“9”但您的目标图像为“6”时:这是一个错误的预测,您得不到任何分数。
对于您的回归问题,我们通过 absolute error
- |target - prediction|
或 mean squared error
- 您在 MSE
中使用的那个来衡量预测值和目标值之间的差异计算。因此,tf.metrics.mean_squared_error
或 tf.metrics.mean_absolute_error
是您应该用来衡量回归模型预测误差的方法。
我的线性回归模型似乎工作正常,但我想显示模型的准确性。
首先,我初始化变量和占位符...
X_train, X_test, Y_train, Y_test = train_test_split(
X_data,
Y_data,
test_size=0.2
)
n_rows = X_train.shape[0]
X = tf.placeholder(tf.float32, [None, 89])
Y = tf.placeholder(tf.float32, [None, 1])
W_shape = tf.TensorShape([89, 1])
b_shape = tf.TensorShape([1])
W = tf.Variable(tf.random_normal(W_shape))
b = tf.Variable(tf.random_normal(b_shape))
pred = tf.add(tf.matmul(X, W), b)
cost = tf.reduce_sum(tf.pow(pred-Y, 2)/(2*n_rows-1))
optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(cost)
X_train
的形状为 (6702, 89)
,Y_train
的形状为 (6702, 1)
。接下来我 运行 会话并显示每个时期的成本以及总 MSE...
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for epoch in range(FLAGS.training_epochs):
avg_cost = 0
for (x, y) in zip(X_train, Y_train):
x = np.reshape(x, (1, 89))
y = np.reshape(y, (1,1))
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}
)
y_pred = sess.run(pred, feed_dict={X:X_test})
test_error = r2_score(Y_test, y_pred)
print(test_error)
print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(c))
print("Optimization Finished!")
pred_y = sess.run(pred, feed_dict={X:X_test})
mse = tf.reduce_mean(tf.square(pred_y - Y_test))
print("MSE: %4f" % sess.run(mse))
这一切似乎都能正常工作。但是,现在我想看看我的模型的准确性,所以我想实现 tf.metrics.accuracy
。文档说它有 2 个参数,labels
和 predictions
。我接下来添加了以下...
accuracy, accuracy_op = tf.metrics.accuracy(labels=Y_test, predictions=pred)
init_local = tf.local_variables_initializer()
sess.run(init_local)
print(sess.run(accuracy))
显然我需要初始化本地变量,但我认为我做错了什么,因为打印出来的准确度结果是 0.0
。
我到处搜索了一个工作示例,但我无法让它为我的模型工作,实现它的正确方法是什么?
我认为您正在学习 回归模型。对于 分类模型 ,tf.metrics.accuracy
应该是 运行。
当您的模型预测为 1.2 但您的目标值为 1.15 时,使用 accuracy
来衡量这是否是一个正确的预测是没有意义的。 accuracy
用于分类问题(例如,mnist),当您的模型预测数字为“9”并且您的目标图像也是“9”时:这是一个正确的预测,您将获得满分;或者当您的模型预测数字为“9”但您的目标图像为“6”时:这是一个错误的预测,您得不到任何分数。
对于您的回归问题,我们通过 absolute error
- |target - prediction|
或 mean squared error
- 您在 MSE
中使用的那个来衡量预测值和目标值之间的差异计算。因此,tf.metrics.mean_squared_error
或 tf.metrics.mean_absolute_error
是您应该用来衡量回归模型预测误差的方法。