testset_cfg = cfg.dataset.test
print(cfg)

output_dir = cfg.classifier.path
os.makedirs(output_dir, exist_ok=True)
checkpoint_path = os.path.join(output_dir, 'classifier.pt')
output_filename = os.path.join(output_dir, 'metrics.txt')
logging.basicConfig(level=logging.INFO, filename=output_filename, filemode='w')

# set device and random seed
set_device(cfg)
set_random_seed(cfg)
cudnn.benchmark = True

# set classifier
net = get_classifier(cfg, cfg.classifier)
state_dict = torch.load(checkpoint_path)['state_dict']
net.load_state_dict(state_dict)
for p in net.parameters():
    p.requires_grad_(False)
net.cuda()
net.eval()

# load GAN
gan = StyleGANGeneratorModel()
state_dict = torch.load('./stylegan/pretrain/stylegan_imagenet.pth')
var_name = 'truncation.truncation'
state_dict[var_name] = gan.state_dict()[var_name]
gan.load_state_dict(state_dict)
# reduce memory consumption
gan = gan.synthesis
                      train=False,
                      transform=transform.default)
except:
    testset = dataset(root=dataset_cfg.path, transform=transform.default)
testloader = DataLoader(testset,
                        batch_size=dataset_cfg.batch_size,
                        num_workers=0,
                        shuffle=False)
progress_bar = tqdm(testloader)
n_batch = len(testloader)
chunk_size = n_batch // args.world_size
start_ind = args.rank * chunk_size
end_ind = (args.rank + 1) * chunk_size

# load classifier
predict = get_classifier(cfg, cfg.classifier)
state_dict = torch.load(cfg.classifier.ckpt)
try:
    predict.load_state_dict(state_dict)
except:
    predict.load_state_dict(state_dict["state_dict"])
for p in predict.parameters():
    p.requires_grad_(False)
predict = torch.nn.Sequential(transform.classifier_preprocess_layer,
                              predict).cuda()
predict.eval()

# create attacker
attacker = PGDAttack(predict=predict,
                     eps=args.eps / 255.0,
                     eps_iter=1 / 255.0,