Esempio n. 1
0
def test_disent(cfg):
    print("Testing image disentanglement.")

    # load the data
    data, loader = get_mnist_dataset(cfg, 'disent')

    # load the model and set criterion
    models = load_disent_models(cfg)
    for name, model in models.items():
        model.eval()

    # get the data
    x = next(iter(loader.tr))[0]
    pics = [x_i.to(cfg.disent.device) for x_i in x]
    nt = len(pics)
    fig, ax = plt.subplots(nt, nt + 1, figsize=(8, 8))
    for i, pic_i in enumerate(pics):
        plot_th_tensor(ax, i, -1, pic_i)
        encC_i = models.enc_c(pic_i)
        encD_i = models.enc_d(pic_i)
        for j, pic_j in enumerate(pics):
            encC_j = models.enc_c(pic_j)
            encD_j = models.enc_d(pic_j)
            dec_ij = models.dec(torch.cat([encC_i, encD_j], dim=1))
            plot_th_tensor(ax, i, j, dec_ij)
            if i == j: continue
            dec_ji = models.dec(torch.cat([encC_j, encD_i], dim=1))
            # plot_th_tensor(ax,j,i,dec_ji)
    plt.savefig(f"test_disentangle_{cfg.disent.epoch_num}.png")
    plt.clf()
    plt.cla()
Esempio n. 2
0
def exploring_nt_xent_loss(cfg):
    print("Exploring the NT_Xent loss function.")

    # load the data
    data, loader = get_mnist_dataset(cfg, 'disent')
    img_set, img = next(iter(loader.tr))
    print(len(img_set))
    print(len(img_set[0]))
    print(len(img))
    print(len(img[0]))
    # x = [x_i.to('cpu')[0].permute((1,2,0)).numpy() for x_i in x]
    # x_dec = [x_dec_i.to('cpu')[0].detach().permute((1,2,0)).numpy() for x_dec_i in x_dec]

    batch_size = cfg.disent.batch_size
    loss = NT_Xent(batch_size, 0.1, cfg.disent.device, 1)
    print(img.reshape(batch_size, -1).shape)

    _, img1 = next(iter(loader.tr))
    _, img2 = next(iter(loader.tr))
    img1 = img1.reshape(batch_size, -1)
    img2 = img2.reshape(batch_size, -1)
    print(loss(img1, img2))

    fig, ax = plt.subplots(len(img_set), 2)
    for i, img_i in enumerate(img_set):
        # x_recon = x_dec_i - np.min(x_dec_i)
        # x_recon = x_recon / np.max(x_recon)
        # print(x_noisy.shape,x_recon.shape)
        ax[i, 0].imshow(img_i[0])
        ax[i, 1].imshow(img[0])
    plt.savefig("mnist_rand_blocks.png")
    plt.clf()
    plt.cla()
Esempio n. 3
0
def train_disent_exp(cfg):
    print("Training disentangled representations.")

    # load the data
    data, loader = get_mnist_dataset(cfg, 'disent')

    # load the model and set criterion
    models = load_disent_models(cfg)
    hyperparams = edict()
    hyperparams.h = 0.5
    hyperparams.g = 0.5
    hyperparams.x = 0.5
    hyperparams.temperature = 0.1
    criterion = DisentangleLoss(models, hyperparams, cfg.disent.N,
                                cfg.disent.batch_size, cfg.disent.device)
    optimizer, scheduler = get_disent_optim(models)

    # init the training loop
    writer = SummaryWriter()
    global_step, current_epoch = get_model_epoch_info(cfg.disent)
    cfg.disent.global_step = global_step
    cfg.disent.current_epoch = current_epoch

    # training loop
    for epoch in range(cfg.disent.current_epoch, cfg.disent.epochs + 1):
        lr = optimizer.param_groups[0]["lr"]
        loss_epoch = train_disent(cfg.disent, loader.tr, models, criterion,
                                  optimizer, epoch, writer)
        if scheduler:
            scheduler.step(loss_epoch)

        if epoch % cfg.disent.checkpoint_interval == 0:
            save_disent_models(cfg, models, optimizer)

        writer.add_scalar("Loss/train", loss_epoch / len(loader.tr), epoch)
        writer.add_scalar("Misc/learning_rate", lr, epoch)
        print(
            f"Epoch [{epoch}/{cfg.disent.epochs}]\t Loss: {loss_epoch / len(loader.tr)}\t lr: {round(lr, 5)}"
        )
        cfg.disent.current_epoch += 1

    save_disent_models(cfg, models, optimizer)
import torch
from torch import optim

from datasets import get_mnist_dataset, get_cifar10_dataset, get_data_loader
from utils import *

from models import *

trainset, testset = get_mnist_dataset()
trainloader, testloader = get_data_loader(trainset, testset)
batch, labels = next(iter(trainloader))
plot_batch(batch)
batch_var = Variable(batch.cuda())
labels_var = Variable(one_hotify(labels).cuda())

base_model = BaselineCNN().cuda()
print(count_params(base_model))

base_loss = nn.CrossEntropyLoss()
base_optimizer = optim.Adam(base_model.parameters())
base_trainer = Trainer(base_model,
                       base_optimizer,
                       base_loss,
                       trainloader,
                       testloader,
                       use_cuda=True)

base_trainer.run(epochs=10)
base_trainer.save_checkpoint('weights/baseline_mnist.pth.tar')