def main(): args = parser.parse_args() if args.dataset == 'ucf101': args.num_class = 101 elif args.dataset == 'hmdb51': args.num_class = 51 elif args.dataset == 'kinetics': args.num_class = 400 else: raise ValueError('Unknown dataset ' + args.dataset) place = fluid.CUDAPlace(0) with fluid.dygraph.guard(place): model = TSN(args.num_class, args.num_segments, args.modality, args.arch, dropout=0) args.short_size = model.scale_size args.target_size = model.crop_size args.input_mean = model.input_mean args.input_std = model.input_std * 3 state_dict = fluid.dygraph.load_dygraph(args.load_path)[0] model.set_dict(state_dict) test_reader = KineticsReader('test', args, args.test_list).create_reader() log = open(args.log_path, 'w') model.eval() avg_acc = AverageMeter() for batch_id, data in enumerate(test_reader()): dy_x_data = np.array([x[0] for x in data]).astype('float32') y_data = np.array([[x[1]] for x in data]).astype('int64') img = fluid.dygraph.to_variable(dy_x_data) label = fluid.dygraph.to_variable(y_data) label.stop_gradient = True out, acc = model(img, label) avg_acc.update(acc.numpy()[0], label.shape[0]) if (batch_id + 1) % args.print_freq == 0: output = 'Test batch_id:{} | acc {} | avg acc:{}'.format( batch_id + 1, acc.numpy()[0], avg_acc.avg) print(output) log.write(output + '\n') log.flush() output = 'Test Avg acc:{}'.format(avg_acc.avg) print(output) log.write(output + '\n') log.flush() log.close()
model_dict = model.state_dict() load_path = '' save_path = '' torch_weight = torch.load(load_path) torch_dict = torch_weight['state_dict'] paddle_dict = OrderedDict() for k, v in torch_dict.items(): k = k[7:] # remove 'module.' if 'tracked' in k or 'fc' in k: continue if 'running_mean' in k: k = k.replace('running_mean', '_mean') if 'running_var' in k: k = k.replace('running_var', '_variance') paddle_dict[k] = v.detach().numpy() keys1 = set(list(paddle_dict.keys())) keys2 = set(list(model_dict.keys())) print('extra keys: {}'.format(keys1 - keys2)) print('missing keys: {}'.format(keys2 - keys1)) if len(keys1 - keys2) == 0: model_dict.update(paddle_dict) model.set_dict(model_dict) fluid.dygraph.save_dygraph(model.state_dict(), save_path) else: print('Error! existing extra keys!')
def main(): place = fluid.CUDAPlace(0) with fluid.dygraph.guard(place): global args args = parser.parse_args() if args.dataset == 'ucf101': args.num_class = 101 elif args.dataset == 'hmdb51': args.num_class = 51 elif args.dataset == 'kinetics': args.num_class = 400 else: raise ValueError('Unknown dataset '+args.dataset) model = TSN(args.num_class, args.num_segments, args.modality, args.arch, dropout=args.dropout) args.short_size = model.scale_size args.target_size = model.crop_size args.input_mean = model.input_mean args.input_std = model.input_std * 3 if args.pretrained_parts == 'finetune': print('***Finetune model with {}***'.format(args.pretrained_model)) state_dict = fluid.dygraph.load_dygraph(args.pretrained_model)[0] model_dict = model.state_dict() print('extra keys: {}'.format(set(list(state_dict.keys())) - set(list(model_dict.keys())))) print('missing keys: {}'.format(set(list(model_dict.keys())) - set(list(state_dict.keys())))) for k, v in state_dict.items(): if 'fc' not in k: model_dict.update({k:v}) model.set_dict(model_dict) optimizer = fluid.optimizer.Momentum(args.lr, args.momentum, model.parameters(), regularization=fluid.regularizer.L2Decay(args.weight_decay), grad_clip=fluid.clip.GradientClipByGlobalNorm(args.clip_gradient)) train_reader = KineticsReader('train', args, args.train_list).create_reader() val_reader = KineticsReader('val', args, args.val_list).create_reader() saturate_cnt = 0 best_prec1 = 0 log = open(os.path.join(args.log_path, args.save_name+'_train.csv'), 'w') for epoch in range(args.epochs): if saturate_cnt == args.num_saturate: print('learning rate decay by 0.1.') log.write('learning rate decay by 0.1. \n') log.flush() adjust_learing_rate(optimizer) saturate_cnt = 0 train(train_reader, model, optimizer, epoch, log) if (epoch + 1) % args.eval_freq == 0 or epoch == args.epochs - 1: prec1 = validate(val_reader, model, epoch, log) is_best = prec1 > best_prec1 if is_best: saturate_cnt = 0 else: saturate_cnt = saturate_cnt + 1 output = "- Validation Prec@1 saturates for {} epochs. Best acc{}".format(saturate_cnt, best_prec1) print(output) log.write(output + '\n') log.flush() best_prec1 = max(prec1, best_prec1) if is_best: fluid.dygraph.save_dygraph(model.state_dict(), os.path.join(args.save_dir, args.save_name)) log.close()