示例#1
0
 def mix_dataset(self, poison_label: bool = True) -> torch.utils.data.Dataset:
     clean_dataset = self.dataset.loader['train'].dataset
     _input, _label = dataset_to_list(clean_dataset)
     _input = torch.stack(_input[self.poison_percent * len(clean_dataset)])
     if poison_label:
         _label = [self.target_class] * len(_label)
     poison_input = self.add_mark(_input)
     poison_dataset = TensorListDataset(poison_input, _label)
     return torch.utils.data.ConcatDataset([clean_dataset, poison_dataset])
示例#2
0
 def get_class_set(dataset: torch.utils.data.Dataset, classes: list[int]) -> torch.utils.data.Subset:
     indices = np.arange(len(dataset))
     if isinstance(dataset, torch.utils.data.Subset):
         idx = np.array(dataset.indices)
         indices = idx[indices]
         dataset = dataset.dataset
     _, targets = dataset_to_list(dataset=dataset, label_only=True)
     idx_bool = np.isin(targets, classes)
     idx = np.arange(len(dataset))[idx_bool]
     idx = np.intersect1d(idx, indices)
     return torch.utils.data.Subset(dataset, idx)
示例#3
0
    def mix_dataset(self) -> torch.utils.data.Dataset:
        clean_dataset = self.dataset.loader['train'].dataset
        subset, otherset = ImageSet.split_dataset(clean_dataset, percent=self.poison_percent)
        if not len(subset):
            return clean_dataset
        _input, _label = dataset_to_list(subset)
        _input = torch.stack(_input)

        _label = torch.tensor(_label, dtype=torch.long)
        _label += torch.randint_like(_label, low=1, high=self.model.num_classes)
        _label %= self.model.num_classes
        _label = _label.tolist()
        poison_dataset = TensorListDataset(_input, _label)
        return torch.utils.data.ConcatDataset([poison_dataset, otherset])
示例#4
0
 def get_loss_weights(self, file_path: str = None, verbose: bool = None) -> np.ndarray:
     file_path = file_path if file_path is not None else os.path.join(self.folder_path, 'loss_weights.npy')
     if os.path.exists(file_path):
         loss_weights = to_tensor(np.load(file_path), dtype='float')
         return loss_weights
     else:
         if verbose:
             print('Calculating Loss Weights')
         dataset = self.get_full_dataset('train', transform=None)
         _, targets = dataset_to_list(dataset, label_only=True)
         loss_weights = np.bincount(targets)     # TODO: linting problem
         assert len(loss_weights) == self.num_classes
         loss_weights: np.ndarray = loss_weights.sum() / loss_weights     # TODO: linting problem
         np.save(file_path, loss_weights)
         print('Loss Weights Saved at ', file_path)
         return loss_weights
示例#5
0
 def initialize_npz(self,
                    mode_list: list[str] = ['train', 'valid'],
                    transform: transforms.Lambda = transforms.Lambda(
                        lambda x: np.array(x)),
                    **kwargs):
     if not self.valid_set:
         mode_list.remove('valid')
     json_path = os.path.join(self.folder_path, 'class_to_idx.json')
     for mode in mode_list:
         npz_path = os.path.join(self.folder_path,
                                 f'{self.name}_{mode}.npz')
         if not os.path.exists(npz_path):
             print('{yellow}initialize npz{reset}: '.format(**ansi),
                   npz_path)
             dataset: datasets.ImageFolder = self.get_org_dataset(
                 mode, transform=transform, data_format='folder')
             data, targets = dataset_to_list(dataset)
             data = np.stack(data)
             np.savez(npz_path, data=data, targets=targets)
             with open(json_path, 'w') as f:
                 json.dump(dataset.class_to_idx, f)
             print('{green}initialize npz finish{reset}: '.format(**ansi))
示例#6
0
    import numpy as np
    from sklearn import metrics
    from trojanzoo.utils.data import dataset_to_list
    from art.estimators.classification import PyTorchClassifier  # type: ignore
    classifier = PyTorchClassifier(
        model=model._model,
        loss=model.criterion,
        input_shape=dataset.data_shape,
        nb_classes=model.num_classes,
    )
    model._validate()

    from art.attacks.inference.membership_inference import LabelOnlyDecisionBoundary as Attack  # type: ignore

    attack = Attack(classifier)
    x_train, y_train = dataset_to_list(dataset.get_dataset('train'))
    x_train, y_train = to_numpy(torch.stack(x_train)), to_numpy(y_train)
    x_valid, y_valid = dataset_to_list(dataset.get_dataset('valid'))
    x_valid, y_valid = to_numpy(torch.stack(x_valid)), to_numpy(y_valid)

    sample_size = 64

    tau_path = os.path.normpath(os.path.join(model.folder_path,
                                             model.name)) + '_tau'

    t_idx = np.arange(len(x_train))
    v_idx = np.arange(len(x_valid))

    np.random.shuffle(t_idx)
    np.random.shuffle(v_idx)
示例#7
0
    dataset = trojanvision.datasets.create(**args.__dict__)
    model = trojanvision.models.create(dataset=dataset, **args.__dict__)

    if env['verbose']:
        summary(env=env, dataset=dataset, model=model)
    model._validate()
    print('\n\n')

    from art.estimators.classification import PyTorchClassifier  # type: ignore
    classifier = PyTorchClassifier(
        model=model._model,
        loss=model.criterion,
        input_shape=dataset.data_shape,
        nb_classes=model.num_classes,
    )
    x_train, y_train = dataset_to_list(dataset.get_dataset('train'))
    x_train, y_train = to_numpy(torch.stack(x_train)), to_numpy(y_train)

    # valid_train, valid_valid = dataset.split_set(dataset.get_dataset('valid'), length=5000)
    # x_train, y_train = dataset_to_list(valid_train)
    # x_train, y_train = to_numpy(torch.stack(x_train)), to_numpy(y_train)
    # valid_loader = dataset.get_dataloader('valid', dataset=valid_valid)

    # thieved_model._validate(print_prefix='Before Stealing', loader=valid_loader)
    # thieved_model._validate(print_prefix='After Stealing', loader=valid_loader)

    import art.attacks.extraction  # type:ignore
    for name in ['CopycatCNN', 'KnockoffNets']:
        for use_probability in [True, False]:
            print(name + (' Probabilistic' if use_probability else ' Argmax'))
            AttackClass = getattr(art.attacks.extraction, name)
示例#8
0
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    trojanvision.environ.add_argument(parser)
    trojanvision.datasets.add_argument(parser)
    trojanvision.models.add_argument(parser)
    args = parser.parse_args()

    env = trojanvision.environ.create(**args.__dict__)
    dataset = trojanvision.datasets.create(**args.__dict__)
    model = trojanvision.models.create(dataset=dataset, **args.__dict__)

    if env['verbose']:
        summary(env=env, dataset=dataset, model=model)
    model._validate()

    train_data, _ = dataset_to_list(dataset.get_dataset(mode='train'))
    valid_data, _ = dataset_to_list(dataset.get_dataset(mode='valid'))
    train_data, valid_data = torch.stack(train_data), torch.stack(valid_data)
    train_data, valid_data = train_data.to(env['device']), valid_data.to(
        env['device'])
    train_feats, valid_feats = get_feats(train_data,
                                         model), get_feats(valid_data, model)
    total_feats = torch.cat([train_feats, valid_feats])
    Y_total = total_feats.mean(dim=0)

    bmss: float = 0.0
    wmss: float = 0.0
    for c in range(dataset.num_classes):
        print('class: ', c)
        train_data, _ = dataset_to_list(
            dataset.get_dataset(mode='train', class_list=[c]))