Exemplo n.º 1
0
def main():
    config = yaml.load(open("./config/config.yaml", "r"),
                       Loader=yaml.FullLoader)

    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    print(f"Training with: {device}")

    data_transform = get_simclr_data_transforms(**config['data_transforms'])

    train_dataset = datasets.STL10('/home/thalles/Downloads/',
                                   split='train+unlabeled',
                                   download=True,
                                   transform=MultiViewDataInjector(
                                       [data_transform, data_transform]))

    # online network
    online_network = ResNet18(**config['network']).to(device)
    pretrained_folder = config['network']['fine_tune_from']

    # load pre-trained model if defined
    if pretrained_folder:
        try:
            checkpoints_folder = os.path.join('./runs', pretrained_folder,
                                              'checkpoints')

            # load pre-trained parameters
            load_params = torch.load(
                os.path.join(os.path.join(checkpoints_folder, 'model.pth')),
                map_location=torch.device(torch.device(device)))

            if 'online_network_state_dict' in load_params:
                online_network.load_state_dict(
                    load_params['online_network_state_dict'])
                print("Parameters successfully loaded.")

        except FileNotFoundError:
            print("Pre-trained weights not found. Training from scratch.")

    # predictor network
    predictor = MLPHead(
        in_channels=online_network.projetion.net[-1].out_features,
        **config['network']['projection_head']).to(device)

    # target encoder
    target_network = ResNet18(**config['network']).to(device)

    optimizer = torch.optim.SGD(
        list(online_network.parameters()) + list(predictor.parameters()),
        **config['optimizer']['params'])

    trainer = BYOLTrainer(online_network=online_network,
                          target_network=target_network,
                          optimizer=optimizer,
                          predictor=predictor,
                          device=device,
                          **config['trainer'])

    trainer.train(train_dataset)
Exemplo n.º 2
0
def main():
    config = yaml.load(open("./config/config.yaml", "r"),
                       Loader=yaml.FullLoader)

    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    print(f"Training with: {device}")

    data_transform = get_simclr_data_transforms(**config['data_transforms'])
    data_transform2 = get_simclr_data_transforms(**config['data_transforms'],
                                                 blur=1.)
    # get_simclr_data_transforms_onlyglobal
    # data_transform = get_simclr_data_transforms_randAugment(config['data_transforms']['input_shape'])
    # data_transform2 = get_simclr_data_transforms_randAugment(config['data_transforms']['input_shape'])

    train_dataset = datasets.STL10('/media/snowflake/Data/',
                                   split='train+unlabeled',
                                   download=True,
                                   transform=MultiViewDataInjector(
                                       [data_transform, data_transform2]))
    # train_dataset = STL(["/home/snowflake/Descargas/STL_data/unlabeled_images",
    #                      "/home/snowflake/Descargas/STL_data/train_images"],
    #                       transform=MultiViewDataInjector([data_transform, data_transform2]))

    # online network (the one that is trained)
    online_network = ResNet(**config['network']).to(device)
    # online_network = MLPmixer(**config['network']).to(device)

    # target encoder
    # target_network = ResNet_BN_mom(**config['network']).to(device)
    target_network = ResNet(**config['network']).to(device)
    # target_network = MLPmixer(**config['network']).to(device)

    pretrained_folder = config['network']['fine_tune_from']

    # load pre-trained model if defined
    if pretrained_folder:
        try:
            checkpoints_folder = os.path.join('./runs', pretrained_folder,
                                              'checkpoints')

            # load pre-trained parameters
            load_params = torch.load(
                os.path.join(os.path.join(checkpoints_folder, 'model.pth')),
                map_location=torch.device(torch.device(device)))

            online_network.load_state_dict(
                load_params['online_network_state_dict'])
            target_network.load_state_dict(
                load_params['target_network_state_dict'])

        except FileNotFoundError:
            print("Pre-trained weights not found. Training from scratch.")

    # predictor network
    predictor = MLPHead_DINO(
        in_channels=online_network.projetion.net[-1].out_features,
        **config['network']['projection_head']).to(device)

    optimizer = torch.optim.SGD(
        list(online_network.parameters()) + list(predictor.parameters()),
        **config['optimizer']['params'])

    trainer = BYOLTrainer(online_network=online_network,
                          target_network=target_network,
                          optimizer=optimizer,
                          predictor=predictor,
                          device=device,
                          **config['trainer'])

    trainer.train(train_dataset)
Exemplo n.º 3
0
def main():
    parser = ArgumentParser()
    parser.add_argument('--incr', action='store_true', help='train representation incrementally')
    parser.add_argument('--id', type=str, default='', dest='experiment_id',
                        help='experiment id appended to saved files')
    args = parser.parse_args()

    config = yaml.load(open("./config/config.yaml", "r"), Loader=yaml.FullLoader)
    n_class_epochs = config['other']['n_class_epochs']
    eval_step = config['other']['eval_step']

    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    print(f"Training with: {device}")

    data_transform = get_simclr_data_transforms(**config['data_transforms'])

    #train_dataset = datasets.STL10('../../data', split='train+unlabeled', download=False,
    #                               transform=MultiViewDataInjector([data_transform, data_transform]))

    # online network
    online_network = ResNet18(**config['network']).to(device)
    pretrained_folder = config['network']['fine_tune_from']

    # load pre-trained model if defined
    if pretrained_folder:
        try:
            checkpoints_folder = os.path.join('./runs', pretrained_folder, 'checkpoints')

            # load pre-trained parameters
            load_params = torch.load(os.path.join(os.path.join(checkpoints_folder, 'model.pth')),
                                     map_location=torch.device(torch.device(device)))

            online_network.load_state_dict(load_params['online_network_state_dict'])

        except FileNotFoundError:
            print("Pre-trained weights not found. Training from scratch.")

    # predictor network
    predictor = MLPHead(in_channels=online_network.projection.net[-1].out_features,
                        **config['network']['projection_head']).to(device)

    # target encoder
    target_network = ResNet18(**config['network']).to(device)

    optimizer = torch.optim.SGD(list(online_network.parameters()) + list(predictor.parameters()),
                                **config['optimizer']['params'])

    trainer = BYOLTrainer(online_network=online_network,
                          target_network=target_network,
                          optimizer=optimizer,
                          predictor=predictor,
                          device=device,
                          **config['trainer'])

    num_workers = config['trainer']['num_workers']
    batch_size_train = 100
    batch_size_test = 200

    if args.incr:
        incr_train_loaders, incr_val_loaders = get_dataloader_incr(data_dir='../../data', base='CIFAR10', num_classes=10,
                                                                   img_size=224, classes_per_exposure=2, train=True,
                                                                   num_workers=num_workers, batch_size_train=batch_size_train,
                                                                   batch_size_test=batch_size_test,
                                                                   transform=MultiViewDataInjector([data_transform, data_transform]))

        # get train and val indices sampled
        train_indices = np.concatenate([ldr.sampler.indices for ldr in incr_train_loaders])

        train_class_dataloader = DataLoader(incr_train_loaders[0].dataset, sampler=SubsetRandomSampler(train_indices),
                                            batch_size=batch_size_train, num_workers=num_workers)
        #trainer.train(train_dataset)
        trainer.train_incr(incr_train_loaders, incr_val_loaders,
                           n_class_epochs=n_class_epochs,
                           train_class_dataloader=train_class_dataloader,
                           experiment_id=args.experiment_id,
                           eval_step=eval_step)
    else:
        train_loader, val_loader = get_dataloader(data_dir='../../data', base='CIFAR10', num_classes=10,
                                                  img_size=224, train=True, num_workers=num_workers,
                                                  batch_size_train=batch_size_train, batch_size_test=batch_size_test,
                                                  transform=MultiViewDataInjector([data_transform, data_transform]))
        trainer.train(train_loader, val_loader, n_class_epochs=n_class_epochs, experiment_id=args.experiment_id,
                      eval_step=eval_step)
Exemplo n.º 4
0
def load_data(config):
    # path
    seq_dir = list()
    # 视角
    view = list()
    # 状态
    seq_type = list()
    # 身份标签
    label = list()
    ##
    seqs_l = list()

    # → (s = 1, input_shape = xxx)
    # 增广
    Transformer = get_simclr_data_transforms(**config['data_transforms'])
    Transformer_test = get_test_transforms(**config['data_transforms'])
    dataset_path = config['data']['dataset_path']
    dataset = config['data']['dataset']
    pid_num = config['data']['pid_num']
    pid_shuffle = config['data']['pid_shuffle']
    resolution = config['data']['resolution']
    f_length = config['data']['f_length']
    partition_rate = config['data']['partition_rate']
    label_rate = config['data']['label_rate']

    ## 按身份文件进行迭代: 如从001--120
    for _label in sorted(list(os.listdir(dataset_path))):
        # In CASIA-B, data of subject #5 is incomplete.
        # Thus, we ignore it in training.
        if dataset == 'CASIA-B' and _label == '005':
            continue
        ## ID标签文件夹路径
        label_path = osp.join(dataset_path, _label)
        ## sorted缺省升序排列: 状态文件夹路径迭代
        for _seq_type in sorted(list(os.listdir(label_path))):

            ## 类别路径
            seq_type_path = osp.join(label_path, _seq_type)
            ## sorted缺省升序排列: 各类视角文件夹路径迭代
            for _view in sorted(list(os.listdir(seq_type_path))):

                _seq_dir = osp.join(seq_type_path, _view)
                ## png list:身份ID(label)-状态(seq_type)-状态ID(seq_dir)-视角(view)
                ## -时间戳帧(i).png
                seqs = os.listdir(_seq_dir)
                ##
                ## 从N张.png里面随机截取连续的T帧
                if len(seqs) >= f_length:
                    # 时间戳顺序
                    seqs = sorted(seqs)
                    # 随机数
                    rand_st = np.random.randint(0, len(seqs) - f_length + 1)
                    rand_ed = rand_st + f_length
                    # slice seq
                    curr_seq_imgs = seqs[rand_st:rand_ed]
                    ## [(..,..), ..., (..,..)]
                    seqs_l.append(
                        (curr_seq_imgs, _seq_dir, _label, _seq_type, _view))

                    # info路径 ['','','']
                    # seq_dir.append(_seq_dir)
                    # 身份标签 00x
                    # label.append(_label)
                    # 附属物标签 bg-0x
                    # seq_type.append(_seq_type)
                    # 视角标签 108
                    # view.append(_view)

    ## pid_num为partition点
    partition_info = osp.join(
        'partition_rate', '{}_{}_{}.npy'.format(dataset, partition_rate,
                                                pid_shuffle))

    ## 分割点
    partition_num = math.floor(len(seqs_l) * partition_rate)
    label_num = math.floor(len(seqs_l) * label_rate)

    ## 保存原始文件配置信息
    seqs_partition = [
        seqs_l[label_num:partition_num], seqs_l[0:label_num],
        seqs_l[partition_num:]
    ]

    ## 根据划分点pid_fname --- 获取训练测试的身份ID号列表
    train_list = seqs_partition[0]
    ft_list = seqs_partition[1]
    test_list = seqs_partition[2]

    ##  xarray list | 帧身份标签 | 视角 | 状态 | 路径
    train_source = DataSet([train_list[i][0] for i in range(len(train_list))],
                           [train_list[i][1] for i in range(len(train_list))],
                           [train_list[i][2] for i in range(len(train_list))],
                           [train_list[i][3] for i in range(len(train_list))],
                           [train_list[i][4] for i in range(len(train_list))],
                           Transformer, resolution)

    ##  xarray list | 帧身份标签 | 视角 | 状态 | 路径
    ft_source = DataSet([train_list[i][0] for i in range(len(ft_list))],
                        [train_list[i][1] for i in range(len(ft_list))],
                        [train_list[i][2] for i in range(len(ft_list))],
                        [train_list[i][3] for i in range(len(ft_list))],
                        [train_list[i][4] for i in range(len(ft_list))],
                        Transformer, resolution)

    ##  xarray list | 帧身份标签 | 视角 | 状态 | 路径
    test_source = DataSet([test_list[i][0] for i in range(len(test_list))],
                          [test_list[i][1] for i in range(len(test_list))],
                          [test_list[i][2] for i in range(len(test_list))],
                          [test_list[i][3] for i in range(len(test_list))],
                          [test_list[i][4] for i in range(len(test_list))],
                          Transformer_test, resolution)

    return train_source, ft_source, test_source
Exemplo n.º 5
0
def main(args):
    config = yaml.load(open("./config/config.yaml", "r"),
                       Loader=yaml.FullLoader)

    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    print(f"Training with: {device}")

    data_transform = get_simclr_data_transforms(**config['data_transforms'])
    train_dataset_1 = datasets.CIFAR10(root='../STL_model/data',
                                       train=True,
                                       download=True,
                                       transform=MultiViewDataInjector(
                                           [data_transform, data_transform]))

    data_transforms = torchvision.transforms.Compose(
        [transforms.Resize(96), transforms.ToTensor()])
    train_dataset_2 = datasets.CIFAR10(root='../STL_model/data',
                                       train=True,
                                       download=True,
                                       transform=MultiViewDataInjector(
                                           [data_transforms, data_transforms]))

    # online network
    online_network = Multi_ResNet18(args.flag_ova,
                                    **config['network']).to(device)
    pretrained_folder = config['network']['fine_tune_from']

    # load pre-trained model if defined
    if pretrained_folder:
        try:
            checkpoints_folder = os.path.join('./runs', pretrained_folder,
                                              'checkpoints')

            # load pre-trained parameters
            load_params = torch.load(
                os.path.join(os.path.join(checkpoints_folder, 'model.pth')),
                map_location=torch.device(torch.device(device)))

            online_network.load_state_dict(
                load_params['online_network_state_dict'])

        except FileNotFoundError:
            print("Pre-trained weights not found. Training from scratch.")

    # predictor network
    predictor = MLPHead(
        in_channels=online_network.projetion.net[-1].out_features,
        **config['network']['projection_head']).to(device)

    # target encoder
    target_network = Multi_ResNet18(args.flag_ova,
                                    **config['network']).to(device)

    optimizer = torch.optim.SGD(
        list(online_network.parameters()) + list(predictor.parameters()),
        **config['optimizer']['params'])

    trainer = BYOLTrainer(online_network=online_network,
                          target_network=target_network,
                          optimizer=optimizer,
                          predictor=predictor,
                          device=device,
                          model_path=args.model_path,
                          **config['trainer'])

    trainer.train((train_dataset_1, train_dataset_2), args.flag_ova)
Exemplo n.º 6
0
def get_acc():
 batch_size = 8
 data_transforms = torchvision.transforms.Compose([transforms.ToTensor()])

 config = yaml.load(open("/content/BYOL-UCMerced/config/config.yaml", "r"), Loader=yaml.FullLoader)

 data_transform = get_simclr_data_transforms(**config['data_transforms'])

 train_dataset = MyDataset(txt='/content/BYOL-UCMerced/data/UCMerced_LandUse/Images/train.txt', transform=MultiViewDataInjector([data_transform, data_transform]))
 test_dataset = MyDataset(txt='/content/BYOL-UCMerced/data/UCMerced_LandUse/Images/test.txt', transform=MultiViewDataInjector([data_transform, data_transform]))

 print("Input shape:", len(train_dataset))

 train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size,
                           num_workers=0, drop_last=False, shuffle=True)

 test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size,
                           num_workers=0, drop_last=False, shuffle=True)

 print(type(train_loader))

 device = 'cuda' if torch.cuda.is_available() else 'cpu' #'cuda' if torch.cuda.is_available() else 'cpu'
 encoder = ResNet18(**config['network'])
 output_feature_dim = encoder.projetion.net[0].in_features



 #load pre-trained parameters
 load_params = torch.load(os.path.join('/content/BYOL-UCMerced/checkpoints/model.pth'),
                          map_location=torch.device(torch.device(device)))

 if 'online_network_state_dict' in load_params:
     encoder.load_state_dict(load_params['online_network_state_dict'])
     print("Parameters successfully loaded.")

 # remove the projection head
 encoder = torch.nn.Sequential(*list(encoder.children())[:-1])
 encoder = encoder.to(device)
 encoder.eval()
 
 logreg = LogisticRegression(output_feature_dim, 21)
 logreg = logreg.to(device)
 
 x_train, y_train = get_features_from_encoder(encoder, train_loader)
 x_test, y_test = get_features_from_encoder(encoder, test_loader)

 if len(x_train.shape) > 2:
     x_train = torch.mean(x_train, dim=[2, 3])
     x_test = torch.mean(x_test, dim=[2, 3])
     
 print("Training data shape:", x_train.shape, y_train.shape)
 print("Testing data shape:", x_test.shape, y_test.shape)
 
 scaler = preprocessing.StandardScaler()
 scaler.fit(x_train.cpu())
 x_train = scaler.transform(x_train.cpu()).astype(np.float32)
 x_test = scaler.transform(x_test.cpu()).astype(np.float32)

 train_loader, test_loader = create_data_loaders_from_arrays(torch.from_numpy(x_train), y_train, torch.from_numpy(x_test), y_test)

 optimizer = torch.optim.Adam(logreg.parameters(), lr=3e-4)
 criterion = torch.nn.CrossEntropyLoss()
 eval_every_n_epochs = 10

 for epoch in range(200):
#     train_acc = []
    for x, y in train_loader:
        x = x.to(device)
        y = y.to(device)
        # zero the parameter gradients
        optimizer.zero_grad()        
        
        logits = logreg(x)
        predictions = torch.argmax(logits, dim=1)
        
        loss = criterion(logits, y)
    
        loss.backward()
        optimizer.step()
    
    
    if epoch % eval_every_n_epochs == 0:
        train_total,total = 0,0
        train_correct,correct = 0,0
        for x, y in train_loader:
            x = x.to(device)
            y = y.to(device)

            logits = logreg(x)
            predictions = torch.argmax(logits, dim=1)
            
            train_total += y.size(0)
            train_correct += (predictions == y).sum().item()
        for x, y in test_loader:
            x = x.to(device)
            y = y.to(device)

            logits = logreg(x)
            predictions = torch.argmax(logits, dim=1)
            
            total += y.size(0)
            correct += (predictions == y).sum().item()
        train_acc=  train_correct / train_total 
        acc =  correct / total
        print(f"Training accuracy: {np.mean(train_acc)}")
        print(f"Testing accuracy: {np.mean(acc)}")