예제 #1
0
파일: trainer.py 프로젝트: monshri/hw1
def train(args, model, optimizer, scheduler=None, model_name='model'):
    # TODO: Q1.5 Initialize your visualizer here!
    # TODO: Q1.2 complete your dataloader in voc_dataset.py
    train_loader = utils.get_data_loader('voc',
                                         train=True,
                                         batch_size=args.batch_size,
                                         split='trainval')
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test')

    # Ensure model is in correct mode and on right device
    model.train()
    model = model.to(args.device)

    # TODO: Q1.4 Implement model training code!
    cnt = 0
    for epoch in range(args.epochs):
        for batch_idx, (data, target, wgt) in enumerate(train_loader):
            # Get a batch of data
            data, target, wgt = data.to(args.device), target.to(
                args.device), wgt.to(args.device)
            optimizer.zero_grad()
            # Forward pass
            output = model(data)
            # Calculate the loss
            # TODO: your loss for multi-label clf?
            loss = 0
            # Calculate gradient w.r.t the loss
            loss.backward()
            # Optimizer takes one step
            optimizer.step()
            # Log info
            if cnt % args.log_every == 0:
                # todo: add your visualization code
                print('Train Epoch: {} [{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, cnt, 100. * batch_idx / len(train_loader),
                    loss.item()))
            # Validation iteration
            if cnt % args.val_every == 0:
                model.eval()
                ap, map = utils.eval_dataset_map(model, args.device,
                                                 test_loader)
                model.train()
            cnt += 1
        if scheduler is not None:
            scheduler.step()

    # Validation iteration
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test')
    ap, map = utils.eval_dataset_map(model, args.device, test_loader)
    return ap, map
예제 #2
0
def main():
    # TODO:  Initialize your visualizer here!
    timestr = time.strftime("%Y%m%d-%H%M%S")
    save_path = "runs/" + timestr + '/'
    writer = SummaryWriter(save_path)

    # TODO: complete your dataloader in voc_dataset.py
    train_loader = utils.get_data_loader('voc',
                                         train=True,
                                         batch_size=args.batch_size,
                                         split='trainval',
                                         model_to_use=int(args.model_to_use))
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test',
                                        model_to_use=int(args.model_to_use))

    # 2. define the model, and optimizer.
    # TODO: modify your model here!
    # bad idea of use simple CNN, but let's give it a shot!
    # In task 2, 3, 4, you might want to modify this line to be configurable to other models.
    # Remember: always reuse your code wisely.
    if (int(args.model_to_use) == 1):
        model = SimpleCNN(num_classes=len(VOCDataset.CLASS_NAMES),
                          inp_size=64,
                          c_dim=3).to(device)
        MODEL_SAVE_PATH = "../Saved_Models/trained_simpleCNNmodel"
        print("Using SimpleCNN")
    elif (int(args.model_to_use) == 2):
        model = CaffeNet(num_classes=len(VOCDataset.CLASS_NAMES),
                         inp_size=64,
                         c_dim=3,
                         dropout_prob=0.5).to(device)
        MODEL_SAVE_PATH = "../Saved_Models/trained_CaffeNet"
        '''Uncomment for T-SNE'''
        # model.fc2.register_forward_hook(hook)

        print("Using CaffeNet")
    elif (int(args.model_to_use) == 3):
        model = models.resnet18(pretrained=False)
        final_layer_in_features = model.fc.in_features
        model.fc = nn.Linear(final_layer_in_features,
                             len(VOCDataset.CLASS_NAMES))
        model = model.to(device)
        MODEL_SAVE_PATH = "../Saved_Models/trained_Resnet_no_pretrain"
        print("Using ResNet")
    elif (int(args.model_to_use) == 4):
        model = models.resnet18(pretrained=True)
        final_layer_in_features = model.fc.in_features
        model.fc = nn.Linear(final_layer_in_features,
                             len(VOCDataset.CLASS_NAMES))
        model.fc.weight = nn.Parameter(
            2 * torch.rand(model.fc.weight.shape) - 1
        )  #This ensures that the last layer gets randomly allotted weights in the range [-1,1]
        model = model.to(device)
        MODEL_SAVE_PATH = "../Saved_Models/trained_Resnet_pretrained"
        print("Using ResNet")
    else:
        print("Select Correct model_to_use")
        raise NotImplementedError

    model.train()
    model = model.to(device)
    optimizer = torch.optim.Adam(model.parameters(), lr=args.lr)

    scheduler = torch.optim.lr_scheduler.StepLR(optimizer,
                                                step_size=1,
                                                gamma=args.gamma)
    cnt = 0

    #Model Save Code        #Get 5 checkpoints
    model_save_epochs = np.linspace(0,
                                    args.epochs - 1,
                                    num=5,
                                    endpoint=True,
                                    dtype=int)
    index_model_save_epochs = 0

    #Visualize Filter Code          #Visualize at 3 different epochs
    filter_visualization_epochs = np.linspace(0,
                                              args.epochs - 1,
                                              num=3,
                                              endpoint=True,
                                              dtype=int)
    index_filter_visualization_epochs = 0

    for epoch in range(args.epochs):
        print("---------------EPOCH: ", epoch, " ------------------------")
        for batch_idx, (data, target, wgt) in enumerate(train_loader):
            # Get a batch of data
            data, target, wgt = data.to(device), target.to(device), wgt.to(
                device)
            # visualize_data_sample(data[0])
            optimizer.zero_grad()
            # Forward pass
            output = model(data)
            # Calculate the loss
            # TODO: your loss for multi-label clf?
            loss = F.multilabel_soft_margin_loss(output, wgt * target)
            # Calculate gradient w.r.t the loss
            loss.backward()
            # Optimizer takes one step
            optimizer.step()
            # Log info
            if cnt % args.log_every == 0:
                # todo: add your visualization code
                print('Train Epoch: {} [{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, cnt, 100. * batch_idx / len(train_loader),
                    loss.item()))
                writer.add_scalar('Train/Loss', loss, cnt)
                current_lr = get_lr(copy.deepcopy(optimizer))
                writer.add_scalar('lr', current_lr, cnt)
                if (args.model_to_use == 3 or args.model_to_use == 4):
                    writer.add_histogram('Resnet_Conv1',
                                         model.conv1.weight.grad, cnt)
            # Validation iteration
            if cnt % args.val_every == 0:
                model.eval()
                ap, map, avg_test_loss = utils.eval_dataset_map(
                    model, device, test_loader)
                writer.add_scalar('MAP', map, cnt)
                writer.add_scalar('Average_Test_Loss', avg_test_loss, cnt)
                model.train()
            cnt += 1
        scheduler.step()

        if (model_save_epochs[index_model_save_epochs] == epoch):
            print("Saving Model ", epoch)
            torch.save(
                {
                    'epoch': epoch,
                    'model_state_dict': model.state_dict(),
                    'optimizer_state_dict': optimizer.state_dict(),
                    'loss': loss,
                }, MODEL_SAVE_PATH)
            index_model_save_epochs += 1

        if (
                filter_visualization_epochs[index_filter_visualization_epochs]
                == epoch
        ):  #Filters are only needed for CaffeNet so can be commented for Resnet and SimpleCNN
            print("Extracting Filter", epoch)
            index_filter_visualization_epochs += 1
            kernels = model.conv1.weight.detach().clone()
            visualize_filter(kernels, epoch, MODEL_SAVE_PATH)
            writer.add_image('Train_Images_' + str(epoch) + '_1',
                             data[0])  #Uncomment for ResNet Question

    if (int(args.model_to_use) == 2):
        model.fc2.register_forward_hook(hook)
        print("Registered hook to model.fc2 for Caffe_Net"
              )  #Change this hook appropriately based on the question
    # Validation iteration
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test',
                                        model_to_use=int(args.model_to_use))
    ap, map, avg_test_loss = utils.eval_dataset_map(model, device, test_loader)
    '''TODO: For T-SNE part'''
    # if(int(args.model_to_use)==2):
    #     tsne = manifold.TSNE(n_components=2, init='random', perplexity=10)
    #     trans_data = tsne.fit_transform(fc7_output[-1])
    #     plt.figure()
    #     ax = plt.subplot(111)
    #     plt.scatter(trans_data[0], trans_data[1], cmap=plt.cm.rainbow)
    #     plt.show()

    num_images = 3
    num_neighbors = 3
    ipdb.set_trace()
    if (int(args.model_to_use) == 2):
        assert (
            len(fc7_output) == 1
        )  #This might throw an error: make sure output is a single tensor
        dicto = get_nearest_neighbors(num_images, num_neighbors, fc7_output[0])
    #See how to convert these indices into images now!

    print('----test-----')
    print(ap)
    print('mAP: ', map)
    print('Average_Test_Loss: ', avg_test_loss)
    writer.close()
예제 #3
0
def train(args, model, optimizer, scheduler=None, model_name='model'):
    # TODO Q1.5: Initialize your tensorboard writer here!
    train_loader = utils.get_data_loader('voc',
                                         train=True,
                                         batch_size=args.batch_size,
                                         split='trainval',
                                         inp_size=args.inp_size)
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test',
                                        inp_size=args.inp_size)

    # Ensure model is in correct mode and on right device
    model.train()
    model = model.to(args.device)

    cnt = 0
    for epoch in range(args.epochs):
        for batch_idx, (data, target, wgt) in enumerate(train_loader):
            # Get a batch of data
            data, target, wgt = data.to(args.device), target.to(
                args.device), wgt.to(args.device)
            optimizer.zero_grad()
            # Forward pass
            output = model(data)
            # Calculate the loss
            # TODO Q1.4: your loss for multi-label classification
            loss = 0
            # Calculate gradient w.r.t the loss
            loss.backward()
            # Optimizer takes one step
            optimizer.step()
            # Log info
            if cnt % args.log_every == 0:
                # TODO Q1.5: Log training loss to tensorboard
                print('Train Epoch: {} [{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, cnt, 100. * batch_idx / len(train_loader),
                    loss.item()))
                # TODO Q3.2: Log histogram of gradients
            # Validation iteration
            if cnt % args.val_every == 0:
                model.eval()
                ap, map = utils.eval_dataset_map(model, args.device,
                                                 test_loader)
                # TODO Q1.5: Log MAP to tensorboard
                model.train()
            cnt += 1

        # TODO Q3.2: Log Learning rate
        if scheduler is not None:
            scheduler.step()

        # save model
        if save_this_epoch(args, epoch):
            save_model(epoch, model_name, model)

    # Validation iteration
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test',
                                        inp_size=args.inp_size)
    ap, map = utils.eval_dataset_map(model, args.device, test_loader)
    return ap, map
def main():
    # TODO:  Initialize your visualizer here!
    writer = SummaryWriter(
        '../runs/q4_resnet18_gam=0.9_changedTransform_images')
    # TODO: complete your dataloader in voc_dataset.py
    # import ipdb; ipdb.set_trace()
    train_loader = utils.get_data_loader('voc',
                                         train=True,
                                         batch_size=args.batch_size,
                                         split='trainval')
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test')

    # 2. define the model, and optimizer.
    # TODO: modify your model here!
    # bad idea of use simple CNN, but let's give it a shot!
    # In task 2, 3, 4, you might want to modify this line to be configurable to other models.
    # Remember: always reuse your code wisely.
    # model = CaffeNet(num_classes=len(VOCDataset.CLASS_NAMES), inp_size=227, c_dim=3).to(device)
    model = models.resnet18(pretrained=True)
    model.fc = nn.Linear(512, 20)

    model.train()
    model = model.to(device)
    optimizer = torch.optim.Adam(model.parameters(), lr=args.lr)

    scheduler = torch.optim.lr_scheduler.StepLR(optimizer,
                                                step_size=1,
                                                gamma=args.gamma)
    cnt = 0
    loss_obj = nn.MultiLabelSoftMarginLoss()
    for epoch in range(args.epochs):

        for batch_idx, (data, target, wgt) in enumerate(train_loader):
            # Get a batch of data
            data, target, wgt = data.to(device), target.to(device), wgt.to(
                device)

            # import ipdb; ipdb.set_trace()
            img_grid = torchvision.utils.make_grid(data[:4])
            writer.add_image('training_images', img_grid)

            optimizer.zero_grad()
            # Forward pass
            output = model(data)
            # Calculate the loss
            # TODO: your loss for multi-label clf?
            # loss = nn.BCELoss()
            # import ipdb; ipdb.set_trace()
            # output = torch.sigmoid(output)
            loss = loss_obj(output * wgt, wgt * target)
            # Calculate gradient w.r.t the loss
            loss.backward()
            # Optimizer takes one step
            optimizer.step()
            # Log info
            if cnt % args.log_every == 0:
                # todo: add your visualization code
                print('Train Epoch: {} [{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, cnt, 100. * batch_idx / len(train_loader),
                    loss.item()))
                writer.add_scalar('Loss/train: ', loss.item(), cnt)
                if epoch % 1 == 0:
                    torch.save(
                        model.state_dict(),
                        "../q4_resnet18_models_v1_img/model_at_epoch_" +
                        str(epoch) + ".pth")
            # print('Batch idx: {} \r'.format(batch_idx), end='')
            # Validation iteration
            if cnt % args.val_every == 0:
                model.eval()
                # print("\n")
                ap, map = utils.eval_dataset_map(model, device, test_loader)
                writer.add_scalar('Validation mAP: ', map, cnt)
                model.train()
            cnt += 1

        scheduler.step()

    # Validation iteration
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test')
    ap, map = utils.eval_dataset_map(model, device, test_loader)

    print('----test-----')
    print(ap)
    print('mAP: ', map)
    writer.add_scalar('Testing mAP: ', map, cnt)
    writer.close()
예제 #5
0
파일: trainer.py 프로젝트: aaronh65/hw1
def train(args, model, optimizer, scheduler=None, model_name='model'):
    # TODO: Q1.5 Initialize your visualizer here!
    # TODO: Q1.2 complete your dataloader in voc_dataset.py
    train_loader = utils.get_data_loader('voc',
                                         train=True,
                                         batch_size=args.batch_size,
                                         split='trainval',
                                         args=args)
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test',
                                        args=args)
    writer = SummaryWriter(model_name)

    # Ensure model is in correct mode and on right device
    model.train()
    model = model.to(args.device)

    # TODO: Q1.4 Implement model training code!
    cnt = 0
    criterion = torch.nn.BCELoss()
    for epoch in range(args.epochs):
        for batch_idx, (data, target, wgt) in enumerate(train_loader):
            # Get a batch of data
            data, target, wgt = data.to(args.device), target.to(
                args.device), wgt.to(args.device)
            optimizer.zero_grad()
            # Forward pass
            output = model(data)

            output = torch.sigmoid(output)
            target = target * wgt
            # TODO: your loss for multi-label clf?
            #criterion = torch.nn.BCEWithLogitsLoss(wgt)
            loss = criterion(output, target)
            # Calculate gradient w.r.t the loss
            loss.backward()
            # Optimizer takes one step
            optimizer.step()
            # Log info
            if cnt % args.log_every == 0:
                # todo: add your visualization code
                print('Train Epoch: {} [{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, cnt, 100. * batch_idx / len(train_loader),
                    loss.item()))
                make_gradient_histograms(cnt, model, writer)
            # Validation iteration
            writer.add_scalar('training loss', loss.item(), cnt)
            if cnt % args.val_every == 0:
                ap, map = utils.eval_dataset_map(model, args.device,
                                                 test_loader)
                writer.add_scalar('mean average precision', map.item(), cnt)
            cnt += 1
        lr = optimizer.param_groups[0]['lr']
        writer.add_scalar('learning rate', lr, cnt)
        if save_this_epoch(args, epoch):
            save_model(epoch, model_name, model)
        if scheduler is not None:
            #print('Epoch-{0} lr: {1}'.format(epoch, optimizer.param_groups[0]['lr']))
            scheduler.step()

    # Validation iteration
    #test_loader = utils.get_data_loader('voc', train=False, batch_size=args.test_batch_size, split='test')
    ap, map = utils.eval_dataset_map(model, args.device, test_loader)
    if args.save_at_end:
        save_model(epoch, model_name, model)
    return ap, map
예제 #6
0
def main():

    writer = SummaryWriter()

    train_loader = utils.get_data_loader('voc',
                                         train=True,
                                         batch_size=args.batch_size,
                                         split='trainval')
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test')

    # model = SimpleCNN(num_classes=len(VOCDataset.CLASS_NAMES), inp_size=227, c_dim=3).to(device)
    model = CaffeNet(num_classes=len(VOCDataset.CLASS_NAMES),
                     inp_size=227,
                     c_dim=3).to(device)
    # model = models.resnet18(pretrained=True)
    model_resnet = False
    if (model_resnet):
        model.fc = nn.Linear(in_features=512,
                             out_features=len(VOCDataset.CLASS_NAMES),
                             bias=True)

    model.train()
    model = model.to(device)
    optimizer = torch.optim.Adam(model.parameters(), lr=args.lr)
    scheduler = torch.optim.lr_scheduler.StepLR(optimizer,
                                                step_size=1,
                                                gamma=args.gamma)

    cnt = 0
    for epoch in range(args.epochs):
        for batch_idx, (data, target, wgt) in enumerate(train_loader):
            data, target, wgt = data.to(device), target.to(device), wgt.to(
                device)
            optimizer.zero_grad()
            output = model(data)
            criterion = torch.nn.BCEWithLogitsLoss(weight=wgt)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()
            # Log info
            if cnt % args.log_every == 0:
                writer.add_scalar('Loss/train', loss.item(), cnt)
                print('Train Epoch: {} [{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    epoch, cnt, 100. * batch_idx / len(train_loader),
                    loss.item()))
            # Validation iteration
            if cnt % args.val_every == 0:
                model.eval()
                ap, eval_mAP = utils.eval_dataset_map(model, device,
                                                      test_loader)
                model.train()
                writer.add_scalar('mAP/test', eval_mAP, cnt)
            cnt += 1

        scheduler.step()
        if not model.conv1.weight.grad is None:
            writer.add_histogram('conv1_histogram_of_grad',
                                 model.conv1.weight.grad.flatten().detach(),
                                 cnt)
        current_lr = scheduler.optimizer.param_groups[0]['lr']
        writer.add_scalar('learning_rate', current_lr, cnt)
        writer.add_image('train_images' + str(epoch), data[0])
        if epoch % 10 == 0:
            torch.save(
                model.state_dict(), "./checkpoints/model_epoch_" + str(epoch) +
                "_" + date_str + ".pth")

    torch.save(
        model.state_dict(),
        "./checkpoints/model_epoch_" + str(epoch) + "_" + date_str + ".pth")

    # Validation iteration
    test_loader = utils.get_data_loader('voc',
                                        train=False,
                                        batch_size=args.test_batch_size,
                                        split='test')
    AP, mAP = utils.eval_dataset_map(model, device, test_loader)

    print('----test-----')
    print(AP)
    print('mAP: ', mAP)