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)
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)
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)
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
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)
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)}")