首页 > 解决方案 > 为什么在张量板上获得训练精度而不是测试精度

问题描述

我想在 tensorboard 中查看测试准确性,但似乎我得到了训练数据的准确性。我在控制台上打印测试准确度,它显示大约 70%,但在 tensorboard 中,曲线显示准确度正在增长,最终接近 100%。
这是我的代码:

def train_crack_captcha_cnn(is_train, checkpoint_dir):
global max_acc
X = tf.placeholder(tf.float32, [None, dr.ROWS, dr.COLS, dr.CHANNELS])
Y = tf.placeholder(tf.float32, [None, 1, 1, 2])
output, end_points = resnet_v2_50(X, num_classes = 2)

global_steps = tf.Variable(1, trainable=False)
learning_rate = tf.train.exponential_decay(0.001, global_steps, 100, 0.9)

with tf.device('/device:GPU:0'):
    loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=Y, logits=output))
    # optimizer 为了加快训练 learning_rate应该开始大,然后慢慢衰
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss, global_step=global_steps)

predict = tf.argmax(output, axis = 3)
l = tf.argmax(Y, axis = 3)
correct_pred = tf.equal(predict, l)
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

## tensorboard
tf.summary.scalar('test_accuracy', accuracy)
tf.summary.scalar("loss", loss)
tf.summary.scalar("learning_rate", learning_rate)

saver = tf.train.Saver()
with tf.Session(config=tf.ConfigProto(allow_soft_placement = True)) as sess:
    if is_train:
        writer = tf.summary.FileWriter("/tmp/cnn_log/log", graph = sess.graph)
        sess.run(tf.global_variables_initializer())
        step_value = sess.run(global_steps)
        while step_value < 100000:
            step_value = sess.run(global_steps)
            merged = tf.summary.merge_all()
            batch_x, batch_y = get_next_batch()

            result, _, _loss= sess.run([merged, optimizer, loss], feed_dict={X: batch_x, Y: batch_y})
            writer.add_summary(result, step_value)
            print('step : {} loss : {}'.format(step_value, _loss))

            # 每100 step计算一次准确率
            if step_value % 20 == 0:
                acc = sess.run(accuracy, feed_dict={X: validation, Y: validation_labels})
                print('accuracy : {}'.format(acc))

                # 如果准确率大于max_acc,保存模型,完成训练
                if acc > max_acc:
                    max_acc = float(acc) #转换类型防止变为同一个引用
                    saver.save(sess, checkpoint_dir + "/" + str(step_value) + '-' + str(acc) + "/model.ckpt", global_step=global_steps)

                    ##### predict #####
                    # predict_y = sess.run(output, feed_dict={X: test})
                    # data = pd.DataFrame([i for i in range(1, len(predict_y) + 1)], columns = ['id'])
                    # predict_y = np.argmax(predict_y, axis = 3)
                    # predict_y = np.reshape(predict_y,(-1))
                    # print(predict_y)
                    # predict_y = pd.Series(predict_y, name='label')
                    # data['label'] = predict_y
                    # data.to_csv("gender_submission.csv" + str(step), index=False)
                    ##### end #####
        writer.close()
    else:
        ckpt = tf.train.get_checkpoint_state(checkpoint_dir)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess, ckpt.model_checkpoint_path)
            acc = sess.run(accuracy, feed_dict={X: validation, Y: validation_labels})
            print('accuracy : {}'.format(acc))

我像这样在 tensorboard 中添加精度: tf.summary.scalar('test_accuracy', accuracy) 每 20 步,我得到一个关于测试数据的精度,并将结果打印到控制台,这与 tensorboard 上显示的数据不同。

为什么?

标签: pythontensorflowtensorboard

解决方案


推荐阅读