def eval(eval_file_list, batch_size, data_args, model_path): ''' 评估脚本,用于评估训好模型 :param eval_file_list:要测试的图像列表 :param batch_size:batch的大小 :param data_args:数据的设置参数 :param model_path:模型的路径 :return: ''' # 通过神经网络模型获取损失函数和额外层 cost, detect_out = vgg_ssd_net.net_conf(mode='eval') # 检查模型模型路径是否正确 assert os.path.isfile(model_path), 'Invalid model.' # 通过训练好的模型生成参数 parameters = paddle.parameters.Parameters.from_tar(gzip.open(model_path)) # 创建优化方法 optimizer = paddle.optimizer.Momentum() # 创建训练器 trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, extra_layers=[detect_out], update_equation=optimizer) # 定义数据层之间的关系 feeding = {'image': 0, 'bbox': 1} # 生成要训练的数据 reader = paddle.batch(data_provider.test(data_args, eval_file_list), batch_size=batch_size) # 获取测试结果 result = trainer.test(reader=reader, feeding=feeding) # 打印模型的测试信息 print "TestCost: %f, Detection mAP=%g" % \ (result.cost, result.metrics['detection_evaluator'])
def train(train_file_list, dev_file_list, data_args, init_model_path): optimizer = paddle.optimizer.Momentum( momentum=cfg.TRAIN.MOMENTUM, learning_rate=cfg.TRAIN.LEARNING_RATE, regularization=paddle.optimizer.L2Regularization( rate=cfg.TRAIN.L2REGULARIZATION), learning_rate_decay_a=cfg.TRAIN.LEARNING_RATE_DECAY_A, learning_rate_decay_b=cfg.TRAIN.LEARNING_RATE_DECAY_B, learning_rate_schedule=cfg.TRAIN.LEARNING_RATE_SCHEDULE) cost, detect_out = vgg_ssd_net.net_conf('train') parameters = paddle.parameters.create(cost) if not (init_model_path is None): assert os.path.isfile(init_model_path), 'Invalid model.' parameters.init_from_tar(gzip.open(init_model_path)) trainer = paddle.trainer.SGD( cost=cost, parameters=parameters, extra_layers=[detect_out], update_equation=optimizer) feeding = {'image': 0, 'bbox': 1} train_reader = paddle.batch( data_provider.train(data_args, train_file_list), batch_size=cfg.TRAIN.BATCH_SIZE) # generate a batch image each time dev_reader = paddle.batch( data_provider.test(data_args, dev_file_list), batch_size=cfg.TRAIN.BATCH_SIZE) def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 1 == 0: print "\nPass %d, Batch %d, TrainCost %f, Detection mAP=%f" % \ (event.pass_id, event.batch_id, event.cost, event.metrics['detection_evaluator']) else: sys.stdout.write('.') sys.stdout.flush() if isinstance(event, paddle.event.EndPass): with gzip.open('checkpoints/params_pass_%05d.tar.gz' % \ event.pass_id, 'w') as f: parameters.to_tar(f) result = trainer.test(reader=dev_reader, feeding=feeding) print "\nTest with Pass %d, TestCost: %f, Detection mAP=%g" % \ (event.pass_id, result.cost, result.metrics['detection_evaluator']) trainer.train( reader=train_reader, event_handler=event_handler, num_passes=cfg.TRAIN.NUM_PASS, feeding=feeding)
def eval(eval_file_list, batch_size, data_args, model_path): cost, detect_out = vgg_ssd_net.net_conf(mode='eval') assert os.path.isfile(model_path), 'Invalid model.' parameters = paddle.parameters.Parameters.from_tar(gzip.open(model_path)) optimizer = paddle.optimizer.Momentum() trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, extra_layers=[detect_out], update_equation=optimizer) feeding = {'image': 0, 'bbox': 1} reader = paddle.batch(data_provider.test(data_args, eval_file_list), batch_size=batch_size) result = trainer.test(reader=reader, feeding=feeding) print "TestCost: %f, Detection mAP=%g" % \ (result.cost, result.metrics['detection_evaluator'])
def train(train_file_list, dev_file_list, data_args, init_model_path=None): # 创建优化方法 optimizer = paddle.optimizer.Momentum( momentum=cfg.TRAIN.MOMENTUM, learning_rate=cfg.TRAIN.LEARNING_RATE, regularization=paddle.optimizer.L2Regularization( rate=cfg.TRAIN.L2REGULARIZATION), learning_rate_decay_a=cfg.TRAIN.LEARNING_RATE_DECAY_A, learning_rate_decay_b=cfg.TRAIN.LEARNING_RATE_DECAY_B, learning_rate_schedule=cfg.TRAIN.LEARNING_RATE_SCHEDULE) # 通过神经网络模型获取损失函数和额外层 cost, detect_out = vgg_ssd_net.net_conf('train') # 通过损失函数创建训练参数 parameters = paddle.parameters.create(cost) # 如果有训练好的模型,可以使用训练好的模型再训练 if not (init_model_path is None): assert os.path.isfile(init_model_path), 'Invalid model.' parameters.init_from_tar(gzip.open(init_model_path)) # 创建训练器 trainer = paddle.trainer.SGD(cost=cost, parameters=parameters, extra_layers=[detect_out], update_equation=optimizer) # 定义数据层之间的关系 feeding = {'image': 0, 'bbox': 1} # 创建训练数据 train_reader = paddle.batch(data_provider.train(data_args, train_file_list), batch_size=cfg.TRAIN.BATCH_SIZE) # 创建测试数据 dev_reader = paddle.batch(data_provider.test(data_args, dev_file_list), batch_size=cfg.TRAIN.BATCH_SIZE) # 定义训练事件 def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 100 == 0: print "\nPass %d, Batch %d, TrainCost %f, Detection mAP=%f" % \ (event.pass_id, event.batch_id, event.cost, event.metrics['detection_evaluator']) else: sys.stdout.write('.') sys.stdout.flush() if isinstance(event, paddle.event.EndPass): with gzip.open('../models/params_pass.tar.gz', 'w') as f: trainer.save_parameter_to_tar(f) result = trainer.test(reader=dev_reader, feeding=feeding) print "\nTest with Pass %d, TestCost: %f, Detection mAP=%g" % \ (event.pass_id, result.cost, result.metrics['detection_evaluator']) # 开始训练 trainer.train(reader=train_reader, event_handler=event_handler, num_passes=cfg.TRAIN.NUM_PASS, feeding=feeding)