Beispiel #1
0
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!')
Beispiel #3
0
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()