Python 为什么在张力板中获得训练精度而不是测试精度

Python 为什么在张力板中获得训练精度而不是测试精度,python,tensorflow,tensorboard,Python,Tensorflow,Tensorboard,我想看看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 = t

我想看看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))
def列车破解验证码cnn(is列车,检查点方向):
全球最大加速度
X=tf.placeholder(tf.float32,[None,dr.ROWS,dr.COLS,dr.CHANNELS])
Y=tf.placeholder(tf.float32,[None,1,1,2])
输出,终点=resnet\u v2\u 50(X,num\u类=2)
全局步数=tf.变量(1,可训练=False)
学习率=tf.训练指数衰减(0.001,全局步数,100,0.9)
使用tf.device('/device:GPU:0'):
损失=tf.reduce_平均值(tf.nn.sigmoid_交叉_熵_与_logits(labels=Y,logits=output))
#优化器为了加快训练 学习率应该开始大,然后慢慢衰
优化器=tf.train.AdamOptimizer(学习率=学习率)。最小化(损失,全局步数=全局步数)
预测=tf.argmax(输出,轴=3)
l=tf.argmax(Y轴=3)
正确的预测=tf.相等(预测,l)
准确度=tf.reduce_平均值(tf.cast(correct_pred,tf.float32))
##张力板
tf.汇总.标量(“测试精度”,精度)
tf.汇总。标量(“损失”,损失)
tf.summary.scalar(“学习率”,学习率)
saver=tf.train.saver()
使用tf.Session(config=tf.ConfigProto(allow\u soft\u placement=True))作为sess:
如果是列车:
writer=tf.summary.FileWriter(“/tmp/cnn\u log/log”,graph=sess.graph)
sess.run(tf.global\u variables\u initializer())
步骤值=sess.run(全局步骤)
当阶跃u值<100000时:
步骤值=sess.run(全局步骤)
merged=tf.summary.merge_all()
批次x,批次y=获取下一个批次()
结果,u,_loss=sess.run([merged,optimizer,loss],feed_dict={X:batch_X,Y:batch_Y})
writer.add_摘要(结果、步骤值)
打印('step:{}丢失:{}'。格式(step_值,_丢失))
# 每100步计算一次准确率
如果步长值%20==0:
acc=sess.run(准确度,进给量={X:validation,Y:validation\u labels})
打印('精度:{}'。格式(acc))
# 如果准确率大于max_acc,保存模型,完成训练
如果acc>max_acc:
最大加速度=浮动(加速度)#转换类型防止变为同一个引用
saver.save(sess,检查点目录+“/”+str(步长值)+'-'+str(acc)+“/model.ckpt”,全局步长=全局步长)
#####预测#####
#predict_y=sess.run(输出,feed_dict={X:test})
#data=pd.DataFrame([i代表范围内的i(1,len(predict_y)+1)],列=['id']))
#预测y=np.argmax(预测y,轴=3)
#预测y=np。重塑(预测y,(-1))
#打印(预测y)
#predict_y=pd.Series(predict_y,name='label')
#数据['label']=预测值
#data.to_csv(“gender_submission.csv”+str(step),index=False)
#####结束#####
writer.close()
其他:
ckpt=tf.train.get\u checkpoint\u状态(checkpoint\u dir)
如果ckpt和ckpt.model\u检查点路径:
saver.restore(sess、ckpt.model\u检查点\u路径)
acc=sess.run(准确度,进给量={X:validation,Y:validation\u labels})
打印('精度:{}'。格式(acc))
我将精度添加到张力板中,如下所示:
tf.summary.scalar('测试精度',精度)
每20步,我得到一个关于测试数据的准确度,并将结果打印到控制台,这与tensorboard上显示的数据不同


为什么?

测试阶段没有打开的编写器。