使用预训练模型进行再训练时,准确性会下降。是什么原因,这是正常现象吗?

时间:2019-11-29 05:16:13

标签: python tensorflow model

使用爬行动物训练产生的模型时,在第一轮训练之后,测试了保存的模型,准确性下降了20点,大约为0.24(注:再训练之前的评估过程确认已加载该模型正确的模型实际上,在原始爬行动物代码序列的基础上预先添加了恢复过程,并且训练代码和数据集没有更改。)在第200轮上升到0.36,在第3000轮上升到0.42。原始模型的精度约为0.46。所使用的训练方法和数据集与用于训练原始模型的训练方法和数据集完全相同,并且模型的负载相同。不知道这是否正常以及是什么原因

args = argument_parser().parse_args()
random.seed(args.seed)

train_set, val_set, test_set = read_dataset(DATA_DIR)

model = MiniImageNetModel(args.classes, **model_kwargs(args))

eval_kwargs = evaluate_kwargs(args)

with tf.Session() as sess:
    if not args.pretrained:
        print('Training...')
        sess.run(tf.global_variables_initializer())
        saver_1 = tf.train.Saver(tf.trainable_variables())
        print(args.checkpoint)
        saver_1.restore(sess, tf.train.latest_checkpoint(args.checkpoint))
        print('Test accuracy: ' + str(evaluate(sess, model, test_set, **eval_kwargs)))
        graph = tf.get_default_graph()
        tf.summary.FileWriter('./logs',graph)
        train(sess, model.minimize_op,model, train_set, test_set, args.checkpoint, **train_kwargs(args))`

我评估了在训练结束时未保存的模型,并加载了在训练结束时保存的模型(均为第一轮)。我发现在第一轮训练后,评估降低了约10%,并且载入了在第一轮中保存的模型。再下降约百分之十

if not os.path.exists(save_dir):
    os.mkdir(save_dir)
saver = tf.train.Saver()
reptile = reptile_fn(sess,
                     transductive=transductive,
                     pre_step_op=weight_decay(weight_decay_rate))
accuracy_ph = tf.placeholder(tf.float32, shape=())
tf.summary.scalar('accuracy', accuracy_ph)
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(os.path.join(save_dir, 'train'), sess.graph)
test_writer = tf.summary.FileWriter(os.path.join(save_dir, 'test'), sess.graph)
tf.global_variables_initializer().run()
sess.run(tf.global_variables_initializer())
for i in range(meta_iters):
    frac_done = i / meta_iters
    cur_meta_step_size = frac_done * meta_step_size_final + (1 - frac_done) * meta_step_size
    reptile.train_step(train_set, model.input_ph, model.label_ph, minimize_op_gradient,
                       num_classes=num_classes, num_shots=(train_shots or num_shots),
                       inner_batch_size=inner_batch_size, inner_iters=inner_iters,
                       replacement=replacement,
                       meta_step_size=cur_meta_step_size, meta_batch_size=meta_batch_size)
    if i % eval_interval == 0:
        accuracies = []
        for dataset, writer in [(train_set, train_writer), (test_set, test_writer)]:
            correct = reptile.evaluate(dataset, model.input_ph, model.label_ph,
                                       minimize_op_gradient, model.predictions,
                                       num_classes=num_classes, num_shots=num_shots,
                                       inner_batch_size=eval_inner_batch_size,
                                       inner_iters=eval_inner_iters, replacement=replacement)

            accuracies.append(correct / num_classes)
        log_fn('batch %d: train=%f test=%f' % (i, accuracies[0], accuracies[1]))
    if i % 100 == 0 or i == meta_iters-1:
        print('Test accuracyo of {} is: ' + str(evaluate(sess, model, test_set)))
        saver.save(sess, os.path.join(save_dir, 'model.ckpt'), global_step=i+100000)

    if time_deadline is not None and time.time() > time_deadline:
        break

0 个答案:

没有答案
相关问题