Beispiel #1
0
def get_model(model_path):
    hyperparams = utils.load_dict_from_json_file(os.path.join(model_path, "hyperparams"))
    hyperparams['weights_initialization'] = "Zeros"

    trainingparams = utils.load_dict_from_json_file(os.path.join(model_path, "trainingparams"))
    dataset_name = trainingparams['dataset_name']

    if dataset_name != "binarized_mnist":
        raise ValueError("Invalid dataset. Only model trained on MNIST supported.")

    #
    # LOAD DATASET ####
    dataset = Dataset.get(dataset_name)
    if trainingparams['batch_size'] == -1:
        trainingparams['batch_size'] = dataset['train']['length']

    model = build_model(dataset, trainingparams, hyperparams, hyperparams['hidden_sizes'])

    print("### Loading model | Hidden:{0} CondMask:{1} Activation:{2} ... ".format(
        hyperparams['hidden_sizes'], hyperparams['use_cond_mask'], hyperparams['hidden_activation']), end=' ')
    start_time = t.time()
    load_model_params(model, model_path)
    print(utils.get_done_text(start_time), "###")

    return model, dataset_name, dataset
Beispiel #2
0
def get_model(model_path):
    hyperparams = utils.load_dict_from_json_file(
        os.path.join(model_path, "hyperparams"))
    hyperparams['weights_initialization'] = "Zeros"

    trainingparams = utils.load_dict_from_json_file(
        os.path.join(model_path, "trainingparams"))
    dataset_name = trainingparams['dataset_name']

    if dataset_name != "binarized_mnist":
        raise (Exception(
            "Invalid dataset. Only model trained on MNIST supported."))

    #
    # LOAD DATASET ####
    dataset = Dataset.get(dataset_name)
    if trainingparams['batch_size'] == -1:
        trainingparams['batch_size'] = dataset['train']['length']

    model = build_model(dataset, trainingparams, hyperparams,
                        hyperparams['hidden_sizes'])

    print "### Loading model | Hidden:{0} CondMask:{1} Activation:{2} ... ".format(
        hyperparams['hidden_sizes'], hyperparams['use_cond_mask'],
        hyperparams['hidden_activation']),
    start_time = t.time()
    load_model_params(model, model_path)
    print utils.get_done_text(start_time), "###"

    return model, dataset_name, dataset
Beispiel #3
0
    def load(cls, path):
        meta = load_dict_from_json_file(pjoin(path, "meta.json"))
        assert meta['name'] == cls.__name__

        hyperparams = load_dict_from_json_file(pjoin(path, "hyperparams.json"))

        model = cls(**hyperparams)
        parameters = np.load(pjoin(path, "params.npz"))
        for param_name, param in model.parameters.items():
            param.set_value(parameters[param_name])

        return model
Beispiel #4
0
    #
    # Set the name of the experiment (remove the --force from the args to make sure it will generate the same uid)
    if '--force' in sys.argv:
        sys.argv.remove('--force')
    experiment_name = args.name if args.name is not None else utils.generate_uid_from_string(
        ' '.join(sys.argv))

    #
    # Creating the experiments folder or resuming experiment
    save_path_experiment = os.path.join('./experiments/', experiment_name)
    if os.path.isdir(save_path_experiment):
        if not args.force:
            print "### Resuming experiment ({0}). ###\n".format(
                experiment_name)
            loaded_hyperparams = utils.load_dict_from_json_file(
                os.path.join(save_path_experiment, "hyperparams"))
            loaded_trainingparams = utils.load_dict_from_json_file(
                os.path.join(save_path_experiment, "trainingparams"))

            if loaded_trainingparams != trainingparams or loaded_hyperparams != hyperparams:
                print "The arguments provided are different than the one saved. Use --force if you are certain.\nQuitting."
                exit()

            resume_mode = True

    else:
        os.makedirs(save_path_experiment)
        utils.save_dict_to_json_file(
            os.path.join(save_path_experiment, "hyperparams"), hyperparams)
        utils.save_dict_to_json_file(
            os.path.join(save_path_experiment, "trainingparams"),
Beispiel #5
0
    hyperparams = vars(args.model)
    trainingparams = vars(args.train)

    #
    # Set the name of the experiment (remove the --force from the args to make sure it will generate the same uid)
    if '--force' in sys.argv:
        sys.argv.remove('--force')
    experiment_name = args.name if args.name is not None else utils.generate_uid_from_string(' '.join(sys.argv))

    #
    # Creating the experiments folder or resuming experiment
    save_path_experiment = os.path.join('./experiments/', experiment_name)
    if os.path.isdir(save_path_experiment):
        if not args.force:
            print "### Resuming experiment ({0}). ###\n".format(experiment_name)
            loaded_hyperparams = utils.load_dict_from_json_file(os.path.join(save_path_experiment, "hyperparams"))
            loaded_trainingparams = utils.load_dict_from_json_file(os.path.join(save_path_experiment, "trainingparams"))

            if loaded_trainingparams != trainingparams or loaded_hyperparams != hyperparams:
                print "The arguments provided are different than the one saved. Use --force if you are certain.\nQuitting."
                exit()

            resume_mode = True

    else:
        os.makedirs(save_path_experiment)
        utils.save_dict_to_json_file(os.path.join(save_path_experiment, "hyperparams"), hyperparams)
        utils.save_dict_to_json_file(os.path.join(save_path_experiment, "trainingparams"), trainingparams)

    #
    # LOAD DATASET ####
Beispiel #6
0
def _compute_AIS(model, M=100, betas=BETAS, batch_size=None, seed=1234, ais_working_dir=".", force=False):
    ais_results_json = pjoin(ais_working_dir, "ais_results.part.json")

    if batch_size is None:
        batch_size = M

    # Will be executing M AIS's runs.
    last_sample_chain = np.zeros((M, model.input_size), dtype=config.floatX)
    M_log_w_ais = np.zeros(M, dtype=np.float64)

    model.set_rng_seed(seed)

    ais_results = {}
    if os.path.isfile(ais_results_json) and not force:
        print "Resuming AIS using info from {}".format(ais_results_json)
        ais_results = utils.load_dict_from_json_file(ais_results_json)
        M_log_w_ais = ais_results['M_log_w_ais']
        last_sample_chain = ais_results['last_sample_chain']
        lnZ_trivial = ais_results['lnZ_trivial']

    # Iterate through all AIS runs.
    for i in range(0, M, batch_size):
        if i <= ais_results.get('batch_id', -1):
            continue

        model.set_rng_seed(seed+i)
        actual_size = min(M - i, batch_size)
        print "AIS run: {}/{} (using batch size of {})".format(i, M, batch_size)
        ais_partial_results = _compute_AIS_samples(model, M=actual_size, betas=betas)

        M_log_w_ais[i:i+batch_size] = ais_partial_results['M_log_w_ais']
        last_sample_chain[i:i+batch_size] = ais_partial_results['last_sample_chain']
        lnZ_trivial = ais_partial_results['lnZ_trivial']

        # Save partial results
        if os.path.isfile(ais_results_json):
            shutil.copy(ais_results_json, ais_results_json[:-4] + "old.json")

        ais_results = {'batch_id': i,
                       'M': M,
                       'batch_size': batch_size,
                       'last_sample_chain': last_sample_chain,
                       'M_log_w_ais': M_log_w_ais,
                       'lnZ_trivial': lnZ_trivial}
        utils.save_dict_to_json_file(ais_results_json, ais_results)

    # We compute the mean of the estimated `r_AIS`
    Ms = np.arange(1, M+1)
    log_sum_w_ais = np.logaddexp.accumulate(M_log_w_ais)
    logcummean_Z = log_sum_w_ais - np.log(Ms)

    # We compute the standard deviation of the estimated `r_AIS`
    logstd_AIS = np.zeros_like(M_log_w_ais)
    for k in Ms[1:]:
        m = np.max(M_log_w_ais[:k])
        logstd_AIS[k-1] = np.log(np.std(np.exp(M_log_w_ais[:k]-m), ddof=1)) - np.log(np.sqrt(k))
        logstd_AIS[k-1] += m

    logstd_AIS[0] = np.nan  # Standard deviation of only one sample does not exist.

    # The authors report AIS error using ln(Ẑ ± 3\sigma)
    m = max(np.nanmax(logstd_AIS), np.nanmax(logcummean_Z))
    logcumstd_Z_up = np.log(np.exp(logcummean_Z-m) + 3*np.exp(logstd_AIS-m)) + m - logcummean_Z
    logcumstd_Z_down = -(np.log(np.exp(logcummean_Z-m) - 3*np.exp(logstd_AIS-m)) + m) + logcummean_Z

    # Compute the standard deviation of ln(Z)
    std_lnZ = np.array([np.std(M_log_w_ais[:k], ddof=1) for k in Ms[1:]])
    std_lnZ = np.r_[np.nan, std_lnZ]  # Standard deviation of only one sample does not exist.

    return {"logcummean_Z": logcummean_Z.astype(config.floatX),
            "logcumstd_Z_down": logcumstd_Z_down.astype(config.floatX),
            "logcumstd_Z_up": logcumstd_Z_up.astype(config.floatX),
            "logcumstd_Z": logstd_AIS.astype(config.floatX),
            "M_log_w_ais": M_log_w_ais,
            "lnZ_trivial": lnZ_trivial,
            "std_lnZ": std_lnZ,
            "last_sample_chain": last_sample_chain,
            "batch_size": batch_size,
            "seed": seed,
            "nb_temperatures": len(betas),
            "nb_samples": M
            }