def fine_tune_model(num_epochs, data_dir, learning_rate, momentum):
    """Load a pretrained model and reset the final fully connected layer."""

    # log the hyperparameter metrics to the AML run
    run.log('lr', np.float(learning_rate))
    run.log('momentum', np.float(momentum))

    model_ft = models.resnet18(pretrained=True)
    num_ftrs = model_ft.fc.in_features
    model_ft.fc = nn.Linear(num_ftrs, 2)  # only 2 classes to predict

    device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
    model_ft = model_ft.to(device)

    criterion = nn.CrossEntropyLoss()

    # Observe that all parameters are being optimized
    optimizer_ft = optim.SGD(model_ft.parameters(),
                             lr=learning_rate, momentum=momentum)

    # Decay LR by a factor of 0.1 every 7 epochs
    exp_lr_scheduler = lr_scheduler.StepLR(
        optimizer_ft, step_size=7, gamma=0.1)

    model = train_model(model_ft, criterion, optimizer_ft,
                        exp_lr_scheduler, num_epochs, data_dir)

    return model
def resnet18(num_classes=1000, pretrained='imagenet'):
    """Constructs a ResNet-18 model.
    """
    model = models.resnet18(pretrained=False)
    if pretrained is not None:
        settings = pretrained_settings['resnet18'][pretrained]
        model = load_pretrained(model, num_classes, settings)
    return model
Ejemplo n.º 3
0
    def __init__(self, latent_dim):
        super(Encoder, self).__init__()

        resnet18_model = resnet18(pretrained=True)

        # Extracts features at the last fully-connected
        self.feature_extractor = nn.Sequential(*list(resnet18_model.children())[:-3])
        self.pooling = nn.AvgPool2d(kernel_size=8, stride=8, padding=0)

        # Output is mu and log(var) for reparameterization trick used in VAEs
        self.fc_mu = nn.Linear(256, latent_dim)
        self.fc_logvar = nn.Linear(256, latent_dim)
Ejemplo n.º 4
0
 def __init__(self):
   super(ResNet18Fc, self).__init__()
   model_resnet18 = models.resnet18(pretrained=True)
   self.conv1 = model_resnet18.conv1
   self.bn1 = model_resnet18.bn1
   self.relu = model_resnet18.relu
   self.maxpool = model_resnet18.maxpool
   self.layer1 = model_resnet18.layer1
   self.layer2 = model_resnet18.layer2
   self.layer3 = model_resnet18.layer3
   self.layer4 = model_resnet18.layer4
   self.avgpool = model_resnet18.avgpool
   self.__in_features = model_resnet18.fc.in_features
    def __init__(self, requires_grad=False, pretrained=True, num=18):
        super(resnet, self).__init__()
        if(num==18):
            self.net = models.resnet18(pretrained=pretrained)
        elif(num==34):
            self.net = models.resnet34(pretrained=pretrained)
        elif(num==50):
            self.net = models.resnet50(pretrained=pretrained)
        elif(num==101):
            self.net = models.resnet101(pretrained=pretrained)
        elif(num==152):
            self.net = models.resnet152(pretrained=pretrained)
        self.N_slices = 5

        self.conv1 = self.net.conv1
        self.bn1 = self.net.bn1
        self.relu = self.net.relu
        self.maxpool = self.net.maxpool
        self.layer1 = self.net.layer1
        self.layer2 = self.net.layer2
        self.layer3 = self.net.layer3
        self.layer4 = self.net.layer4
def load_arch(arch):
    """
    Load a pretrained network
    """
    if arch == 'vgg16':
        model = models.vgg16(pretrained=True)
        input_size = 25088
    elif arch == 'alexnet':
        model = models.alexnet(pretrained=True)
        input_size = 9216
    elif arch == 'resnet18':
        model = models.resnet18(pretrained=True)
        input_size = 512
    elif arch == 'densenet121':
        model = models.densenet121(pretrained=True)
        input_size = 1024
    else:
        raise ValueError('Please choose one of \'vgg16\', \'alexnet\', \'resnet18\' or , \'densenet121\' for parameter arch.')
        
    for param in model.parameters():
        param.requires_grad = False
    
    return model, input_size
Ejemplo n.º 7
0
def main(args):
    # 1. prepare data & models
    # augmentor = RandomAugmentation(BrightnessContrastAugmenter(), BlurAugmenter())
    train_transforms = transforms.Compose([
        ScaleMinSideToSize((CROP_SIZE, CROP_SIZE)),
        CropCenter(CROP_SIZE),
        TransformByKeys(transforms.ToPILImage(), ("image", )),
        TransformByKeys(transforms.ToTensor(), ("image", )),
        TransformByKeys(
            transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
            ("image", )),
    ])

    print("Reading data...")
    train_dataset = ThousandLandmarksDataset(os.path.join(args.data, 'train'),
                                             train_transforms,
                                             split="train")
    train_dataloader = data.DataLoader(train_dataset,
                                       batch_size=args.batch_size,
                                       num_workers=4,
                                       pin_memory=True,
                                       shuffle=True,
                                       drop_last=True)
    val_dataset = ThousandLandmarksDataset(os.path.join(args.data, 'train'),
                                           train_transforms,
                                           split="val")
    val_dataloader = data.DataLoader(val_dataset,
                                     batch_size=args.batch_size,
                                     num_workers=4,
                                     pin_memory=True,
                                     shuffle=False,
                                     drop_last=False)

    print("Creating model...")
    device = torch.device("cuda: 0") if args.gpu else torch.device("cpu")
    model = models.resnet18(pretrained=True)
    model.fc = nn.Linear(model.fc.in_features, 2 * NUM_PTS, bias=True)
    model.to(device)

    optimizer = optim.Adam(model.parameters(),
                           lr=args.learning_rate,
                           amsgrad=True)
    scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer,
                                                     patience=2,
                                                     factor=0.5)
    loss_fn = fnn.mse_loss

    # 2. train & validate
    print("Ready for training...")
    best_val_loss = np.inf
    for epoch in range(args.epochs):
        train_loss = train(model,
                           train_dataloader,
                           loss_fn,
                           optimizer,
                           device=device)
        val_loss = validate(model, val_dataloader, loss_fn, device=device)
        scheduler.step(val_loss)
        print("Epoch #{:2}:\ttrain loss: {:5.3}\tval loss: {:5.3}".format(
            epoch, train_loss, val_loss))
        if val_loss < best_val_loss:
            best_val_loss = val_loss
            with open(f"{args.name}_best.pth", "wb") as fp:
                torch.save(model.state_dict(), fp)

    # 3. predict
    test_dataset = ThousandLandmarksDataset(os.path.join(args.data, 'test'),
                                            train_transforms,
                                            split="test")
    test_dataloader = data.DataLoader(test_dataset,
                                      batch_size=args.batch_size,
                                      num_workers=4,
                                      pin_memory=True,
                                      shuffle=False,
                                      drop_last=False)

    with open(f"{args.name}_best.pth", "rb") as fp:
        best_state_dict = torch.load(fp, map_location="cpu")
        model.load_state_dict(best_state_dict)

    test_predictions = predict(model, test_dataloader, device)
    with open(f"{args.name}_test_predictions.pkl", "wb") as fp:
        pickle.dump(
            {
                "image_names": test_dataset.image_names,
                "landmarks": test_predictions
            }, fp)

    create_submission(args.data, test_predictions, f"{args.name}_submit.csv")
Ejemplo n.º 8
0
def set_model(model_name, num_classes):
    if model_name == 'resnext50_32x4d':
        model = models.resnext50_32x4d(pretrained=True)
        model.fc = torch.nn.Sequential(torch.nn.Linear(in_features=2048, out_features=num_classes))
    elif model_name == 'resnet18':
        model = models.resnet18(pretrained=True)
        model.fc = torch.nn.Linear(in_features=512, out_features=num_classes)
    elif model_name == 'resnet34':
        model = models.resnet34(pretrained=True)
        model.fc = torch.nn.Linear(in_features=512, out_features=num_classes)
    elif model_name == 'resnet50':
        model = models.resnet50(pretrained=True)
        model.fc = torch.nn.Linear(in_features=2048, out_features=num_classes)
    elif model_name == 'vgg16':
        model = models.vgg16(pretrained=True)
        model.classifier[6] = torch.nn.Linear(in_features=4096, out_features=num_classes)
    elif model_name == 'densenet121':
        model = models.densenet121(pretrained=True)
        model.classifier = torch.nn.Linear(in_features=1024, out_features=num_classes)
    elif model_name == 'densenet161':
        model = models.densenet161(pretrained=True)
        model.classifier = torch.nn.Linear(in_features=2208, out_features=num_classes)
    elif model_name == 'inception':
        model = models.inception_v3(pretrained=True)
        model.fc = torch.nn.Linear(in_features=2048, out_features=num_classes)
    elif model_name == 'googlenet':
        model = models.googlenet(pretrained=True)
        model.fc = torch.nn.Linear(in_features=1024, out_features=num_classes)
    elif model_name == 'shufflenet_v2_x0_5':
        model = models.shufflenet_v2_x0_5(pretrained=True)
        model.fc = torch.nn.Linear(in_features=1024, out_features=num_classes)
    elif model_name == 'shufflenet_v2_x1_0':
        model = models.shufflenet_v2_x1_0(pretrained=True)
        model.fc = torch.nn.Linear(in_features=1024, out_features=num_classes)
    elif model_name == 'mobilenet_v2':
        model = models.mobilenet_v2(pretrained=True)
        model.classifier[1] = torch.nn.Linear(in_features=1280, out_features=num_classes)
    elif model_name == 'mobilenet_v3_large':
        model = models.mobilenet_v3_large(pretrained=True)
        model.classifier[3] = torch.nn.Linear(in_features=1280, out_features=num_classes)
    elif model_name == 'mobilenet_v3_small':
        model = models.mobilenet_v3_small(pretrained=True)
        model.classifier[3] = torch.nn.Linear(in_features=1280, out_features=num_classes)
    elif model_name == 'wide_resnet50_2':
        model = models.wide_resnet50_2(pretrained=True)
        model.fc = torch.nn.Linear(in_features=2048, out_features=num_classes)
    elif model_name == 'mnasnet0_5':
        model = models.mnasnet0_5(pretrained=True)
        model.classifier[1] = torch.nn.Linear(in_features=1280, out_features=num_classes)
    elif model_name == 'mnasnet1_0':
        model = models.mnasnet1_0(pretrained=True)
        model.classifier[1] = torch.nn.Linear(in_features=1280, out_features=num_classes)
    elif model_name == 'alexnet':
        model = models.alexnet(pretrained=True)
        model.classifier[6] = torch.nn.Linear(in_features=4096, out_features=num_classes)
    elif model_name == 'vgg19_bn':
        model = models.vgg19_bn(pretrained=True)
        model.classifier[6] = torch.nn.Linear(in_features=4096, out_features=num_classes)    
    elif model_name == 'efficientnet-b0':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    elif model_name == 'efficientnet-b1':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    elif model_name == 'efficientnet-b2':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    elif model_name == 'efficientnet-b3':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    elif model_name == 'efficientnet-b4':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    elif model_name == 'efficientnet-b5':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    elif model_name == 'efficientnet-b6':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    elif model_name == 'efficientnet-b7':
        model = EfficientNet.from_pretrained(model_name, num_classes=num_classes)
    else:
        raise NameError(f'!!!!! Model ERROR : {model_name} !!!!!')
    return model
Ejemplo n.º 9
0
def main(model_type, num_epochs, lr, momentum, device, local_rank):

    print("Model initializing ... ")
    if model_type == 'resnet18':
        model = models.resnet18()
    elif model_type == 'vgg16':
        model = models.vgg16()
    elif model_type == 'densenet121':
        model = models.densenet121()
    else:
        print('Unsupported model type.')
        exit()

    model = model.to(device)
    distrib_model = torch.nn.parallel.DistributedDataParallel(
        model, device_ids=[local_rank], output_device=local_rank)
    # lr = lr
    # momentum = momentum

    torch.cuda.set_device(local_rank)

    distrib_model.cuda()

    # Multi-Processing 1
    # model = torch.nn.DataParallel(model)

    # Multi-Processing 2
    # torch.distributed.init_process_group(backend="nccl")
    # the run method should be: python -m torch.distributed.launch main.py

    print("Data preparing ... ")

    # data_dir = '/home/ghostinsh3ll/Documents/datasets/ImageNet/ILSVRC2012'
    # data_dir = '/extra_data/amax/ImageNet'
    data_dir = '/data/amax/ImageNet'

    num_class = 1000
    input_size = 224
    batch_size = 256  #256

    normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                     std=[0.229, 0.224, 0.225])

    # For train data
    transforms_1 = transforms.Compose([
        transforms.RandomResizedCrop(256),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(), normalize
    ])
    # For val data
    transforms_2 = transforms.Compose([
        transforms.Resize(288),
        transforms.CenterCrop(256),
        transforms.ToTensor(), normalize
    ])

    print("Data preparing ... ")
    train_imgs = datasets.ImageFolder(os.path.join(data_dir, "train"),
                                      transform=transforms_1)
    train_sampler = tud.distributed.DistributedSampler(train_imgs)
    train_dataloader = tud.DataLoader(train_imgs,
                                      batch_size=batch_size,
                                      sampler=train_sampler,
                                      num_workers=16,
                                      pin_memory=True)
    # train_dataloader = tud.DataLoader(train_imgs, batch_size=batch_size, shuffle=True)

    test_imgs = datasets.ImageFolder(os.path.join(data_dir, "val"),
                                     transform=transforms_2)

    test_dataloader = tud.DataLoader(test_imgs,
                                     batch_size=batch_size,
                                     num_workers=16,
                                     pin_memory=True)

    # model = nn.parallel.DistributedDataParallel(model)
    # model.cuda()
    loss_fn = nn.CrossEntropyLoss()

    optimizer = optim.SGD(model.parameters(), lr=lr, momentum=momentum)
    use_gpu = torch.cuda.is_available()
    if (use_gpu):
        print("This process is running on GPU")
        model.to('cuda')
        # model, optimizer = amp.initialize(model,optimizer)
        # model = DistributedDataParallel(model)

        # model = model.cuda()
        # model = model.to('cuda')
    #     loss_fn = loss_fn.cuda()

    torch.cuda.synchronize()
    start = time.time()
    print("Start time is ", start, "\n")

    best_valid_acc = 0
    for epoch in range(num_epochs):
        print("Training ", epoch + 1, " / ", num_epochs, '\n')
        train_model(distrib_model, train_dataloader, loss_fn, optimizer, epoch,
                    use_gpu, start, model_type, device)
        acc = test_model(distrib_model, test_dataloader, loss_fn, use_gpu)
        if acc > best_valid_acc:
            best_valid_acc = acc
            now = time.strftime("%Y-%m-%d-%H_%M_%S",
                                time.localtime(time.time()))
            fname = "./trained/" + now + model_type + r"_best_checkpoint.pth"
            print("Saving best checkpoint to ", fname)
            torch.save(net.state_dict(), fname)
        if epoch == num_epochs - 1:
            now = time.strftime("%Y-%m-%d-%H_%M_%S",
                                time.localtime(time.time()))
            fname = "./trained/" + now + model_type + r"_last_checkpoint.pth"
            print("Saving final checkpoint to ", fname)
            torch.save(net.state_dict(), fname)
            # save the structure

    torch.cuda.synchronize()
    end = time.time()
    print("End time is ", end, "\n")
    print("Consumed time for ", model_type, " is ", end - start, ".\n")
Ejemplo n.º 10
0
def train_model(model_name='resnet18',
                num_epochs=1,
                hidden_sizes=[256],
                learning_rate=0.003,
                model_path=None,
                data_dir='flowers',
                use_gpu=False,
                save_dir='checkpoints'):

    train, trainloader, validloader = load_data(data_dir)
    output_size = 102

    device = torch.device('cuda' if use_gpu else 'cpu')

    if model_path is None:
        start = 0
        iterations = num_epochs
        train_losses, valid_losses = [], []

        model = None

    else:
        # model, optimizer, iterations, train_losses, valid_losses =load_checkpoint(model_path)
        model_dict = load_checkpoint(model_path)

        model = model_dict["model"]
        model = model.to(device)
        optimizer = model_dict["optimizer"]
        model_name = model_dict["model_name"]

        start = model_dict["iterations"]
        iterations = num_epochs + start
        train_losses, valid_losses = model_dict["train_losses"], model_dict[
            "valid_losses"]
        print('starting from {} epoch and training {} epoch(s) now'.format(
            start, num_epochs))

    #CHECK: also in load_checkpoint, maybe refactor
    if model is None and model_name == 'vgg13':
        model = models.vgg13(pretrained=True)
        #turn off gradients for the model
        for param in model.parameters():
            param.requires_grad = False
        input_size = 25088
        model.classifier = Network(input_size, output_size, hidden_sizes)
        optimizer = optim.Adam(model.classifier.parameters(), lr=learning_rate)
    elif model is None and model_name == 'resnet18':
        model = models.resnet18(pretrained=True)
        #turn off gradients for the model
        for param in model.parameters():
            param.requires_grad = False
        input_size = 512
        model.fc = Network(input_size, output_size, hidden_sizes)
        optimizer = optim.Adam(model.fc.parameters(), lr=learning_rate)

    print('-' * 20)
    print(f"Model name: {model_name}")
    print(f"Learning_rate: {learning_rate}")
    print(f"Hidden_units: {hidden_sizes}\n")
    model.class_to_idx = train.class_to_idx

    criterion = nn.NLLLoss()

    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0

    since = time.time()
    steps = 0
    model.to(device)

    for epoch in range(start, iterations):
        print('Epoch {}/{}'.format(epoch + 1, iterations))
        print('-' * 10)
        print("Train losses: {}".format(train_losses))
        print("Valid losses: {}".format(valid_losses))
        running_loss = 0
        model.train()

        for images, labels in trainloader:
            since_train_step = time.time()
            steps += 1

            # Move input and label tensors to the GPU
            images, labels = images.to(device), labels.to(device)

            model.train()
            optimizer.zero_grad()

            with torch.set_grad_enabled(True):
                log_ps = model(images)
                loss = criterion(log_ps, labels)
                loss.backward()
                optimizer.step()

                running_loss += loss.item()

                print("Time per train step {}/{}: {}".format(
                    steps, len(trainloader),
                    time.time() - since_train_step))

        else:
            # Model in inference mode, dropout is off
            model.eval()

            # Turn off gradients for validation, will speed up inference
            with torch.no_grad():
                valid_loss, accuracy = validate_model(model, validloader,
                                                      criterion, device)

            train_losses.append(round(running_loss / len(trainloader), 3))
            valid_losses.append(round(valid_loss / len(validloader), 3))

            if accuracy > best_acc:
                best_acc = accuracy
                best_model_wts = copy.deepcopy(model.state_dict())

            print(
                "Epoch: {}/{}.. ".format(epoch + 1, iterations),
                "Training Loss: {:.3f}.. ".format(running_loss /
                                                  len(trainloader)),
                "Test Loss: {:.3f}.. ".format(valid_loss / len(validloader)),
                "Test Accuracy: {:.3f}..".format(accuracy / len(validloader)))

            running_loss = 0
            steps = 0

            # Make sure dropout and grads are on for training
            model.train()

    # load best model weights
    model.load_state_dict(best_model_wts)

    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(
        time_elapsed // 60, time_elapsed % 60))
    # Save the model to checkpoint
    checkpoint = {
        'hidden_sizes': hidden_sizes,
        'model': model,
        'state_dict': model.state_dict(),
        'optimizer': optimizer,
        'optimizer_dict': optimizer.state_dict(),
        'class_to_idx': model.class_to_idx,
        'iterations': iterations,
        'learning_rate': learning_rate,
        'train_losses': train_losses,
        'valid_losses': valid_losses,
        'model_name': model_name
    }

    checkpoint_filename = "".join(
        ["checkpoint_", model_name, "_",
         str(iterations), "epochs.pth"])
    if save_dir is not None:
        torch.save(checkpoint, '{}/{}'.format(save_dir, checkpoint_filename))
    else:
        torch.save(checkpoint, checkpoint_filename)
    return model
def initialize_model(model_name,
                     num_classes,
                     feature_extract,
                     use_pretrained=False):
    # Initialize these variables which will be set in this if statement. Each of these
    #   variables is model specific.
    model_ft = None
    input_size = 0

    if model_name == "resnet18":
        """ Resnet18
 """
        model_ft = models.resnet18(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224
    elif model_name == "resnet34":
        """ Resnet18
 """
        model_ft = models.resnet34(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224
    elif model_name == "resnet50":
        """ Resnet50
 """
        model_ft = models.resnet50(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "alexnet":
        """ Alexnet
 """
        model_ft = models.alexnet(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "vgg":
        """ VGG11_bn
 """
        model_ft = models.vgg11_bn(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "squeezenet":
        """ Squeezenet
 """
        model_ft = models.squeezenet1_0(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        model_ft.classifier[1] = nn.Conv2d(512,
                                           num_classes,
                                           kernel_size=(1, 1),
                                           stride=(1, 1))
        model_ft.num_classes = num_classes
        input_size = 224

    elif model_name == "densenet":
        """ Densenet
 """
        model_ft = models.densenet121(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier.in_features
        model_ft.classifier = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "inception":
        """ Inception v3
 Be careful, expects (299,299) sized images and has auxiliary output
 """
        model_ft = models.inception_v3(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        # Handle the auxilary net
        num_ftrs = model_ft.AuxLogits.fc.in_features
        model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)
        # Handle the primary net
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 299

    else:
        print("Invalid model name, exiting...")
        exit()

    return model_ft, input_size
        _, preds = torch.max(outputs.data, 1)

        for j in range(inputs.size()[0]):
            images_so_far += 1
            ax = plt.subplot(num_images//2, 2, images_so_far)
            ax.axis('off')
            ax.set_title('predicted: {}'.format(class_names[preds[j]]))
            imshow(inputs.cpu().data[j])

            if images_so_far == num_images:
                return
'''
Finetuning the convnet
Load a pretrained model and reset final fully connected layer.
'''
model_ft = models.resnet18(pretrained=True)
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_ftrs, 2)
if use_gpu:
    model_ft = model_ft.cuda()
criterion = nn.CrossEntropyLoss()
# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)
# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
'''
Train and evaluate
It should take around 15-25 min on CPU. On GPU though, it takes less than a minute.
'''
model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
                       num_epochs=25)
Ejemplo n.º 13
0
import copy
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import json
from load_data import data_loader
from collections import OrderedDict
from handle_command_line import parse_train
import sys
argv = sys.argv[1:]
data_dir, epoch = parse_train(argv)
with open('cat_to_name.json', 'r') as f:
    cat_to_name = json.load(f)

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = models.resnet18(pretrained=True)
for param in model.parameters():
    param.requires_grad = False

num_feat = model.fc.in_features
classifier = nn.Sequential(
    OrderedDict([('fc1', nn.Linear(num_feat, len(cat_to_name))),
                 ('output', nn.LogSoftmax(dim=1))]))
model.fc = classifier
model = model.to(device)
criterion = nn.NLLLoss()
optimizer = torch.optim.SGD(model.fc.parameters(), lr=0.002, momentum=0.9)


def train_model(num_epochs=1):
    best_val_accu = 0.0
Ejemplo n.º 14
0
def demo(data_root, train_list, validate_list, test_list, save, n_epochs=1,
         batch_size=64, lr=0.01, wd=0.0005, momentum=0.9, seed=None):
#def demo(data_root, train_list, validation_list, test_list, save, n_epochs=1,
#      batch_size=64, lr=0.001, wd=0.0005, seed=None):
    """
    A demo to show off training and testing of :
    "Deep facial age estimation using conditional multitask learning with weak label esxpansion."
    Trains and evaluates a mean-variance loss on MOPPH Album2 dataset.

    Args:
        data_root (str) - path to directory where data exist
        train_list (str) - path to directory where train_data_list exist
        validation_list (str) - path to directory where validation_data_list exist
        test_list (str) - path to directory where test_data_list exist
        save (str) - path to save the model and results to 

        n_epochs (int) - number of epochs for training (default 3)
        batch_size (int) - size of minibatch (default 64)
        lr (float) - base lerning rate (default 0.001)
        wd (float) -weight deday (default 0.0001)
        momentum (float) momentum (default 0.9)
        seed (int) - manually set the random seed (default None)
    """

    

    # Mean and std value from Imagenet 
    mean=[0.485, 0.456, 0.406]
    stdv=[0.229, 0.224, 0.225]
    train_transforms = transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.RandomRotation(5), 
        transforms.ColorJitter(0.05, 0.05, 0.05, 0.05),
        transforms.ToTensor(),
        transforms.Normalize(mean=mean, std=stdv),
    ])
    test_transforms = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(mean=mean, std=stdv),
    ])
    
    
    
    
    if os.path.exists(os.path.join(save, 'regression_mae_ResNet18_nesterov_results_train_1_1.csv')):
        os.remove(os.path.join(save, 'regression_mae_ResNet18_nesterov_results_train_1_1.csv'))
    with open(os.path.join(save, 'regression_mae_ResNet18_nesterov_results_train_1_1.csv'), 'w') as f:
        f.write('******************************************************************\n')
        f.write('records on AgeDB dataset under ''80%-20%'' protocol\n')
        f.write('******************************************************************\n')
        f.write('\n')
        f.write('\n')
    
    train_set = data_prepare(data_root=data_root, data_list=train_list, transform=train_transforms)
    valid_set = data_prepare(data_root=data_root, data_list=validate_list, transform=test_transforms)
    test_set = data_prepare(data_root=data_root, data_list=test_list, transform=test_transforms)    
    

    
    resnet18_model = models.resnet18(pretrained=True)
    fc_features=resnet18_model.fc.in_features
    resnet18_model.fc=nn.Linear(fc_features, 1)
    model=resnet18_model

    # Make save directory
    if not os.path.exists(save):
        os.makedirs(save)
    if not os.path.isdir(save):
        raise Exception('%s is not a dir' % save)

    # Model on cuda
    use_cuda=torch.cuda.is_available()
    device = torch.device("cuda" if use_cuda else "cpu")

    # prepare data
    if seed is not None:
        torch.manual_seed(seed)
        if use_cuda:
            torch.cuda.manual_seed_all(seed)
            
    train_loader = torch.utils.data.DataLoader(train_set, batch_size=batch_size, shuffle=True,
                                               pin_memory=(torch.cuda.is_available()), num_workers=4)
    valid_loader = torch.utils.data.DataLoader(valid_set, batch_size=batch_size, shuffle=False,
                                               pin_memory=(torch.cuda.is_available()), num_workers=4) 
    test_loader = torch.utils.data.DataLoader(test_set, batch_size=batch_size, shuffle=False,
                                              pin_memory=(torch.cuda.is_available()), num_workers=4)   

    # Wrap model for multi-GPUs, if necessary
    if torch.cuda.is_available() and torch.cuda.device_count() > 1:
#        model.features = torch.nn.DataParallel(model.features)
        model = model = torch.nn.DataParallel(model)
    model_wrapper = model.to(device)
    # Optimizer
    optimizer = torch.optim.SGD(model_wrapper.parameters(), lr=lr, momentum=momentum, nesterov=True, weight_decay=wd)
#        scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[0.5 * n_epochs, 0.75 * n_epochs],
#                                                         gamma=0.1)
#    scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[20,30,40],
#                                                     gamma=0.1)
    scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[30,50,60],
                                                     gamma=0.1)
    
    # Train and validate model
    best_MAE = 100
    model_state_name_1='regression_mae_resnet18_nesterov_model_train_1_1.dat'
    model_state_dir_1=os.path.join(save, model_state_name_1)
    
    with open(os.path.join(save, 'regression_mae_ResNet18_nesterov_results_train_1_1.csv'), 'a') as f:
        f.write('epoch, train_loss, train_MAE, valid_loss, valid_MAE\n')

    for epoch in range(n_epochs):
        
        scheduler.step()
        _, train_loss, train_MAE = train(
            model=model_wrapper,
            loader=train_loader,
            optimizer=optimizer,
            epoch=epoch,
            n_epochs=n_epochs,
            device=device
        )
        _, valid_loss, valid_MAE = validate(
            model=model_wrapper,
            loader=valid_loader,
            epoch=epoch,
            n_epochs=n_epochs,
            device=device
        )
#         Determine if model is the best


        if valid_MAE < best_MAE:
            best_MAE = valid_MAE
            if os.path.exists(model_state_dir_1):
                os.remove(model_state_dir_1)
            torch.save(model_wrapper.state_dict(), model_state_dir_1)
        
        
        with open(os.path.join(save, 'regression_mae_ResNet18_nesterov_results_train_1_1.csv'), 'a') as f:
            f.write('%03d, %0.4f, %0.4f, %0.4f, %0.4f\n' % ((epoch + 1), train_loss, train_MAE, valid_loss, valid_MAE))
        if math.isnan(float(train_MAE)):
            break
    
    # Test model       
    if os.path.exists(model_state_dir_1):                   
        _, test_loss, test_MAE, AE_list, predict_age_list, real_age_list= test(
            model=model_wrapper,
            loader=test_loader,
            device=device,
            model_state_dir=model_state_dir_1
        )
        
        os.remove(model_state_dir_1)
        with open(os.path.join(save, 'regression_mae_ResNet18_nesterov_results_train_1_1.csv'), 'a') as f:
            f.write('test_loss, test_MAE:\n')
            f.write('%0.4f, %0.4f\n' % (test_loss, test_MAE))
#            f.write('\n') 

        CS_1_numerator=CS_2_numerator=CS_3_numerator=CS_4_numerator=CS_5_numerator=CS_6_numerator=CS_7_numerator=CS_8_numerator=CS_9_numerator=CS_10_numerator=0
        for i in range(len(AE_list)):
            if AE_list[i]<=1:
                CS_1_numerator+=1
            if AE_list[i]<=2:
                CS_2_numerator+=1
            if AE_list[i]<=3:
                CS_3_numerator+=1
            if AE_list[i]<=4:
                CS_4_numerator+=1
            if AE_list[i]<=5:
                CS_5_numerator+=1
            if AE_list[i]<=6:
                CS_6_numerator+=1
            if AE_list[i]<=7:
                CS_7_numerator+=1
            if AE_list[i]<=8:
                CS_8_numerator+=1
            if AE_list[i]<=9:
                CS_9_numerator+=1
            if AE_list[i]<=10:
                CS_10_numerator+=1
                
        CS_1=CS_1_numerator/len(AE_list)
        CS_2=CS_2_numerator/len(AE_list)
        CS_3=CS_3_numerator/len(AE_list)
        CS_4=CS_4_numerator/len(AE_list)
        CS_5=CS_5_numerator/len(AE_list)
        CS_6=CS_6_numerator/len(AE_list)
        CS_7=CS_7_numerator/len(AE_list)
        CS_8=CS_8_numerator/len(AE_list)
        CS_9=CS_9_numerator/len(AE_list)
        CS_10=CS_10_numerator/len(AE_list)
        
        with open(os.path.join(save, 'regression_mae_ResNet18_nesterov_results_train_1_1.csv'), 'a') as f:
            f.write('CS_1, CS_2, CS_3, CS_4, CS_5, CS_6, CS_7, CS_8, CS_9, CS_10:\n')
            f.write('%0.3f, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f, %0.3f\n'
                    % (CS_1, CS_2, CS_3, CS_4, CS_5, CS_6, CS_7, CS_8, CS_9, CS_10))
            f.write('\n')
Ejemplo n.º 15
0
 def __init__(self):
     super().__init__()
     self.resnet18 = resnet18(num_classes=4).eval()
Ejemplo n.º 16
0
def resnet18(config):
    return models.resnet18(num_classes=config["num_classes"])
def initialize_model(model_name, use_pretrained=True):
    # Initialize these variables which will be set in this if statement. Each of these
    #   variables is model specific.
    model_ft = None
    input_size = 224

    if model_name == "resnet18":
        """ Resnet18
        """
        model_ft = models.resnet18(pretrained=use_pretrained)

    elif model_name == "resnet34":
        """ Resnet34
        """
        model_ft = models.resnet34(pretrained=use_pretrained)
    elif model_name == "resnet50":
        """ Resnet50
        """
        model_ft = models.resnet50(pretrained=use_pretrained)
    elif model_name == "resnet101":
        """ Resnet101
        """
        model_ft = models.resnet101(pretrained=use_pretrained)
    elif model_name == "resnet152":
        """ Resnet152
        """
        model_ft = models.resnet152(pretrained=use_pretrained)

    elif model_name == "alexnet":
        """ Alexnet
        """
        model_ft = models.alexnet(pretrained=use_pretrained)

    elif model_name == "vgg11_bn":
        """ VGG11_bn
        """
        model_ft = models.vgg11_bn(pretrained=use_pretrained)

    elif model_name == "squeezenet1_0":
        """ Squeezenet1_0
        """
        model_ft = models.squeezenet1_0(pretrained=use_pretrained)

    elif model_name == "densenet121":
        """ Densenet121
        """
        model_ft = models.densenet121(pretrained=use_pretrained)

    elif model_name == "densenet169":
        """ Densenet169
        """
        model_ft = models.densenet169(pretrained=use_pretrained)

    elif model_name == "densenet201":
        """ Densenet201
        """
        model_ft = models.densenet201(pretrained=use_pretrained)

    elif model_name == "densenet161":
        """ Densenet161
        """
        model_ft = models.densenet161(pretrained=use_pretrained)

    elif model_name == "inception_v3":
        """ Inception v3
        Be careful, expects (299,299) sized images and has auxiliary output
        """
        model_ft = models.inception_v3(pretrained=use_pretrained)

        input_size = 299

    else:
        print("Invalid model name, exiting...")
        exit()

    return model_ft, input_size
Ejemplo n.º 18
0
 def __init__(self):
     super(ImageFeatureNet, self).__init__()
     self.feature = Models.resnet18(pretrained=True)
     self.feature = nn.Sequential(*list(self.feature.children())[:-1])
     self.fc1 = nn.Sequential(nn.Linear(512, 128))
Ejemplo n.º 19
0
    def __init__(self, infos):
        super(MyModule, self).__init__()
        self.hidden_dim = 512 * 2
        #self.size = 512*7*7
        in_channels = 512
        self.size_a = 512 * 1 * 1
        self.size_b = 256 * 7 * 7
        self.task_dim = infos[1]
        init_prelu = torch.FloatTensor([0.01])

        pretrained = models.resnet18(pretrained=True)
        p = 0.25

        #self.features = pretrained.features
        children = [c for c in pretrained.children()]
        children.pop()
        self.pool = children.pop()

        self.features = nn.Sequential(*children)

        self.tasks_transform = nn.Sequential(
            nn.Linear(self.task_dim, self.task_dim - 1),
            nn.BatchNorm1d(self.task_dim - 1),
        )

        # ----------------------------
        self.weights = nn.Sequential(
            nn.BatchNorm1d(self.hidden_dim),
            nn.Linear(self.hidden_dim, self.hidden_dim), nn.PReLU(init_prelu),
            nn.Dropout(p), nn.Linear(self.hidden_dim, self.hidden_dim),
            nn.PReLU(init_prelu))

        self.weights_task_apparel = nn.Sequential(
            nn.BatchNorm1d(self.hidden_dim + infos[2]),
            nn.Linear(self.hidden_dim + infos[2], self.hidden_dim),
            nn.PReLU(init_prelu),
        )

        self.weights_task_attribute = nn.Sequential(
            nn.BatchNorm1d(self.hidden_dim + infos[3]),
            nn.Linear(self.hidden_dim + infos[3], self.hidden_dim),
            nn.PReLU(init_prelu))

        # ----------------------------

        self.linear_a = nn.Sequential(
            nn.BatchNorm1d(self.size_a), nn.Linear(self.size_a,
                                                   self.hidden_dim),
            nn.PReLU(init_prelu), nn.Linear(self.hidden_dim, self.hidden_dim),
            nn.PReLU(init_prelu))

        self.linear_b = nn.Sequential(
            nn.Linear(self.size_b, self.hidden_dim), nn.PReLU(init_prelu),
            nn.BatchNorm1d(self.hidden_dim),
            nn.Linear(self.hidden_dim, self.hidden_dim), nn.PReLU(init_prelu))
        self.linear_apparel = nn.Sequential(
            nn.BatchNorm1d(self.size_a), nn.Linear(self.size_a,
                                                   self.hidden_dim),
            nn.PReLU(init_prelu), nn.BatchNorm1d(self.hidden_dim),
            nn.Linear(self.hidden_dim, infos[2]), nn.LogSoftmax())

        self.linear_attribute = nn.Sequential(nn.Linear(44, infos[3]),
                                              nn.LogSoftmax())

        self.linear_task = nn.Sequential(nn.Linear(44, self.hidden_dim),
                                         nn.PReLU(init_prelu))

        size = 6170
        self.final_linear = nn.Sequential(
            nn.BatchNorm1d(size), nn.Dropout(p),
            nn.Linear(size, self.hidden_dim * 2), nn.PReLU(init_prelu),
            nn.BatchNorm1d(self.hidden_dim * 2), nn.Dropout(p),
            nn.Linear(self.hidden_dim * 2, self.hidden_dim),
            nn.PReLU(init_prelu), nn.BatchNorm1d(self.hidden_dim),
            nn.Linear(self.hidden_dim, infos[0]), nn.LogSoftmax())
Ejemplo n.º 20
0
import cv2
import numpy as np
import logging
import sys

import torch
from torchvision import models
os.environ['TORCH_MODEL_ZOO'] = \
    '/mnt/vol/gfsai-east/ai-group/users/rgirdhar/StandardModels/PyTorch/ImNet'

FORMAT = '%(levelname)s %(filename)s:%(lineno)4d: %(message)s'
logging.basicConfig(level=logging.INFO, format=FORMAT, stream=sys.stdout)
logger = logging.getLogger(__name__)


default_model = models.resnet18(pretrained=True)


def prepare_image(im):
    im = im[..., (2, 1, 0)]  # convert to rgb
    try:
        im = cv2.resize(im, (224, 224))
    except cv2.error:
        im = np.zeros((224, 224, 3))  # dummy image
        logger.warning('Invalid patch, replaced with 0 image.')
    im = im.transpose(2, 0, 1)
    mean = np.array([0.485, 0.456, 0.406]).reshape(1, 3, 1, 1)
    std = np.array([0.229, 0.224, 0.224]).reshape(1, 3, 1, 1)
    im = (im / 255.0 - mean) / std
    im = torch.FloatTensor(im).cuda()
    im = torch.autograd.Variable(im, volatile=True)
Ejemplo n.º 21
0
    def __init__(self,
                 num_classes=100,
                 network='resnet18',
                 pretrained=True,
                 dropout_rate=0.2,
                 num_domain_classes=None):
        super(BasicResNet, self).__init__()

        if network == 'resnet152':
            resnet_model = models.resnet152(pretrained=pretrained)
        elif network == 'resnet101':
            resnet_model = models.resnet101(pretrained=pretrained)
        elif network == 'resnet50':
            resnet_model = models.resnet50(pretrained=pretrained)
        elif network == 'resnet34':
            resnet_model = models.resnet34(pretrained=pretrained)
        elif network == 'resnet18':
            resnet_model = models.resnet18(pretrained=pretrained)
        elif network == 'MobileNetV2':
            resnet_model = models.mobilenet_v2(pretrained=pretrained)
        elif network == 'inceptionV3':
            resnet_model = models.inception_v3(pretrained=pretrained)
        elif network == 'mnasnet':
            resnet_model = models.mnasnet1_0(pretrained=pretrained)
        elif network == 'VGG':
            resnet_model = models.vgg11(pretrained=pretrained)
        else:
            raise Exception("{} model type not supported".format(network))

        self.num_domain_classes = num_domain_classes
        self.resnet_model = resnet_model

        if 'resnet' in network:
            if num_domain_classes is None:
                self.resnet_model.fc = nn.Sequential(
                    nn.BatchNorm1d(resnet_model.fc.in_features),
                    nn.Dropout(dropout_rate),
                    nn.Linear(resnet_model.fc.in_features,
                              resnet_model.fc.in_features),
                    nn.ReLU(),
                    nn.BatchNorm1d(resnet_model.fc.in_features),
                    nn.Dropout(dropout_rate),
                    nn.Linear(resnet_model.fc.in_features,
                              resnet_model.fc.in_features),
                    nn.ReLU(),
                    nn.BatchNorm1d(resnet_model.fc.in_features),
                    nn.Dropout(dropout_rate),
                    nn.Linear(resnet_model.fc.in_features, num_classes),
                )
            else:
                self.resnet_model.fc = nn.Sequential(
                    nn.BatchNorm1d(resnet_model.fc.in_features),
                    nn.Dropout(dropout_rate),
                    nn.Linear(resnet_model.fc.in_features,
                              resnet_model.fc.in_features), nn.ReLU(),
                    nn.BatchNorm1d(resnet_model.fc.in_features),
                    nn.Dropout(dropout_rate),
                    nn.Linear(resnet_model.fc.in_features,
                              resnet_model.fc.in_features), nn.ReLU(),
                    nn.BatchNorm1d(resnet_model.fc.in_features),
                    nn.Dropout(dropout_rate),
                    nn.Linear(resnet_model.fc.in_features,
                              num_classes + num_domain_classes), nn.ReLU(),
                    nn.BatchNorm1d(num_classes + num_domain_classes),
                    nn.Dropout(dropout_rate))
                self.classes_output = nn.Linear(
                    num_classes + num_domain_classes, num_classes)
                self.domain_output = nn.Linear(
                    num_classes + num_domain_classes, num_domain_classes)
        elif 'VG' in network:
            self.resnet_model.classifier = nn.Sequential(
                nn.Linear(25088, 4096, bias=True), nn.ReLU(),
                nn.Dropout(p=0.5, inplace=False),
                nn.Linear(4096, 4096, bias=True), nn.ReLU(),
                nn.Dropout(p=0.5, inplace=False), nn.Linear(4096, num_classes))
Ejemplo n.º 22
0
                          ) if args.quick_test else (None, None)
poses = ([6]) if args.quick_test else poses

dl_test, n_iter_test = [], []
for pose in poses:
    dt_test = Fera2017Dataset('/data/data1/datasets/fera2017/',
                              partition='validation', tsubs=t_subs_te,  tposes=[pose], transform=tsfm, verbose=True)
    n_iter_test.append(len(dt_test)/args.batch_size)
    dl_test.append(DataLoader(dt_test, batch_size=args.batch_size,
                              num_workers=4))

n_iter_test_total = np.sum(n_iter_test)
print('n_iter in test per pose: {}, total: {}'.format(
    n_iter_test, n_iter_test_total))

encoder = models.resnet18()
model = GDVM_ResNet(encoder, latent=256, out=n_classes, dropout=0.4)
model.cuda()


def test():
    model.eval()
    f1s, mus = [], []
    for i, dl_test_pose in enumerate(dl_test):
        targets, preds = [], []
        print(
            '-----------------------------------Evaluating POSE {} ------------------------- '.format(poses[i]))
        for iter, (data, target, _) in enumerate(dl_test_pose):
            target = torch.clamp(target[:, aus], 0, 1)
            data, target = data.cuda(), target.cuda()
            data, target = Variable(data).float(
Ejemplo n.º 23
0
 def __init__(self, class_labels, pretrained = False):
     super(OneChannelResnet, self).__init__()
     self.model = models.resnet18(pretrained)
     self.model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
     self.model.fc = torch.nn.Linear(512 * self.model.layer1[0].expansion, len(class_labels.keys()))
Ejemplo n.º 24
0
 def __init__(self):
     super(Net, self).__init__()
     self.backbone = models.resnet18(pretrained=True)
     self.backbone.fc = nn.Linear(512, 5)
Ejemplo n.º 25
0
from torchvision.models import resnet18, resnet50
from torchscope import scope

model = resnet18()
# model = resnet50()
scope(model, input_size=(3, 224, 224))
Ejemplo n.º 26
0
def get_trained_resnet(use_gpu=True):
    model_ft = models.resnet18(pretrained=True)
    if use_gpu:
        model_ft = model_ft.try_cuda()
    return model_ft
Ejemplo n.º 27
0
    model = resnet18_lcs()
elif model_name == "se-resnet18":
    # resume ="/media/hszc/model/detao/models/lcz42/se_resnet18_lcs42/best_weigths_[1.0000000000000003e-05].pth"
    # resume ="model_weights/se_resnet18_9254/best_weigths_[1.0000000000000003e-05].pth"
    resume = "/media/hszc/model/detao/models/lcz42/se_resnet18_lcs42_dataaug/best_weigths_[1.0000000000000003e-05].pth"
    model = se_resnet18_lcs42()
elif model_name == "resnet34":
    resume = "/media/hszc/model/detao/models/lcz42/resnet34_lcs42_stride1/best_weigths_[0.0001].pth"
    model = resnet34_lcs()
elif model_name == "se-resnet34":
    resume = "/media/hszc/model/detao/models/lcz42/dla34_lcs/best_weigths_[1.0000000000000003e-05].pth"
    model = se_resnet34_lcs42()
elif model_name == "resnet18_224":
    from torchvision.models import resnet18
    resume = "/media/hszc/model/detao/models/lcz42/resnet18_224_input/best_weigths_[1.0000000000000003e-05].pth"
    model = resnet18(pretrained=True)
    model.conv1 = torch.nn.Conv2d(10,
                                  64,
                                  kernel_size=7,
                                  stride=1,
                                  padding=3,
                                  bias=False)
    model.avgpool = torch.nn.AdaptiveAvgPool2d(output_size=1)
    model.fc = torch.nn.Linear(model.fc.in_features, 17)
    model = torch.nn.DataParallel(model)
elif model_name == "resnet50_224":
    # from torchvision.models import resnet50
    # model=resnet50(pretrained=True)
    from models.dilate_resnet import dilate_resnet50
    model = dilate_resnet50(17)
Ejemplo n.º 28
0
def get_backbone(name, pretrained=True):
    """ 
    Returns the backone of a CNN and its number of output channels.

        Parameters:
            name (string):      CNN name
            pretrained (bool):  Pretrained weights condition

        Returns:
            backbone (Sequential):  The CNN backone warped as a torch.nn.Sequential object
            out_channels (int):     The depth of the last layer
    """
    
    # Mobilenet
    if name == 'mobilenet':
        backbone = models.mobilenet_v2(pretrained=pretrained).features
        out_channels = 1280
    # ResNet
    elif name == 'resnet18':
        resnet = models.resnet18(pretrained=pretrained)
        modules = list(resnet.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 512
    elif name == 'resnet34':
        resnet = models.resnet34(pretrained=pretrained)
        modules = list(resnet.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 512
    elif name == 'resnet50':
        resnet = models.resnet50(pretrained=pretrained)
        modules = list(resnet.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 2048
    elif name == 'resnet101':
        resnet = models.resnet101(pretrained=pretrained)
        modules = list(resnet.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 2048
    # ResNeXt
    elif name == 'resnext50':
        resnext = models.resnext50_32x4d(pretrained=pretrained)
        modules = list(resnext.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 2048
    elif name == 'resnext101':
        resnext = models.resnext101_32x8d(pretrained=pretrained)
        modules = list(resnext.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 2048
    elif name == 'wide_resnet50':
        w_resnet = models.wide_resnet50_2(pretrained=pretrained)
        modules = list(w_resnet.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 2048
    elif name == 'wide_resnet101':
        w_resnet = models.wide_resnet101_2(pretrained=pretrained)
        modules = list(w_resnet.children())[:-2]
        backbone = nn.Sequential(*modules)
        out_channels = 2048
    # Error
    else:
        raise NotImplemented('{} backbone model is not implemented so far.'.format(name))

    return backbone, out_channels
def initialize_model(model_name,
                     num_classes,
                     feature_extract,
                     use_pretrained=True):
    # Initialize these variables which will be set in this if statement. Each of these
    #   variables is model specific.
    model_ft = None
    input_size = 0

    # Ignore ssl certification (prevent error for some users)
    ssl._create_default_https_context = ssl._create_unverified_context

    if model_name == "resnet":
        """ Resnet18
        """
        model_ft = models.resnet18(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "resnet152":
        model_ft = models.resnet152(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "alexnet":
        """ Alexnet
        """
        model_ft = models.alexnet(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "vgg":
        """ VGG11_bn
        """
        model_ft = models.vgg11_bn(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "squeezenet":
        """ Squeezenet
        """
        model_ft = models.squeezenet1_0(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        model_ft.classifier[1] = nn.Conv2d(512,
                                           num_classes,
                                           kernel_size=(1, 1),
                                           stride=(1, 1))
        model_ft.num_classes = num_classes
        input_size = 224

    elif model_name == "densenet":
        """ Densenet
        """
        model_ft = models.densenet121(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier.in_features
        model_ft.classifier = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "inception":
        """ Inception v3
        Be careful, expects (299,299) sized images and has auxiliary output
        """
        model_ft = models.inception_v3(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        # Handle the auxilary net
        num_ftrs = model_ft.AuxLogits.fc.in_features
        model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)
        # Handle the primary net
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 299
    elif model_name == "xception":
        """ Xception
        Be careful, expects (299,299) sized images and has auxiliary output
        """
        model_ft = xception.xception(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 299

    elif model_name == "fleming_v1":
        """ Fleming Model
        Custom model created by team Fleming
        """
        model_ft = fleming.FlemingModel_v1(num_classes=196)
        input_size = 224

    elif model_name == "fleming_v2":
        """ Fleming Model
        Custom model created by team Fleming
        """
        model_ft = fleming.FlemingModel_v2(num_classes=196)
        input_size = 224

    elif model_name == "fleming_v3":
        """ Fleming Model
        Custom model created by team Fleming
        """
        model_ft = fleming.FlemingModel_v3(num_classes=196)
        input_size = 224

    else:
        print("Invalid model name, exiting...")
        exit()

    return model_ft, input_size
Ejemplo n.º 30
0
    net.load_state_dict(
        model_zoo.load_url(
            'https://download.pytorch.org/models/densenet161-8d451a50.pth',
            model_dir='/share/data/lang/users/dan/.torch/models'))
    args.test_bs = 64

elif args.model_name == 'densenet264':
    net = densenet_cosine_264_k48
    net.load_state_dict(
        model_zoo.load_url(
            'https://download.pytorch.org/models/densenet_cosine_264_k48.pth',
            model_dir='/share/data/lang/users/dan/.torch/models'))
    args.test_bs = 64

elif args.model_name == 'resnet18':
    net = models.resnet18()
    net.load_state_dict(
        model_zoo.load_url(
            'https://download.pytorch.org/models/resnet18-5c106cde.pth',
            model_dir='/share/data/lang/users/dan/.torch/models'))
    args.test_bs = 256

elif args.model_name == 'resnet34':
    net = models.resnet34()
    net.load_state_dict(
        model_zoo.load_url(
            'https://download.pytorch.org/models/resnet34-333f7ec4.pth',
            model_dir='/share/data/lang/users/dan/.torch/models'))
    args.test_bs = 128

elif args.model_name == 'resnet50':
Ejemplo n.º 31
0
!ls pix

transform = transforms.Compose([
    transforms.Resize([224, 224]),
    transforms.ToTensor(),
])

train_ds = Mydataset(Path('pix'), transform = transform)

test_ds = Mydataset(Path('pix'), False, transform)

train_dl = DataLoader (train_ds, batch_size = 64, num_workers = 0)

test_dl = DataLoader (train_ds, batch_size = 1, num_workers = 0)

model = models.resnet18( pretrained = False )

model.conv1 = nn.Conv2d(1, 64, kernel_size = (7, 7), stride = (2, 2), padding = (3, 3), bias=False)

model.fc = nn.Linear(in_features = 512, out_features = NUMBER_LEN * MAX_CAPTCHA, bias=True)

model.cuda()

loss_func = nn.MultiLabelSoftMarginLoss()
optm = torch.optim.Adam(model.parameters(), lr = 0.001)

for epoch in range(20):
    for step, i in enumerate(train_dl):
        img, label_oh, keys = i
        img = Variable(img).cuda()
        label_oh = Variable(label_oh.float()).cuda()
Ejemplo n.º 32
0
    def __init__(self,norm_layer=nn.BatchNorm2d,**cfg):
        super(FastPose_DUC_Dense, self).__init__()
        self._preset_cfg = cfg['PRESET']
        if cfg['BACKBONE'] == 'shuffle':
            print('Load shuffle backbone...')
            backbone = ShuffleResnet
        elif cfg['BACKBONE'] == 'se-resnet':
            print('Load SE Resnet...')
            backbone = SEResnet
        else:
            print('Load Resnet...')
            backbone = ResNet

        if 'DCN' in cfg.keys():
            stage_with_dcn = cfg['STAGE_WITH_DCN']
            dcn = cfg['DCN']
            self.preact = backbone(
                f"resnet{cfg['NUM_LAYERS']}", dcn=dcn, stage_with_dcn=stage_with_dcn)
        else:
            self.preact = backbone(f"resnet{cfg['NUM_LAYERS']}")

        # Init Backbone
        for m in self.preact.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.normal_(m.weight, std=0.001)
                for name, _ in m.named_parameters():
                    if name in ['bias']:
                        nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d):
                # nn.init.constant_(m.weight, 1)
                nn.init.uniform_(m.weight, 0, 1)
                nn.init.constant_(m.bias, 0)

        # Imagenet pretrain model
        import torchvision.models as tm
        if cfg['NUM_LAYERS'] == 152:
            ''' Load pretrained model '''
            x = tm.resnet152(pretrained=True)
        elif cfg['NUM_LAYERS'] == 101:
            ''' Load pretrained model '''
            x = tm.resnet101(pretrained=True)
        elif cfg['NUM_LAYERS'] == 50:
            x = tm.resnet50(pretrained=True)
        elif cfg['NUM_LAYERS'] == 18:
            x = tm.resnet18(pretrained=True)
        else:
            raise NotImplementedError
        model_state = self.preact.state_dict()
        state = {k: v for k, v in x.state_dict().items()
                 if k in self.preact.state_dict() and v.size() == self.preact.state_dict()[k].size()}
        model_state.update(state)
        self.preact.load_state_dict(model_state)
        self.norm_layer = norm_layer

        stage1_cfg = cfg['STAGE1']
        stage2_cfg = cfg['STAGE2']
        stage3_cfg = cfg['STAGE3']

        duc1 = self._make_duc_stage(stage1_cfg, 2048, 1024)
        duc2 = self._make_duc_stage(stage2_cfg, 1024, 512)
        duc3 = self._make_duc_stage(stage3_cfg, 512, self.conv_dim)

        self.duc = nn.Sequential(duc1, duc2, duc3)

        duc1_dense = self._make_duc_stage(stage1_cfg,2048,1024)
        duc2_dense = self._make_duc_stage(stage2_cfg,1024,512)
        duc3_dense = self._make_duc_stage(stage3_cfg,512,self.conv_dim)

        self.duc_dense = nn.Sequential(duc1_dense,duc2_dense,duc3_dense)

        self.conv_out = nn.Conv2d(
            self.conv_dim, self._preset_cfg['NUM_JOINTS'], kernel_size=3, stride=1, padding=1)

        self.conv_out_dense = nn.Conv2d(
            self.conv_dim,(self._preset_cfg['NUM_JOINTS_DENSE']-self._preset_cfg['NUM_JOINTS']),kernel_size=3,stride=1,padding=1)
        for params in self.preact.parameters():
            params.requires_grad = False
        for params in self.duc.parameters():
            params.requires_grad = False
Ejemplo n.º 33
0
import torch
import torchvision.utils as vutils
import numpy as np
import torchvision.models as models
from torchvision import datasets
from tensorboardX import SummaryWriter
import datetime

resnet18 = models.resnet18(False)
writer = SummaryWriter()
sample_rate = 44100
freqs = [262, 294, 330, 349, 392, 440, 440, 440, 440, 440, 440]

true_positive_counts = [75, 64, 21, 5, 0]
false_positive_counts = [150, 105, 18, 0, 0]
true_negative_counts = [0, 45, 132, 150, 150]
false_negative_counts = [0, 11, 54, 70, 75]
precision = [0.3333333, 0.3786982, 0.5384616, 1.0, 0.0]
recall = [1.0, 0.8533334, 0.28, 0.0666667, 0.0]

for n_iter in range(100):
    s1 = torch.rand(1)  # value to keep
    s2 = torch.rand(1)
    # data grouping by `slash`
    writer.add_scalar('data/scalar_systemtime', s1[0], n_iter)
    # data grouping by `slash`
    writer.add_scalar('data/scalar_customtime', s1[0], n_iter, walltime=n_iter)
    writer.add_scalars(
        'data/scalar_group', {
            "xsinx": n_iter * np.sin(n_iter),
            "xcosx": n_iter * np.cos(n_iter),
def main():
    global args, best_prec1
    args = parser.parse_args()
    print(args)


    # Set # classes
    if args.data == 'UCF101':
        num_classes = 101
    else:
        num_classes = 0
        print('Specify the dataset to use ')


    # Create model
    if args.pretrained:
        print("=> using pre-trained model '{}'".format(args.arch))
        model = models.__dict__[args.arch](pretrained=True)
    else:
        print("=> creating model '{}'".format(args.arch))
        model = models.__dict__[args.arch]()

    if args.arch.startswith('alexnet'):
        model = AlexNet(num_classes=num_classes)
        model.features = torch.nn.DataParallel(model.features)
        model.cuda()

    else:
        model = torch.nn.DataParallel(model).cuda()


    # Modify last layer of the model
    model_ft = models.resnet18(pretrained=True)
    num_ftrs = model_ft.fc.in_features
    model_ft.fc = nn.Linear(num_ftrs, 101)
    model = model_ft.cuda()
    model = torch.nn.DataParallel(model).cuda() # Using one GPU (device_ids = 1)
    # print(model)


    # Define loss function (criterion) and optimizer
    criterion = nn.CrossEntropyLoss().cuda()

    optimizer = torch.optim.SGD(model.parameters(), args.lr,
                                momentum=args.momentum,
                                weight_decay=args.weight_decay)

    # Optionally resume from a checkpoint
    if args.resume:
        checkpoint = torch.load(args.resume)
        args.start_epoch = checkpoint['epoch']
        best_prec1 = checkpoint['best_prec1']
        model.load_state_dict(checkpoint['state_dict'])
        optimizer.load_state_dict(checkpoint['optimizer'])
        print("=> loaded checkpoint '{}' (epoch {})"
              .format(args.resume, checkpoint['epoch']))
    else:
        print("=> no checkpoint found at '{}'".format(args.resume))

    cudnn.benchmark = True

    # Data loading code
    traindir = os.path.join(args.data, 'train')
    testdir = os.path.join(args.data, 'test')
    normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                     std=[0.229, 0.224, 0.225])

    train_loader = torch.utils.data.DataLoader(
        datasets.ImageFolder(traindir, transforms.Compose([
            transforms.RandomCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            normalize,
        ])),
        batch_size = args.batch_size, shuffle=True,
        num_workers=args.workers, pin_memory=True
    )

    val_loader = torch.utils.data.DataLoader(
        datasets.ImageFolder(testdir, transforms.Compose([
            transforms.Scale(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            normalize,
        ])),
        batch_size = args.batch_size, shuffle=False,
        num_workers=args.workers, pin_memory=True
    )

    if args.evaluate:
        validate(val_loader, model, criterion)
        return

    for epoch in range(args.start_epoch, args.epochs):
        adjust_learning_rate(optimizer, epoch)

        # Train for one epoch
        train(train_loader, model, criterion, optimizer, epoch)

        # # Evaluate on validation set
        prec1 = validate(val_loader, model, criterion)

        # Remember best prec@1 and save checkpoint
        is_best = prec1 > best_prec1
        best_prec1 = max(prec1, best_prec1)
        save_checkpoint({
            'epoch': epoch + 1,
            'arch': args.arch,
            'state_dict': model.state_dict(),
            'best_prec1': best_prec1,
            'optimizer': optimizer.state_dict(),
        }, is_best)
Ejemplo n.º 35
0
    clear()
    args = set_args()
    train_transform = transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor()
    ])
    test_transform = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor()
    ])
    with open("imagenet_class_index.json", "rb") as f:
        class_idx = json.load(f)
    train_loader, test_loader = ImageNet(args, train_transform, test_transform)
    teacher_model = pretrained_models.resnet18(pretrained=True).cuda(args.gpu)
    student_model = pretrained_models.resnet18(pretrained=True).cuda(args.gpu)
    criterion = nn.CrossEntropyLoss()
    teacher_sub_layers = list(teacher_model.children())[:7]
    teacher_sub_model = nn.Sequential(*teacher_sub_layers).cuda(args.gpu)
    student_sub_layers = list(student_model.children())[:7]
    student_sub_model = nn.Sequential(*student_sub_layers).cuda(args.gpu)
    with open("Resnet18.txt", "w") as f:
        architecture = list(teacher_model.children())
        f.write(str(architecture))

    for i, (images, labels) in enumerate(train_loader, start=1):
        with torch.no_grad():
            teacher_model.eval()
            student_model.eval()
            images = images.cuda(args.gpu)
}

# get train data size and validation data size
data_size = {
    'train': len(dataloader['train'].dataset),
    'val': len(dataloader['val'].dataset)
}

# get numbers of classes
img_classes = len(dataloader['train'].dataset.classes)

# test if using GPU
use_gpu = torch.cuda.is_available()
fix_param = True
# define model
transfer_model = models.resnet18(pretrained=True)
if fix_param:
    for param in transfer_model.parameters():
        param.requires_grad = False
dim_in = transfer_model.fc.in_features
transfer_model.fc = nn.Linear(dim_in, 2)
if use_gpu:
    transfer_model = transfer_model.cuda()

# define optimize function and loss function
if fix_param:
    optimizer = optim.Adam(transfer_model.fc.parameters(), lr=1e-3)
else:
    optimizer = optim.Adam(transfer_model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()
Ejemplo n.º 37
0
    def __init__(self,
                 pos_data_path: str,
                 neg_data_path: str,
                 model_path: str = None,
                 transform=None):
        # create a dataset object of inner class FireDataset
        dataset = self.FireDataset(pos_data_path=pos_data_path,
                                   neg_data_path=neg_data_path,
                                   transform=transform)
        # raise a ValueError if dataset is empty.
        if len(dataset) == 0:
            raise ValueError(f'Empty dataset!')

        # split the dataset into 60% train, 20% validation, and 20% test
        total_dataset_size = len(dataset)
        train_dataset_size = int(0.6 * total_dataset_size)
        val_dataset_size = int(0.2 * total_dataset_size)
        test_dataset_size = total_dataset_size - train_dataset_size \
             - val_dataset_size
        dataset_split = [
            train_dataset_size, val_dataset_size, test_dataset_size
        ]
        train_dataset, test_dataset, valid_dataset = \
            torch.utils.data.random_split(dataset, dataset_split)

        # create the dataloaders.
        train_loader = DataLoader(dataset=train_dataset,
                                  batch_size=16,
                                  shuffle=True,
                                  num_workers=0)
        valid_loader = DataLoader(dataset=valid_dataset,
                                  batch_size=128,
                                  shuffle=False,
                                  num_workers=0)
        test_loader = DataLoader(dataset=test_dataset,
                                 batch_size=128,
                                 shuffle=False,
                                 num_workers=0)

        # store datasets and dataloaders in dictionaries for convenience
        self.datasets = {
            'train': train_dataset,
            'test': test_dataset,
            'val': valid_dataset
        }
        self.dataloaders = {
            'train': train_loader,
            'test': test_loader,
            'val': valid_loader
        }

        # set up a ResNet18 model for binary classification
        model = models.resnet18(pretrained=True)
        num_in_fc = model.fc.in_features
        model.fc = nn.Linear(num_in_fc, 2)  # two classes: Fire and NoFire

        # if a previous model is specified by model_path, load it
        if model_path is not None:
            if not os.path.isfile(model_path):
                raise ValueError(f'{model_path} is not a valid model path')
            model.load_state_dict(torch.load(model_path))

        self.model = model
Ejemplo n.º 38
0
        _, preds = torch.max(outputs.data, 1)

        for j in range(inputs.size(0)):
            imagesSoFar += 1
            nCols = 2
            ax = plt.subplot(numImages // nCols, nCols, imagesSoFar)
            ax.axis('off')
            ax.set_title('predicted: {}'.format(class_names[preds[j]]))
            imshow(inputs.cpu().data[j])
            
            if imagesSoFar == numImages:
                model.train(mode=wasTraining)
                return
    model.train(mode=wasTraining)

modelFt = models.resnet18(pretrained=True)
#modelFt = models.resnet18(pretrained=False)
for param in modelFt.parameters():
    param.requires_grad = False

numFeatures = modelFt.fc.in_features
modelFt.fc = nn.Linear(numFeatures, 2)


if use_gpu:
    modelFt = modelFt.cuda()

criterion = nn.CrossEntropyLoss()

#optimizerFt = optim.SGD(modelFt.parameters(), lr=0.001, momentum=0.9)
#expLrScheduler = lr_scheduler.StepLR(optimizerFt, step_size=7, gamma=0.1)
Ejemplo n.º 39
0
    def __get_pytorch_module(self, name, collection, params, pretrained):
        # TK: "factory" is not passed as parameter anymore.
        # params["factory"] = self

        if collection == "toys" or collection == "tutorials" or collection == "other":
            constructor = NeuralModuleFactory.__name_import(
                "nemo.backends.pytorch.tutorials." + name)
        elif collection == "nemo_nlp":
            constructor = NeuralModuleFactory.__name_import("nemo_nlp." + name)
            if name == "BERT" and pretrained is True:
                params["pretrained"] = True
        elif collection == "nemo_asr":
            constructor = NeuralModuleFactory.__name_import("nemo_asr." + name)
        elif collection == "nemo_lpr":
            constructor = NeuralModuleFactory.__name_import("nemo_lpr." + name)
        elif collection == 'common':
            constructor = NeuralModuleFactory.__name_import(
                'nemo.backends.pytorch.common.' + name)
        elif collection == "torchvision":
            import torchvision.models as tv_models
            import nemo.backends.pytorch.module_wrapper as mw
            import torch.nn as nn

            if name == "ImageFolderDataLayer":
                constructor = NeuralModuleFactory.__name_import(
                    "nemo.backends.pytorch.torchvision.data." + name)
                instance = constructor(**params)
                return instance
            else:
                _nm_name = name.lower()
                if _nm_name == "resnet18":
                    input_ports = {
                        "x":
                        NeuralType({
                            0: AxisType(BatchTag),
                            1: AxisType(ChannelTag),
                            2: AxisType(HeightTag, 224),
                            3: AxisType(WidthTag, 224),
                        })
                    }
                    output_ports = {
                        "output":
                        NeuralType({
                            0: AxisType(BatchTag),
                            1: AxisType(ChannelTag)
                        })
                    }

                    pt_model = tv_models.resnet18(pretrained=pretrained)
                    num_classes = params.get("num_classes", None)
                    if num_classes is not None:
                        pt_model.fc = nn.Linear(512, params["num_classes"])
                    return mw.TrainableNeuralModuleWrapper(
                        pt_nn_module=pt_model,
                        input_ports_dict=input_ports,
                        output_ports_dict=output_ports,
                    )
                elif _nm_name == "resnet50":
                    input_ports = {
                        "x":
                        NeuralType({
                            0: AxisType(BatchTag),
                            1: AxisType(ChannelTag),
                            2: AxisType(HeightTag, 224),
                            3: AxisType(WidthTag, 224),
                        })
                    }
                    output_ports = {
                        "output":
                        NeuralType({
                            0: AxisType(BatchTag),
                            1: AxisType(ChannelTag)
                        })
                    }

                    pt_model = tv_models.resnet50(pretrained=pretrained)
                    num_classes = params.get("num_classes", None)
                    if num_classes is not None:
                        pt_model.fc = nn.Linear(2048, params["num_classes"])
                    return mw.TrainableNeuralModuleWrapper(
                        pt_nn_module=pt_model,
                        input_ports_dict=input_ports,
                        output_ports_dict=output_ports,
                    )
        else:
            collection_path = "nemo.collections." + collection + "." + name
            constructor = NeuralModuleFactory.__name_import(collection_path)
            if name == "BERT" and pretrained is True:
                params["pretrained"] = True

        # TK: "placement" is not passed as parameter anymore.
        # if "placement" not in params:
        #    params["placement"] = self._placement
        instance = constructor(**params)
        return instance
def initialize_model(model_name, num_classes, feature_extract, use_pretrained=True):
    # Initialize these variables which will be set in this if statement. Each of these
    #   variables is model specific.
    model_ft = None
    input_size = 0

    if model_name == "resnet":
        """ Resnet18
        """
        model_ft = models.resnet18(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs, num_classes)
        input_size = 224

    elif model_name == "alexnet":
        """ Alexnet
        """
        model_ft = models.alexnet(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
        input_size = 224

    elif model_name == "vgg":
        """ VGG11_bn
        """
        model_ft = models.vgg11_bn(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier[6].in_features
        model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
        input_size = 224

    elif model_name == "squeezenet":
        """ Squeezenet
        """
        model_ft = models.squeezenet1_0(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        model_ft.classifier[1] = nn.Conv2d(512, num_classes, kernel_size=(1,1), stride=(1,1))
        model_ft.num_classes = num_classes
        input_size = 224

    elif model_name == "densenet":
        """ Densenet
        """
        model_ft = models.densenet121(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        num_ftrs = model_ft.classifier.in_features
        model_ft.classifier = nn.Linear(num_ftrs, num_classes) 
        input_size = 224

    elif model_name == "inception":
        """ Inception v3 
        Be careful, expects (299,299) sized images and has auxiliary output
        """
        model_ft = models.inception_v3(pretrained=use_pretrained)
        set_parameter_requires_grad(model_ft, feature_extract)
        # Handle the auxilary net
        num_ftrs = model_ft.AuxLogits.fc.in_features
        model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)
        # Handle the primary net
        num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Linear(num_ftrs,num_classes)
        input_size = 299

    else:
        print("Invalid model name, exiting...")
        exit()
    
    return model_ft, input_size
import torch
import logging
from utils_for_examples import MLP, Identity
logging.getLogger().setLevel(logging.INFO)

import pytorch_metric_learning
logging.info("VERSION %s" % pytorch_metric_learning.__version__)

##############################
########## Training ##########
##############################

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Set trunk model and replace the softmax layer with an identity function
trunk = models.resnet18(pretrained=True)
trunk_output_size = trunk.fc.in_features
trunk.fc = Identity()
trunk = torch.nn.DataParallel(trunk.to(device))

# Set embedder model. This takes in the output of the trunk and outputs 64 dimensional embeddings
embedder = torch.nn.DataParallel(MLP([trunk_output_size, 64]).to(device))

# Set the classifier. The classifier will take the embeddings and output a 100 dimensional vector.
# (There are 100 classes in CIFAR100, which is the dataset we'll use in this example.)
# We'll specify the classification loss further down in the code.
classifier = torch.nn.DataParallel(MLP([64, 100])).to(device)

# Set optimizers
trunk_optimizer = torch.optim.Adam(trunk.parameters(),
                                   lr=0.00001,