コード例 #1
0
def main():

    model = nets[args.model]().to(device)

    bind_lip(model, verbose=False)

    optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=wd)   
    
    natural_acc = []
    robust_acc = []
    
    start_time = time.time()

    for epoch in range(1, args.epochs + 1):
        print(f'Epoch: {epoch:3d}', end='  ')
        # adjust learning rate for SGD
        adjust_learning_rate(optimizer, epoch)

        train(args, model, device, train_loader, optimizer, epoch)

        test(model, test_loader)

        recorder.step()

        if epoch == args.epochs:
            adversary = AutoAttack(model, norm='Linf', eps=1/255, version='standard')
            adversary.attacks_to_run = ['apgd-ce', 'apgd-t']

            model.eval()
            with torch.no_grad():
                for batch_idx, (inputs, targets) in enumerate(testloader):
                    inputs, targets = inputs.to(device), targets.to(device)
                    x_adv, robust_accuracy = adversary.run_standard_evaluation(inputs, targets, bs=128)
                    recorder.record('robust_accuracy', robust_accuracy)
                    break
            torch.save(model.state_dict(),
                       os.path.join(model_dir, f'{name}.pt'))

    used_time = (time.time() - start_time) / 3600
    print(f'Used time: {used_time:.2f} h')

    with open(f'{log_dir}/{name}_record.pkl', 'wb') as file:
        pickle.dump(recorder, file)

    # recorder.draw('lip_sum')
    recorder.draw_many('lip')
    recorder.draw('train_acc')
    recorder.draw('test_acc')

    clean_acc = recorder.test_acc[-1][1]
    write2text(log_dir, 'log', name, clean_acc=clean_acc, robust_accuracy=robust_accuracy)
コード例 #2
0
def get_module_name(net):
    bind_lip(net)
    net.eval()
    x = torch.rand(1, 3, 32, 32)
    net.cpu()
    net(x)
    module_name = []
    n_conv = 0
    n_linear = 0
    n_bn = 0
    for m in net.modules():
        classname = m.__class__.__name__
        if hasattr(m, 'is_conv2d') and m.is_conv2d:
            module_name.append((f'{classname}-#{n_conv}', f'{m}'))
            n_conv += 1
        elif classname == 'Linear':
            module_name.append((f'{classname}-#{n_linear}', f'{m}'))
            n_linear += 1
        elif classname.find('BatchNorm') != -1:
            module_name.append((f'{classname}-#{n_bn}', f'{m}'))
            n_bn += 1

    return module_name
コード例 #3
0
def main():
    # init model, ResNet18() can be also used here for training
    if args.loss == 'alp' or args.loss == 'trades' or args.loss == 'pgd':
        print("normalize False")
        model = nets[args.model]().to(device)
    else:
        print("normalize True")
        model = nets[args.model](use_FNandWN=True).to(device)

    bind_lip(model, norm='1-norm', verbose=False)

    recorder = Recorder(f'{name}')

    optimizer = optim.SGD(model.parameters(),
                          lr=args.lr,
                          momentum=args.momentum,
                          weight_decay=args.weight_decay)

    for epoch in range(1, args.epochs + 1):
        # adjust learning rate for SGD
        print(f'Epoch: {epoch:3d}', end='  ')
        adjust_learning_rate(optimizer, epoch)

        # adversarial training
        train(args, model, device, train_loader, optimizer, recorder, epoch)

        # evaluation on natural examples
        # print('==============')
        # eval_train(model, device, train_loader, recorder)
        eval_test(model, device, test_loader, recorder)
        # print('==============')

        # save checkpoint
        if (epoch >= args.start_freq) and (epoch % args.save_freq == 0):
            torch.save(model.state_dict(),
                       os.path.join(model_dir, f'{name}-epoch{epoch}.pt'))

        recorder.step()

    torch.save(model.state_dict(), os.path.join(model_dir, f'{name}.pt'))

    with open(f'{log_dir}/{name}_record.pkl', 'wb') as file:
        pickle.dump(recorder, file)

    recorder.draw('lip_sum')
    recorder.draw_many('lip')

    recorder.draw('train_acc')
    recorder.draw('test_acc')

    adversary = AutoAttack(model,
                           norm='Linf',
                           eps=8 / 255,
                           version='standard',
                           verbose=False)
    adversary.attacks_to_run = ['apgd-ce']

    model.eval()
    with torch.no_grad():
        for batch_idx, (inputs, targets) in enumerate(testloader):
            inputs, targets = inputs.to(device), targets.to(device)
            # print(inputs.max(), inputs.min())

            x_adv, robust_accuracy = adversary.run_standard_evaluation(inputs,
                                                                       targets,
                                                                       bs=128)
            print(f'robust_accuracy: {robust_accuracy}')
            break

    recorder.record('robust_accuracy', robust_accuracy)

    with open(f'{log_dir}/{name}_record.pkl', 'wb') as file:
        pickle.dump(recorder, file)
コード例 #4
0
def main():
    model = nets[args.model]().to(device)

    bind_lip(model, norm='1-norm', verbose=False)

    recorder = Recorder(f'{name}', img_dir)

    optimizer = optim.SGD(model.parameters(),
                          lr=args.lr,
                          momentum=args.momentum,
                          weight_decay=args.weight_decay)

    for epoch in range(1, args.epochs + 1):
        # adjust learning rate for SGD
        print(f'Epoch: {epoch:3d}', end='  ')
        adjust_learning_rate(optimizer, epoch)

        train(args, model, device, train_loader, optimizer, recorder, epoch)

        eval_test(model, device, test_loader, recorder)

        # save checkpoint
        # if (epoch >= args.start_freq) and (epoch % args.save_freq == 0):
        #     torch.save(model.state_dict(),
        #                os.path.join(model_dir, f'{name}-epoch{epoch}.pt'))

        recorder.step()

    torch.save(model.state_dict(), os.path.join(model_dir, f'{name}.pt'))

    with open(f'{log_dir}/{name}_record.pkl', 'wb') as file:
        pickle.dump(recorder, file)

    # recorder.draw('lip_sum')
    recorder.draw_many('lip')

    recorder.draw('train_acc')
    recorder.draw('test_acc')

    adversary = AutoAttack(model,
                           norm='Linf',
                           eps=8 / 255,
                           version='standard',
                           verbose=True)
    adversary.attacks_to_run = ['apgd-ce', 'apgd-t']

    model.eval()
    with torch.no_grad():
        for batch_idx, (inputs, targets) in enumerate(testloader):
            inputs, targets = inputs.to(device), targets.to(device)
            # print(inputs.max(), inputs.min())

            x_adv, robust_accuracy = adversary.run_standard_evaluation(inputs,
                                                                       targets,
                                                                       bs=128)
            print(f'robust_accuracy: {robust_accuracy}')
            break

    recorder.record('robust_accuracy', robust_accuracy)

    with open(f'{log_dir}/{name}_record.pkl', 'wb') as file:
        pickle.dump(recorder, file)

    clean_acc = recorder.test_acc[-1][1]
    write2text(log_dir,
               'log',
               name,
               clean_acc=clean_acc,
               robust_accuracy=robust_accuracy)
コード例 #5
0
    print(f'Testing: ', (h, w), d_in, d_out)
    kernel = torch.randn(d_out, d_in, h, w)
    kernel_np = kernel.numpy()
    conv = nn.Conv2d(d_in, d_out, (h, w), stride=stride)
    conv.weight.data.copy_(kernel)

    input_size = (1, d_in, *input_shape)
    conv.to(device)

    powerit = timeit.timeit('generic_power_method(conv, '
        'input_size, max_iter=500, device="cuda:0")', 
        globals=globals(), number=100)

    svc_t = timeit.timeit('SVD_Conv_Tensor(kernel_np, input_shape)', globals=globals(), number=100)
    
    bind_lip(conv, norm='1-norm')
    image = torch.rand(1,  d_in, *input_shape).to(device)
    
    conv(image)
    conv.to(device)
    L1 = timeit.timeit('conv.lip()', globals=globals(), number=100)

    conv.norm = 'inf-norm'
    Linf = timeit.timeit('conv.lip()', globals=globals(), number=100)

    conv.norm = '1-norm'
    conv.to('cpu')
    L1_cpu = timeit.timeit('conv.lip()', globals=globals(), number=100)

    conv.norm = 'inf-norm'
    Linf_cpu = timeit.timeit('conv.lip()', globals=globals(), number=100)