def test_MDN_weight_decay(self):
        mu = 5
        std = 5
        X, Y = self.get_samples(mu=mu, std=std)

        no_decay = MixtureDensityNetwork("mdn_no_weight_decay",
                                         1,
                                         1,
                                         hidden_sizes=(32, 32),
                                         n_centers=10,
                                         n_training_epochs=2000,
                                         weight_decay=0.0,
                                         weight_normalization=False)
        decay = MixtureDensityNetwork("mdn_weight_decay",
                                      1,
                                      1,
                                      n_centers=10,
                                      hidden_sizes=(32, 32),
                                      n_training_epochs=2000,
                                      weight_decay=1e-3,
                                      weight_normalization=False)
        no_decay.fit(X, Y)
        decay.fit(X, Y)

        y = np.arange(mu - 3 * std, mu + 3 * std, 6 * std / 20)
        x = np.asarray([mu for i in range(y.shape[0])])
        p_true = norm.pdf(y, loc=mu, scale=std)
        l1_err_no_dec = np.mean(np.abs(no_decay.pdf(x, y) - p_true))
        l1_err_dec = np.mean(np.abs(decay.pdf(x, y) - p_true))

        self.assertLessEqual(l1_err_dec, 0.1)
        self.assertLessEqual(l1_err_dec, l1_err_no_dec)
コード例 #2
0
    def test_MDN_l1_l2_regularization(self):
        mu = 5
        std = 5
        X, Y = self.get_samples(mu=mu, std=std, n_samples=500)

        mdn_no_reg = MixtureDensityNetwork("mdn_no_reg",
                                           1,
                                           1,
                                           hidden_sizes=(32, 32),
                                           n_centers=10,
                                           n_training_epochs=1000,
                                           l2_reg=0.0,
                                           weight_normalization=False)
        mdn_reg_l2 = MixtureDensityNetwork("mdn_reg_l2",
                                           1,
                                           1,
                                           n_centers=10,
                                           hidden_sizes=(32, 32),
                                           n_training_epochs=1000,
                                           l2_reg=1.0,
                                           weight_normalization=False)
        mdn_reg_l1 = MixtureDensityNetwork("mdn_reg_l1",
                                           1,
                                           1,
                                           n_centers=10,
                                           hidden_sizes=(32, 32),
                                           n_training_epochs=1000,
                                           l1_reg=1.0,
                                           weight_normalization=False)
        mdn_no_reg.fit(X, Y)
        mdn_reg_l2.fit(X, Y)
        mdn_reg_l1.fit(X, Y)

        y = np.arange(mu - 3 * std, mu + 3 * std, 6 * std / 20)
        x = np.asarray([mu for i in range(y.shape[0])])
        p_true = norm.pdf(y, loc=mu, scale=std)
        err_no_reg = np.mean(np.abs(mdn_no_reg.pdf(x, y) - p_true))
        err_reg_l2 = np.mean(np.abs(mdn_reg_l2.pdf(x, y) - p_true))
        err_reg_l1 = np.mean(np.abs(mdn_reg_l1.pdf(x, y) - p_true))

        self.assertLessEqual(err_reg_l2, err_no_reg)
        self.assertLessEqual(err_reg_l1, err_no_reg)
    def test4_MDN_with_2d_gaussian_noise_x(self):
        np.random.seed(22)
        X = np.random.uniform(0, 6, size=4000)
        Y = X + np.random.normal(0, 1, size=4000)

        x_test_2 = np.ones(100) * 2
        x_test_4 = np.ones(100) * 4
        y_test = np.linspace(1, 5, num=100)

        with tf.Session():
            model_no_noise = MixtureDensityNetwork("mdn_no_noise_x",
                                                   1,
                                                   1,
                                                   n_centers=1,
                                                   x_noise_std=None,
                                                   y_noise_std=None)
            model_no_noise.fit(X, Y)
            pdf_distance_no_noise = np.mean(
                np.abs(
                    model_no_noise.pdf(x_test_2, y_test) -
                    model_no_noise.pdf(x_test_4, y_test)))

            model_noise = MixtureDensityNetwork("mdn_noise_x",
                                                1,
                                                1,
                                                n_centers=1,
                                                x_noise_std=2,
                                                y_noise_std=None)
            model_noise.fit(X, Y)
            pdf_distance_noise = np.mean(
                np.abs(
                    model_noise.pdf(x_test_2, y_test) -
                    model_noise.pdf(x_test_4, y_test)))

            print("Training w/o noise - pdf distance:", pdf_distance_no_noise)
            print("Training w/ noise - pdf distance", pdf_distance_noise)

            self.assertGreaterEqual(pdf_distance_no_noise / pdf_distance_noise,
                                    2.0)
    def test_2_MDN_with_2d_gaussian_fit_by_crossval(self):
        X, Y = self.get_samples()

        param_grid = {"n_centers": [2, 10, 50]}

        model = MixtureDensityNetwork()
        model.fit_by_cv(X, Y, param_grid=param_grid)

        y = np.arange(-1, 5, 0.5)
        x = np.asarray([2 for i in range(y.shape[0])])
        p_est = model.pdf(x, y)
        p_true = norm.pdf(y, loc=2, scale=1)
        self.assertEqual(model.get_params()["n_centers"], 10)
        self.assertLessEqual(np.mean(np.abs(p_true - p_est)), 0.2)
    def testPickleUnpickleMDN(self):
        X, Y = self.get_samples()
        with tf.Session() as sess:
            model = MixtureDensityNetwork("mdn_pickle",
                                          2,
                                          2,
                                          n_training_epochs=10,
                                          data_normalization=True,
                                          weight_normalization=False)
            model.fit(X, Y)
            pdf_before = model.pdf(X, Y)

            # pickle and unpickle model
            dump_string = pickle.dumps(model)
        tf.reset_default_graph()
        with tf.Session() as sess:
            model_loaded = pickle.loads(dump_string)
            pdf_after = model_loaded.pdf(X, Y)

        diff = np.sum(np.abs(pdf_after - pdf_before))
        self.assertAlmostEqual(diff, 0, places=2)
    def test_MDN_with_2d_gaussian2(self):
        mu = -5
        std = 2.5
        X, Y = self.get_samples(mu=mu, std=std)

        model = MixtureDensityNetwork("mdn2",
                                      1,
                                      1,
                                      n_centers=5,
                                      weight_normalization=True)
        model.fit(X, Y)

        y = np.arange(mu - 3 * std, mu + 3 * std, 6 * std / 20)
        x = np.asarray([mu for i in range(y.shape[0])])
        p_est = model.pdf(x, y)
        p_true = norm.pdf(y, loc=mu, scale=std)
        self.assertLessEqual(np.mean(np.abs(p_true - p_est)), 0.1)

        p_est = model.cdf(x, y)
        p_true = norm.cdf(y, loc=mu, scale=std)
        self.assertLessEqual(np.mean(np.abs(p_true - p_est)), 0.1)
    def test_MDN_log_pdf(self):
        X, Y = np.random.normal(size=(1000, 3)), np.random.normal(size=(1000,
                                                                        2))

        for data_norm in [True, False]:
            with tf.Session() as sess:
                model = MixtureDensityNetwork("mdn_logprob" + str(data_norm),
                                              3,
                                              2,
                                              n_centers=1,
                                              hidden_sizes=(8, 8),
                                              n_training_epochs=10,
                                              data_normalization=data_norm)
                model.fit(X, Y)

                x, y = np.random.normal(size=(1000,
                                              3)), np.random.normal(size=(1000,
                                                                          2))
                prob = model.pdf(x, y)
                log_prob = model.log_pdf(x, y)
                self.assertLessEqual(np.mean(np.abs(prob - np.exp(log_prob))),
                                     0.001)
    def test_MDN_dropout(self):
        mu = -8
        std = 2.5
        X, Y = self.get_samples(mu=mu, std=std)

        dropout_model = MixtureDensityNetwork("mdn_dropout_reasonable",
                                              1,
                                              1,
                                              n_centers=5,
                                              weight_normalization=True,
                                              dropout=0.5,
                                              n_training_epochs=400)
        dropout_model.fit(X, Y)

        y = np.arange(mu - 3 * std, mu + 3 * std, 6 * std / 20)
        x = np.asarray([mu for i in range(y.shape[0])])
        p_est = dropout_model.pdf(x, y)
        p_true = norm.pdf(y, loc=mu, scale=std)
        self.assertLessEqual(np.mean(np.abs(p_true - p_est)), 0.1)

        p_est = dropout_model.cdf(x, y)
        p_true = norm.cdf(y, loc=mu, scale=std)
        self.assertLessEqual(np.mean(np.abs(p_true - p_est)), 0.1)
コード例 #9
0
for i, noise_std in enumerate([0.0, 0.05, 0.2]):
    estimator1 = MixtureDensityNetwork('mdn%i' % i,
                                       1,
                                       1,
                                       n_centers=20,
                                       x_noise_std=noise_std,
                                       y_noise_std=noise_std,
                                       random_seed=SEED)
    estimator1.fit(X, Y)

    y = np.linspace(mu - 3 * std, mu + 3 * std, num=500)
    x_cond = np.ones(500) * 0.0

    p_true = model.pdf(x_cond, y)
    p_est1 = estimator1.pdf(x_cond, y)

    line1 = axes[i].plot(y, p_true, label='true density', color='green')
    line2 = axes[i].plot(y, p_est1, label='est. density', color='red')
    axes[i].set_title('noise_std = %.2f' % noise_std)

axes[0].set_xlabel('y')
axes[2].set_xlabel('y')
axes[0].set_ylabel('probability density')

fig.legend((line1[0], line2[0]), ('true', 'estimated'),
           loc='lower center',
           ncol=2)  #loc=(0.857, 0.76))
fig.tight_layout(rect=[0.0, 0.01, 1, 1])

fig_path = os.path.join(DATA_DIR, 'plots/noise_reg/noise_reg_MDN.png')