def load_robot_VAE(self):
        if self.target_robot == 'BAXTER':
            load_name = '[Baxter]Motion_vae_Superset'
        elif self.target_robot == 'NAO':
            load_name = '[NAO]Motion_vae_Superset'
        elif self.target_robot == 'C3PO':
            load_name = '[C3PO]Motion_vae_Superset'
        else:
            print('Unknown robot..')
            raise ValueError

        load_path = os.path.join('./trained_models', 'vae')
        state_dict = torch.load(os.path.join(load_path, load_name + '.pt'),
                                map_location='cpu')
        rModel = VAE(14,
                     latent_dim=np.prod(self.args.action_shape),
                     use_batch_norm=False,
                     activation='Tanh')
        rModel.load_state_dict(state_dict)
        rModel.eval()
        print('Motion VAE Load Success!')

        if not self.args.symm_policy:
            self.myrobot.rModel = rModel
        return rModel
Example #2
0
    def __init__(self, im_shape, auroc=None, lr=None, batch_size=None, epochs=None, progress_bar=None,
                early_stopping=None, layer_idx=None, z_dim=None, dataset=None, num_workers=None,
                train_digit=None, test_digit=None, mvtec_object=None, inference_mode=None,
                sample_during_training=None, sample_every_n_epoch=None, eval=None, model_version=None,
                init_seed=None):
        """
        args:
            lr - Learning rate used for training
            inference_mode - Which kind of inferencing to use to calculate the score to be backpropagated on
                        options are 'mean_sum' and 'normal_diff'
            layer_idx - Index for which layer of the network to use the activations and gradients for for 
                        attention map generation
            z_dim - The latent dimension size to use for encoding/decoding
            auroc - Boolean switch, indicating whether we have access to target masks and if we want to compute
                    the AUROC scores for them. MNIST doesn't have target masks, UCSD and MVTEC do
            Other arguments are listed are not functional, but for logging, as save_hyperparameters() allows 
            us to track all arguments with tensorboard
        """
        super().__init__()

        # Set defaults to None when arguments are irrelevant
        if 'mvtec' not in dataset:
            mvtec_object = None
        elif 'mnist' not in dataset:
            train_digit, test_digit = None, None

        self.save_hyperparameters()
        
        self.vae = VAE(self.hparams.layer_idx, self.hparams.z_dim, self.hparams.im_shape)

        if self.hparams.auroc:
            self.roc = metrics.ROC(pos_label=1)
Example #3
0
def train_vae():

    batch_size = 64
    epochs = 1000
    latent_dimension = 100
    patience = 10

    device = torch.device(
        'cuda:0') if torch.cuda.is_available() else torch.device('cpu')
    # load data
    train_loader, valid_loader, _ = get_data_loader('data', batch_size)

    model = VAE(latent_dimension).to(device)

    optim = Adam(model.parameters(), lr=1e-3)

    val_greater_count = 0
    last_val_loss = 0
    for e in range(epochs):
        running_loss = 0
        model.train()
        for i, (images, _) in enumerate(train_loader):
            images = images.to(device)
            model.zero_grad()
            outputs, mu, logvar = model(images)
            loss = compute_loss(images, outputs, mu, logvar)
            running_loss += loss
            loss.backward()
            optim.step()

        running_loss = running_loss / len(train_loader)
        model.eval()
        with torch.no_grad():
            val_loss = 0
            for images, _ in valid_loader:
                images = images.to(device)
                outputs, mu, logvar = model(images)
                loss = compute_loss(images, outputs, mu, logvar)
                val_loss += loss
            val_loss /= len(valid_loader)

        if val_loss > last_val_loss:
            val_greater_count += 1
        else:
            val_greater_count = 0
        last_val_loss = val_loss

        torch.save(
            {
                'epoch': e,
                'model': model.state_dict(),
                'running_loss': running_loss,
                'optim': optim.state_dict(),
            }, "vae/upsample_checkpoint_{}.pth".format(e))
        print("Epoch: {} Train Loss: {}".format(e + 1, running_loss.item()))
        print("Epoch: {} Val Loss: {}".format(e + 1, val_loss.item()))
        if val_greater_count >= patience:
            break
Example #4
0
                        help='how many training processes to use (default: 4)')
    parser.add_argument('--num-steps',
                        type=int,
                        default=20,
                        help='number of forward steps in A3C (default: 20)')

    #
    parser.add_argument(
        '--env-name',
        default='Pong-ram-v0',
        help='environment to train on (default: PongDeterministic-v4)')
    return parser.parse_args()


action_map = {0: 2, 1: 3}
vae = VAE()
vae.load_state_dict(
    torch.load(VAE_MODEL_PATH, map_location=lambda storage, loc: storage))


def train(rank, args, shared_model, optimizer, counter, lock):
    env = gym.make(args.env_name)
    env._max_episode_steps = 100000
    env.seed(args.seed + rank)
    torch.manual_seed(args.seed + rank)

    model = RNN_vae(2, action_map)
    model.train()
    state = env.reset()
    done = True
    episode_length = 0
Example #5
0
sModel = VAE_SK(75, 75, use_batch_norm=False, activation='ReLU')
sModel.load_state_dict(state_dict)
sModel.eval()

# Load Motion vae Model
if myrobot.robot_name == 'BAXTER_MIMIC':
    load_name = '[Baxter]Motion_vae_Superset'
elif myrobot.robot_name == 'NAO_MIMIC':
    load_name = '[NAO]Motion_vae_Superset'
elif myrobot.robot_name == 'C3PO_MIMIC':
    load_name = '[C3PO]Motion_vae_Superset'

print('Motion Vae Name: ', load_name)
state_dict = torch.load(os.path.join(load_path, load_name + '.pt'))
rModel = VAE(14,
             latent_dim=np.prod(action_shape),
             use_batch_norm=False,
             activation='Tanh')  # action: 10*20
rModel.load_state_dict(state_dict)
rModel.eval()

if not args.symm_policy:
    myrobot.rModel = rModel

# -----[ For socket Communication, Client ] -----
if ntu_socket_comm:
    ntu_s = SocketCom('localhost', ntu_tcp_port)
    ntu_s.socket_connect()

num_eval_frames = 5000
reward_list = []
Example #6
0
if args.cuda:
    torch.cuda.manual_seed(args.seed)

kwargs = {'num_workers': 1, 'pin_memory': True} if args.cuda else {}
train_loader = torch.utils.data.DataLoader(TransientObjectLoader(
    args.data, train=True, transform=transforms.ToTensor()),
                                           batch_size=args.batch_size,
                                           shuffle=True,
                                           **kwargs)
test_loader = torch.utils.data.DataLoader(TransientObjectLoader(
    args.data, train=False, transform=transforms.ToTensor()),
                                          batch_size=args.batch_size,
                                          shuffle=True,
                                          **kwargs)

model = VAE()
load_ext = False
if osp.exists(args.save):
    with open(args.save, 'rb') as f:
        state_dict = torch.load(f)
        discard = [x for x in state_dict if x.startswith('fc1')]
        state = model.state_dict()
        state.update(state_dict)
        try:
            model.load_state_dict(state)
        except Exception:
            for key in discard:
                state_dict.pop(key)
            state = model.state_dict()
            state.update(state_dict)
            model.load_state_dict(state)
Example #7
0
    def make_data_tensor(self, train=True):
        if train:
            folders = self.metatrain_character_folders
            print("train folders: ", folders)
        else:
            folders = self.metatest_character_folders
            print("test folders: ", folders)

        # make list of files
        print('Generating filenames')
        inputa_files = []
        inputb_files = []
        labelas = []
        labelbs = []
        # To have totally different inputa and inputb, they should be sampled at the same time and then splitted.
        for sub_folder in folders:  # 쓰일 task수만큼만 경로 만든다. 이 task들이 iteration동안 어차피 반복될거니까
            # random.shuffle(sampled_character_folders)
            labels_and_images = get_images(sub_folder, range(self.num_classes), FLAGS.kshot_seed, nb_samples=self.num_samples_per_class,
                                           shuffle=True)
            # make sure the above isn't randomized order
            labels = [li[0] for li in labels_and_images]  # 0 0 1 1 = off off on on
            filenames = [li[1] for li in labels_and_images]
            # Split data into a/b
            k = int(self.num_samples_per_class / 2)  # = FLAGS.update_batch_size
            filenames = np.array(filenames).reshape(self.num_classes, self.num_samples_per_class)
            for files_per_class in filenames:
                for i in range(k):
                    inputa_files.append(files_per_class[2*i])
                    inputb_files.append(files_per_class[2*i+1])

            labels = np.array(labels).reshape(self.num_classes, self.num_samples_per_class)
            for labels_per_class in labels:
                for i in range(k):
                    labelas.append(labels_per_class[2*i])
                    labelbs.append(labels_per_class[2*i+1])


        print(">>>> inputa_files: ", inputa_files)
        print('----------------------------------------------------------------------------')
        print(">>>> inputb_files: ", inputb_files)
        print(">>>>>>>>>>>>>>>>> vae_model: ", FLAGS.vae_model)
        print(">>>>>>>>>>>>>>>>>> random seed for kshot: ", FLAGS.kshot_seed)
        print(">>>>>>>>>>>>>>>>>> random seed for weight: ", FLAGS.weight_seed)

        #################################################################################



        # inputa_files has (n*k * num_of_task) files.
        # make it to batch of which size is (n*k) : thus, the total number of batch = num_of_task
        batch_size = int(self.num_classes * FLAGS.update_batch_size)
        N_batch = num_of_task = int(len(inputa_files) / batch_size)  # len(inputa_files)/nk = num of task
        vae_model = VAE((self.img_size[0], self.img_size[1], 1), batch_size, FLAGS.num_au)

        def latent_feature(file_names):
            file_names_batch = np.reshape(file_names, [N_batch, batch_size])

            z_arr = []
            for file_bath in file_names_batch:
                imgs = []
                for filename in file_bath:
                    img = cv2.imread(filename)
                    imgs.append(img)

                pp = ED.image_pipeline2.FACE_pipeline(
                    histogram_normalization=True,
                    grayscale=True,
                    resize=True,
                    rotation_range=3,
                    width_shift_range=0.03,
                    height_shift_range=0.03,
                    zoom_range=0.03,
                    random_flip=True,
                )

                img_arr, pts, pts_raw = pp.batch_transform(imgs, preprocessing=True, augmentation=False)

                weights, z = vae_model.computeLatentVal(img_arr, FLAGS.vae_model, FLAGS.au_idx)
                z_arr.append(z)
            return np.concatenate(z_arr), weights

        inputa_latent_feat, self.pred_weights = latent_feature(inputa_files)
        inputb_latent_feat, self.pred_weights = latent_feature(inputb_files)
        #################################################################################


        import pickle
        pp = ED.image_pipeline.FACE_pipeline(
            histogram_normalization=True,
            grayscale=True,
            resize=True,
            rotation_range=3,
            width_shift_range=0.03,
            height_shift_range=0.03,
            zoom_range=0.03,
            random_flip=True,
        )
        batch_size = 10
        def get_test_latent(test_file_names, N_batch):
            file_names_batch = np.reshape(test_file_names[:N_batch * batch_size], [N_batch, batch_size])
            z_arr = []
            for file_path in file_names_batch:
                imgs = []
                for filename in file_path:
                    img = cv2.imread(filename)
                    imgs.append(img)
                img_arr, pts, pts_raw = pp.batch_transform(imgs, preprocessing=True, augmentation=False)
                weights, z = vae_model.computeLatentVal(img_arr, FLAGS.vae_model, FLAGS.au_idx)
                z_arr.append(z)
            return np.concatenate(z_arr)

        test_subjects = os.listdir(FLAGS.testset_dir)
        test_subjects.sort()
        test_subjects = test_subjects[FLAGS.test_start_idx - 14:FLAGS.test_start_idx - 14 + FLAGS.test_num]
        print("test_subjects: ", test_subjects)

        test_z_arr = []
        for test_subject in test_subjects:
            data = pickle.load(open(FLAGS.testset_dir + test_subject, "rb"), encoding='latin1')

            N_batch = int(len(data['test_file_names']) / batch_size)
            test_file_names = data['test_file_names'][:N_batch * batch_size]

            print(test_subject.split(".")[0], " original total len:", len(data['test_file_names']))
            print(test_subject.split(".")[0], " rounded down total len:", len(test_file_names))
            test_z_arr.append(get_test_latent(test_file_names, N_batch))
        print("test_z_arr : ", test_z_arr)
        print("test_z_arr size: ", np.array(test_z_arr).shape)

        #################################################################################


        def get_distance(z_arr):
            size = z_arr.shape[0]
            distance_mat = np.zeros((size,size))
            for i in range(size):
                for j in range(size):
                    distance_mat[i,j]= np.linalg.norm(z_arr[i]-z_arr[j])
            return distance_mat

        def get_distance_from_test(z_arr, z_arr2):
            distance_mat = np.zeros((z_arr.shape[0], len(z_arr2)))
            print("z_arr len in get_distance_from_test: ", z_arr.shape[0])
            for i in range(z_arr.shape[0]):
                print(i)
                for j in range(len(z_arr2)):
                    distance = 0
                    for k in range(z_arr2[j].shape[0]):
                        distance += np.linalg.norm(z_arr[i] - z_arr2[j][k])
                    distance_mat[i, j] = distance / z_arr2[j].shape[0]
            return distance_mat

        btw_a_a = get_distance(inputa_latent_feat)
        print("btw_a_a.shape: ", btw_a_a.shape)
        btw_b_b = get_distance(inputb_latent_feat)
        print("btw_b_b.shape: ", btw_b_b.shape)

        # alldata=np.array(np.array(inputa_latent_feat.tolist().extend(inputa_latent_feat.tolist())))
        # btw_all = get_distance(alldata)

        # test_file_names, y_lab

        btw_a_te = get_distance_from_test(inputa_latent_feat, test_z_arr)
        print("btw_a_te.shape: ", btw_a_te.shape)

        btw_b_te = get_distance_from_test(inputb_latent_feat, test_z_arr)
        print("btw_b_te.shape: ", btw_b_te.shape)


        save_path = "./logs/" + FLAGS.au + "/kshot/seed" + str(FLAGS.kshot_seed) + "/distance/"
        if not os.path.exists(save_path):
            os.makedirs(save_path)
        out = open(save_path + str(FLAGS.update_batch_size) + 'shot.pkl', 'wb')
        # pickle.dump({'btw_tr_tr': btw_tr_tr, 'btw_te_te': btw_te_te, 'btw_all': btw_all, 'a':inputa_files, 'b':inputb_files}, out, protocol=2)
        pickle.dump(
            {'btw_a_a': btw_a_a, 'btw_a_te': btw_a_te, 'a': inputa_files, 'btw_b_b': btw_b_b, 'btw_b_te': btw_b_te,
             'a': inputb_files, }, out, protocol=2)
        out.close()
Example #8
0
def train(config):
    # Print all configs to confirm parameter settings
    print_flags()

    # Initialize the model that we are going to use
    # model = LSTMLM(vocabulary_size=vocab_size,
    model = VAE(vocabulary_size=vocab_size,
                dropout=1 - config.dropout_keep_prob,
                lstm_num_hidden=config.lstm_num_hidden,
                lstm_num_layers=config.lstm_num_layers,
                lstm_num_direction=config.lstm_num_direction,
                num_latent=config.num_latent,
                device=device)

    model.to(device)

    # Setup the loss and optimizer
    criterion = nn.CrossEntropyLoss(ignore_index=1, reduction='sum')
    optimizer = optim.Adam(model.parameters(), lr=config.learning_rate)

    # Store some measures
    iteration = list()
    tmp_loss = list()
    train_loss = list()

    val_nll = list()
    val_perp = list()
    val_acc = list()
    val_elbo = list()

    train_perp = list()
    train_acc = list()
    train_elbo = list()
    train_nll = list()

    iter_i = 0
    best_perp = 1e6

    while True:  # when we run out of examples, shuffle and continue
        for train_batch in get_minibatch(train_data,
                                         batch_size=config.batch_size):

            # Only for time measurement of step through network
            t1 = time.time()
            iter_i += 1

            model.train()
            optimizer.zero_grad()

            inputs, targets, lengths_in_batch = prepare_minibatch(
                train_batch, vocab)

            # zeros in dim = (num_layer*num_direction * batch * lstm_hidden_size)
            # we have bidrectional single layer LSTM
            h_0 = torch.zeros(
                config.lstm_num_layers * config.lstm_num_direction,
                inputs.shape[0], config.lstm_num_hidden).to(device)
            c_0 = torch.zeros(
                config.lstm_num_layers * config.lstm_num_direction,
                inputs.shape[0], config.lstm_num_hidden).to(device)

            # pred, _, _ = model(inputs, h_0, c_0)
            decoder_output, KL_loss = model(inputs, h_0, c_0, lengths_in_batch,
                                            config.importance_sampling_size)

            reconstruction_loss = 0.0

            for k in range(config.importance_sampling_size):
                # the first argument for criterion, ie, crossEntrooy must be (batch, classes(ie vocab size), sent_length), so we need to permute the last two dimension of decoder_output (batch, sent_length, vocab_classes)
                # decoder_output[k] =decoder_output[k].permute(0, 2, 1) doesnt work
                reconstruction_loss += criterion(
                    decoder_output[k].permute(0, 2, 1), targets)

            # get the mean of the k samples of z
            reconstruction_loss = reconstruction_loss / config.importance_sampling_size
            KL_loss = KL_loss / config.importance_sampling_size

            print('At iter', iter_i, ', rc_loss=', reconstruction_loss.item(),
                  ' KL_loss = ', KL_loss.item())

            total_loss = (reconstruction_loss + KL_loss) / config.batch_size
            tmp_loss.append(total_loss.item())
            total_loss.backward()
            torch.nn.utils.clip_grad_norm_(model.parameters(),
                                           max_norm=config.max_norm)
            optimizer.step()

            if iter_i % config.eval_every == 0:
                eval_data = val_data
                eval_data_flag = 'val'
                print('Evaluating with validation at iteration ', iter_i,
                      '...')

                if iter_i % config.eval_every_train == 0:
                    eval_data = train_data
                    eval_data_flag = 'train'
                    print('Evaluating with training instead, at iteration ',
                          iter_i, '...')

                model.eval()

                ppl_total = 0.0
                validation_elbo_loss = 0.0
                validation_lengths = list()
                nll_per_eval = list()
                match = list()

                with torch.no_grad():
                    # computing ppl, match, and accuracy
                    for validation_th, val_sen in enumerate(eval_data):
                        val_input, val_target = prepare_example(val_sen, vocab)

                        # zeros in dim = (num_layer*num_direction,
                        # batch=config.importance_sampling_size,  lstm_hidden_size)
                        h_0 = torch.zeros(
                            config.lstm_num_layers * config.lstm_num_direction,
                            config.importance_sampling_size,
                            config.lstm_num_hidden).to(device)
                        c_0 = torch.zeros(
                            config.lstm_num_layers * config.lstm_num_direction,
                            config.importance_sampling_size,
                            config.lstm_num_hidden).to(device)

                        # append the sent length of this particular validation example
                        validation_lengths.append(val_input.size(1))

                        # feed into models
                        decoder_output, KL_loss_validation = model(
                            val_input, h_0, c_0, [val_input.size(1)],
                            config.importance_sampling_size)

                        # decoder_output.size() = (k, batchsize=1, val_input.size(1)(ie sent_length), vocabsize)
                        # prediction.size() = (k, sent_len, vocabsize)
                        # prediction_mean.size() = (sent_len, vocabsize), ie averaged over
                        # k samples (and squeezed)
                        prediction = nn.functional.softmax(torch.squeeze(
                            decoder_output, dim=1),
                                                           dim=2)
                        prediction_mean = torch.mean(prediction,
                                                     0)  # averaged over k

                        ppl_per_example = 0.0
                        # sentence length, ie 1 word/1 timestamp for each loop
                        for j in range(prediction.shape[1]):
                            # 0 as the target is the same for the k samples
                            ppl_per_example -= torch.log(
                                prediction_mean[j][int(val_target[0][j])])

                        ppl_total += ppl_per_example

                        if validation_th % 300 == 0:
                            print('    ppl_per_example at the ', validation_th,
                                  eval_data_flag, 'case = ', ppl_per_example)

                        tmp_match = compute_match_vae(prediction_mean,
                                                      val_target)
                        match.append(tmp_match)

                        # calculate validation elbo
                        # decoder_output.size() = (k, batchsize=1, val_input.size(1)(ie sent_length), vocabsize)
                        # the first argument for criterion, ie, crossEntrooy must be (batch, classes(ie vocab size), sent_length), so we need to permute the last two dimension of decoder_output  to get (k, batchsize=1, vocab_classes, sent_length)
                        # then we loop over k to get (1, vocab_classes, sent_len)
                        decoder_output_validation = decoder_output.permute(
                            0, 1, 3, 2)

                        reconstruction_loss = 0

                        for k in range(config.importance_sampling_size):
                            reconstruction_loss += criterion(
                                decoder_output_validation[k], val_target)

                        validation_elbo_loss += (reconstruction_loss + \
                                                 KL_loss_validation) / config.importance_sampling_size

                        nll_per_eval.append(ppl_per_example)

                ppl_total = torch.exp(ppl_total / sum(validation_lengths))
                print('ppl_total for iteration ', iter_i, ' =  ', ppl_total)

                accuracy = sum(match) / sum(validation_lengths)
                print('accuracy for iteration ', iter_i, ' =  ', accuracy)

                # loss of the previous iterations (up the after last eval)
                avg_loss = sum(tmp_loss) / len(tmp_loss)
                tmp_loss = list()  # reinitialize to zero
                validation_elbo_loss = validation_elbo_loss / len(val_data)

                if ppl_total < best_perp:
                    best_perp = ppl_total
                    torch.save(model.state_dict(), "./models/vae_best.pt")

                    # Instead of rewriting the same file, we can have new ones:
                    # model_saved_name = datetime.now().strftime("%Y-%m-%d_%H%M") + './models/vae_best.pt'
                    # torch.save(model.state_dict(), model_saved_name)

                nll = sum(nll_per_eval)

                print(
                    "[{}] Train Step {:04d}/{:04d}, "
                    "Validation Perplexity = {:.4f}, Validation loss ={:.4f}, Training Loss = {:.4f}, NLL = {:.4f}"
                    "Validation Accuracy = {:.4f}".format(
                        datetime.now().strftime("%Y-%m-%d %H:%M"), iter_i,
                        config.train_steps, ppl_total, validation_elbo_loss,
                        avg_loss, nll, accuracy))

                # update/save eval results everytime
                iteration.append(iter_i)
                train_loss.append(avg_loss)
                np.save('./np_saved_results/train_loss.npy',
                        train_loss + ['till_iter_' + str(iter_i)])

                if eval_data_flag == 'val':
                    val_perp.append(ppl_total.item())
                    val_acc.append(accuracy)
                    val_elbo.append(validation_elbo_loss.item())
                    val_nll.append(nll)

                    np.save('./np_saved_results/val_perp.npy',
                            val_perp + ['till_iter_' + str(iter_i)])
                    np.save('./np_saved_results/val_acc.npy',
                            val_acc + ['till_iter_' + str(iter_i)])
                    np.save('./np_saved_results/val_elbo.npy',
                            val_elbo + ['till_iter_' + str(iter_i)])
                    np.save('./np_saved_results/val_nll.npy',
                            val_elbo + ['till_iter_' + str(iter_i)])

                if eval_data_flag == 'train':
                    train_perp.append(ppl_total.item())
                    train_acc.append(accuracy)
                    train_elbo.append(validation_elbo_loss.item())
                    train_nll.append(nll)

                    np.save('./np_saved_results/train_perp.npy',
                            train_perp + ['till_iter_' + str(iter_i)])
                    np.save('./np_saved_results/train_acc.npy',
                            train_acc + ['till_iter_' + str(iter_i)])
                    np.save('./np_saved_results/train_elbo.npy',
                            train_elbo + ['till_iter_' + str(iter_i)])
                    np.save('./np_saved_results/train_nll.npy',
                            train_elbo + ['till_iter_' + str(iter_i)])

                if iter_i == config.train_steps:
                    break

        if iter_i == config.train_steps:
            break

    print('Done training!')
    print('+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-')

    print('Testing...')
    print('+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-')
    model.load_state_dict(torch.load('./models/vae_best.pt'))
    model.eval()

    ppl_total = 0.0
    validation_elbo_loss = 0.0
    validation_lengths = list()
    nll_per_eval = list()
    match = list()

    with torch.no_grad():
        # computing ppl, match, and accuracy
        # too large too slow lets stick with first 1000/1700 first
        for validation_th, val_sen in enumerate(test_data):
            val_input, val_target = prepare_example(val_sen, vocab)

            # zeros in dim = (num_layer*num_direction,
            # batch=config.importance_sampling_size,  lstm_hidden_size)
            h_0 = torch.zeros(
                config.lstm_num_layers * config.lstm_num_direction,
                config.importance_sampling_size,
                config.lstm_num_hidden).to(device)
            c_0 = torch.zeros(
                config.lstm_num_layers * config.lstm_num_direction,
                config.importance_sampling_size,
                config.lstm_num_hidden).to(device)

            # append the sent length of this particular validation example
            validation_lengths.append(val_input.size(1))

            # feed into models
            decoder_output, KL_loss_validation = model(
                val_input, h_0, c_0, [val_input.size(1)],
                config.importance_sampling_size)

            # decoder_output.size() = (k, batchsize=1, val_input.size(1)(ie sent_length), vocabsize)
            # prediction.size() = (k, sent_len, vocabsize)
            # prediction_mean.size() = (sent_len, vocabsize), ie averaged over k
            # samples (and squeezed)
            prediction = nn.functional.softmax(torch.squeeze(decoder_output,
                                                             dim=1),
                                               dim=2)
            prediction_mean = torch.mean(prediction, 0)  # averaged over k

            ppl_per_example = 0.0
            # sentence length, ie 1 word/1 timestamp for each loop
            for j in range(prediction.shape[1]):
                # 0 as the target is the same for the k samples
                ppl_per_example -= torch.log(prediction_mean[j][int(
                    val_target[0][j])])

            ppl_total += ppl_per_example

            tmp_match = compute_match_vae(prediction_mean, val_target)
            match.append(tmp_match)

            # calculate validation elbo
            # decoder_output.size() = (k, batchsize=1, val_input.size(1)(ie sent_length), vocabsize)
            # the first argument for criterion, ie, crossEntrooy must be (batch, classes(ie vocab size), sent_length), so we need to permute the last two dimension of decoder_output  to get (k, batchsize=1, vocab_classes, sent_length)
            # then we loop over k to get (1, vocab_classes, sent_len)
            decoder_output_validation = decoder_output.permute(0, 1, 3, 2)

            reconstruction_loss = 0

            for k in range(config.importance_sampling_size):
                reconstruction_loss += criterion(decoder_output_validation[k],
                                                 val_target)

            validation_elbo_loss += (reconstruction_loss + \
                                     KL_loss_validation) / config.importance_sampling_size

            nll_per_eval.append(ppl_total)

    ppl_total = torch.exp(ppl_total / sum(validation_lengths))

    accuracy = sum(match) / sum(validation_lengths)

    validation_elbo_loss = validation_elbo_loss / len(test_data)

    nll = sum(nll_per_eval)

    print('Test Perplexity on the best model is: {:.3f}'.format(ppl_total))
    print(
        'Test ELBO on the best model is: {:.3f}'.format(validation_elbo_loss))
    print('Test accuracy on the best model is: {:.3f}'.format(accuracy))
    print('Test NLL on the best model is: {:.3f}'.format(nll))
    print('+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-')
    with open('./result/vae_test.txt', 'a') as file:
        file.write(
            'Learning Rate = {}, Train Step = {}, '
            'Dropout = {}, LSTM Layers = {}, '
            'Hidden Size = {}, Test Perplexity = {:.3f}, Test ELBO =  {:.3f}, Test NLL =  {:.3f}'
            'Test Accuracy = {}\n'.format(config.learning_rate,
                                          config.train_steps,
                                          1 - config.dropout_keep_prob,
                                          config.lstm_num_layers,
                                          config.lstm_num_hidden, ppl_total,
                                          validation_elbo_loss, nll, accuracy))
        file.close()

    print('Sampling...')
    print('+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-')

    # model.load_state_dict(torch.load('./models/vae_best_lisa.pt'))
    model.load_state_dict(
        torch.load('./models/vae_best_lisa.pt',
                   map_location=lambda storage, loc: storage))

    with torch.no_grad():
        sentences = model.sample(config.sample_size, vocab)

    sentences_pruned_EOS = [[] for x in range(config.sample_size)]
    for i in range(len(sentences)):
        for j in range(len(sentences[i])):
            if sentences[i][j] != 'EOS':
                sentences_pruned_EOS[i].append(sentences[i][j])
            else:
                break

    with open('./result/vae_test_greedy_new.txt', 'a') as file:
        for idx, sen in enumerate(sentences_pruned_EOS):
            if idx == 0:
                file.write('\n Greedy: \n')
                file.write('Sampling \n{}: {}\n'.format(idx, ' '.join(sen)))
            else:
                file.write('Sampling \n{}: {}\n'.format(idx, ' '.join(sen)))

    print('Interpolating...')
    print('+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-')

    #interpolation
    with torch.no_grad():
        sentences = model.interpolation(vocab)

    sentences_pruned_EOS = [[], [], [], [], []]
    for i in range(len(sentences)):
        for j in range(len(sentences[i])):
            if sentences[i][j] != 'EOS':
                sentences_pruned_EOS[i].append(sentences[i][j])
            else:
                break

    with open('./result/vae_test_interpolate.txt', 'a') as file:
        file.write('\n Interpolation: \n')
        file.write('Sampling z1:\n {}\n'.format(' '.join(
            sentences_pruned_EOS[0])))
        file.write('Sampling z2:\n {}\n'.format(' '.join(
            sentences_pruned_EOS[1])))
        file.write('Sampling z1+z2/2:\n {}\n'.format(' '.join(
            sentences_pruned_EOS[2])))
        file.write('Sampling z1*0.8+z2*0.2:\n {}\n'.format(' '.join(
            sentences_pruned_EOS[3])))
        file.write('Sampling z1*0.2+z2*0.8:\n {}\n'.format(' '.join(
            sentences_pruned_EOS[4])))

    print('Test case reconstruction...')
    print('+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-')
    test_sen = test_data[101]
    # print('test_sen', test_sen)
    test_input, _ = prepare_example(test_sen, vocab)
    # print('test_input',test_input)

    # zeros in dim = (num_layer*num_direction,
    # batch=config.importance_sampling_size,  lstm_hidden_size)
    h_0 = torch.zeros(config.lstm_num_layers * config.lstm_num_direction,
                      config.importance_sampling_size,
                      config.lstm_num_hidden).to(device)
    c_0 = torch.zeros(config.lstm_num_layers * config.lstm_num_direction,
                      config.importance_sampling_size,
                      config.lstm_num_hidden).to(device)

    # feed into models
    reconstructed_sentences = model.test_reconstruction(test_input, vocab)

    sentences_pruned_EOS = [[] for x in range(10)]
    for i in range(len(reconstructed_sentences)):
        for j in range(len(reconstructed_sentences[i])):
            if reconstructed_sentences[i][j] != 'EOS':
                sentences_pruned_EOS[i].append(reconstructed_sentences[i][j])
            else:
                break

    with open('./result/vae_test_reconstruct.txt', 'a') as file:
        file.write('\n The sentence to reconstruct:\n {}\n'.format(' '.join(
            test_sen[1:])))
        for x in range(10):
            file.write('Sample: {} \n {}\n'.format(
                x, ' '.join(sentences_pruned_EOS[x])))
    '''
  t_loss = plt.figure(figsize = (6, 4))
  plt.plot(iteration, train_loss)
  plt.xlabel('Iteration')
  plt.ylabel('Training Loss')
  t_loss.tight_layout()
  t_loss.savefig('./result/vae_training_loss.eps', format='eps')

  v_perp = plt.figure(figsize = (6, 4))
  plt.plot(iteration, val_perp)
  plt.xlabel('Iteration')
  plt.ylabel('Validation Perplexity')
  v_perp.tight_layout()
  v_perp.savefig('./result/vae_validation_perplexity.eps', format='eps')

  v_acc = plt.figure(figsize = (6, 4))
  plt.plot(iteration, val_acc)
  plt.xlabel('Iteration')
  plt.ylabel('Validation Accuracy')
  v_acc.tight_layout()
  v_acc.savefig('./result/vae_validation_accuracy.eps', format='eps')


  v_elbo = plt.figure(figsize = (6, 4))
  plt.plot(iteration, val_elbo)
  plt.xlabel('Iteration')
  plt.ylabel('Validation ELBO')
  v_elbo.tight_layout()
  v_elbo.savefig('./result/vae_validation_elbo.eps', format='eps')
  print('Figures are saved.')
  print('+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-')
  '''

    return 0
Example #9
0
from torchsummary import summary
from torch.utils.data import DataLoader
import numpy as np

torch.manual_seed(2)
place = '119'
if place == 'azure':
    data_path = '/home/hung/DLCV2018SPRING/hw4/hw4_data/'
else:
    data_path = '/home/lilioo826/hw4_data/'
train_faceDataset = FaceDataset(data_path + 'train', data_path + 'train.csv',
                                transforms.ToTensor())
train_dataloader = DataLoader(train_faceDataset, batch_size=20, num_workers=1)

cuda = True
model = VAE(64, 1e-6)
# print(model)
if cuda:
    model.cuda()
# summary(model, (3,64,64))
# exit()

epoch_num = 100
model.train()
optimizer = optim.Adam(model.parameters(), lr=1e-4)

klds = []
mses = []
for epoch in range(epoch_num):
    print('epoch {}'.format(epoch + 1))
    epoch_kld = 0
@author: Caroline Pacheco
@email: [email protected]
"""

import pandas as pd
from vae_model import VAE
from trainer import *
from samples import *
from data import *
from LBP.eq_validity import equation_validity
import collections
import random

# train a vae instance model
model = VAE(vocab, vector).to(device)
fit(model, train_data)

# generate sample equations
sample = sample.take_samples(model, n_batch, 3000)
# validate generated equations
valid, not_valid, max_equations, unseenval = equation_validity(sample)

# save output file
df = pd.DataFrame(unseenval)
df.to_csv(r'output/my_equation.txt',
          header=None,
          index=None,
          sep='\t',
          mode='a')
Example #11
0
kld_history = np.load('VAE/kld_loss.npy')
mse_history = np.load('VAE/mse_loss.npy')
# print(kld_history)
# print(mse_history)
plt.figure(figsize=(40, 10))
plt.subplot(121)
plt.title('KLD loss')
plt.plot(kld_history)
plt.subplot(122)
plt.title('MSE loss')
plt.plot(mse_history)
plt.savefig(output_path+'/fig1_2.jpg')


model = VAE(64, 1e-5)
model.load_state_dict(torch.load('VAE/vae_state_model.pth'))
if cuda:
    model = model.cuda()
# print(model)

data_for_tsne = []
label_for_tsne = []
mse = 0
for (data, label) in test_dataloader:
    # print(data.size())
    # if cuda:
    #     data = data.cuda()
    # data = Variable(data.cuda())
    # recon_img, mu, logvar = model(data)
    # loss = model.loss_function(data, recon_img, mu, logvar)
Example #12
0
def main():

    if (FLAGS.save_path != ''):
        print(">>>>>>>>>>>>>>>FLAGS.save_path: ", FLAGS.save_path)
        from vae_model import VAE
        import EmoData as ED
        import cv2
        import pickle
        batch_size = 10
        vae_model = VAE((160, 240, 1), batch_size, FLAGS.num_au)

        pp = ED.image_pipeline.FACE_pipeline(
            histogram_normalization=True,
            grayscale=True,
            resize=True,
            rotation_range=3,
            width_shift_range=0.03,
            height_shift_range=0.03,
            zoom_range=0.03,
            random_flip=True,
        )
        batch_size = 10

        def get_test_latent(test_file_names, N_batch):
            file_names_batch = np.reshape(
                test_file_names[:N_batch * batch_size], [N_batch, batch_size])
            z_arr = []
            for file_path in file_names_batch:
                imgs = []
                for filename in file_path:
                    img = cv2.imread(filename)
                    imgs.append(img)
                img_arr, pts, pts_raw = pp.batch_transform(imgs,
                                                           preprocessing=True,
                                                           augmentation=False)
                weights, z = vae_model.computeLatentVal(
                    img_arr, FLAGS.vae_model, FLAGS.au_idx)
                z_arr.append(z)
            return np.concatenate(z_arr)

        test_subjects = os.listdir(FLAGS.testset_dir)
        test_subjects.sort()
        test_subjects = test_subjects[FLAGS.test_start_idx -
                                      14:FLAGS.test_start_idx - 14 +
                                      FLAGS.test_num]
        print("test_subjects: ", test_subjects)

        test_z_arr = []
        out = open(FLAGS.save_path + "testset_z_arr.pkl", 'wb')
        for test_subject in test_subjects:
            data = pickle.load(open(FLAGS.testset_dir + test_subject, "rb"),
                               encoding='latin1')

            N_batch = int(len(data['test_file_names']) / batch_size)
            test_file_names = data['test_file_names'][:N_batch * batch_size]

            print(
                test_subject.split(".")[0], " original total len:",
                len(data['test_file_names']))
            print(
                test_subject.split(".")[0], " rounded down total len:",
                len(test_file_names))
            pickle.dump(
                {test_subject: get_test_latent(test_file_names, N_batch)},
                out,
                protocol=2)
            # test_z_arr.append()
        # print("test_z_arr : ", test_z_arr)
        # print("test_z_arr size: ", np.array(test_z_arr).shape)
        out.close()
    else:
        data_generator = DataGenerator(FLAGS.update_batch_size * 2,
                                       FLAGS.meta_batch_size)
        data_generator.make_data_tensor()
Example #13
0
      ["truedist" if is_truedist else "embdist"] +
      ["2K" if is_smalldata else "38K"] +
      ["binaryreward" if is_binaryreward else ""])
kwargs = {}
if not is_truedist:
    assert is_image
# n_trajs = args.n_trajs

with open(test_data, 'rb') as f:
    test_tasks = pkl.load(f)
raw_transitions = np.load(transition_file)
if not os.path.exists(save_path):
    os.makedirs(save_path)

if is_image:
    model = VAE(image_channels=3, z_dim=10).cuda()
    model.load_state_dict(torch.load(embedding_params))
    kwargs['model'] = model

transform = transforms.Compose([
    transforms.Resize(64),
    transforms.CenterCrop(64),
    transforms.ToTensor(),
    # transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
"""
Set up the environment
"""
env = BlockEnv()
env.reset()
env.viewer_setup()