Example #1
0
class TestVariationalAutoencoder(tf.test.TestCase):
    def setUp(self):
        self.model = VariationalAutoencoder(0.01, 1.0)

    def get_batch_images(self, batch_size):
        image = np.zeros((4096), dtype=np.float32)
        batch_images = [image] * batch_size
        return batch_images

    def test_prepare_loss(self):
        batch_size = 10
        # loss variable should be scalar
        self.assertEqual((), self.model.loss.get_shape())

    def test_prepare_partial_fit(self):
        batch_xs = self.get_batch_images(10)
        with self.test_session() as sess:
            sess.run(tf.global_variables_initializer())
            # loss result should be float
            loss = self.model.partial_fit(sess, batch_xs)
            self.assertEqual(np.float32, loss.dtype)

    def test_transform(self):
        batch_xs = self.get_batch_images(10)
        with self.test_session() as sess:
            sess.run(tf.global_variables_initializer())
            z_mean, z_log_sigma_sq = self.model.transform(sess, batch_xs)
            # check shape of latent variables
            self.assertEqual((10, 10), z_mean.shape)
            self.assertEqual((10, 10), z_log_sigma_sq.shape)

    def test_generate(self):
        with self.test_session() as sess:
            sess.run(tf.global_variables_initializer())
            # generate with prior
            xs = self.model.generate(sess)
            self.assertEqual((1, 4096), xs.shape)

            # generate with z_mu with batch size 5
            z_mu = np.zeros((5, 10), dtype=np.float32)
            xs = self.model.generate(sess, z_mu)
            self.assertEqual((5, 4096), xs.shape)

    def test_reconstruct(self):
        batch_xs = self.get_batch_images(10)
        with self.test_session() as sess:
            sess.run(tf.global_variables_initializer())
            xs = self.model.reconstruct(sess, batch_xs)
            # check reconstructed image shape
            self.assertEqual((10, 4096), xs.shape)
def exp1(overwrite=False):
    """Vanilla autoencoder. Gaussian prior and posterior, Bernoulli likelihood."""
    print("\nRunning VAE with two dimensional latency space...\n")

    latency_dim = 2
    encoder = [500] * 3  # num neurons in each layer of encoder network
    decoder = [500] * 3  # num neurons in each layer of generator network
    network_architecture = \
        dict(n_hidden_recog=encoder, # num neurons in each layer of encoder network
            n_hidden_gener=decoder,  # num neurons in each layer of generator network
            n_input=input_dim, # (img shape: 28*28)
            n_z=latency_dim)  # dimensionality of latent space
    training_epochs = 4
    batch_size = 100
    learning_rate = 0.0001
    filename = 'experiments/latency_dim=%d/enc=%s_dec=%s_epochs=%d_batches=%d_opt=adam_learnRate=%s' \
                % (latency_dim, '-'.join([str(l) for l in encoder]),
                   '-'.join([str(l) for l in decoder]),
                   training_epochs, batch_size, float('%.4g' % learning_rate))
    if not os.path.exists(
            os.path.join(filename, 'latency_space_while_training')):
        os.makedirs(os.path.join(filename, 'latency_space_while_training'))
    if os.path.exists('./' + filename + '/exp.meta') and not overwrite:
        vae = VariationalAutoencoder(network_architecture)
        new_saver = tf.train.import_meta_graph('./' + filename + '/exp.meta')
        new_saver.restore(vae.sess,
                          tf.train.latest_checkpoint('./' + filename + '/'))
    else:

        vae = VariationalAutoencoder(network_architecture,
                                     learning_rate=learning_rate,
                                     batch_size=batch_size)

        numPlots = 0
        nx = ny = 20
        rnge = 4
        x_values = np.linspace(-rnge, rnge, nx)
        y_values = np.linspace(-rnge, rnge, ny)
        interval = 10  # save fig of latency space every 10 batches

        # Training cycle
        for epoch in range(training_epochs):
            avg_cost = 0.
            avg_cost2 = 0.
            total_batch = int(n_samples / batch_size)
            # Loop over all batches
            canvas = np.empty((winSize * ny, winSize * nx))
            for i in range(total_batch):
                batch_xs = synthData[i * batch_size:(i + 1) * batch_size]

                # Fit training using batch data
                cost = vae.partial_fit(batch_xs, batch_xs)
                # Compute average loss
                avg_cost += cost / n_samples * batch_size
                avg_cost2 += cost / (batch_size * interval) * batch_size

                if i % interval == 0:
                    fig = plt.figure()
                    axes = fig.add_subplot(1, 2, 1)
                    axes2 = fig.add_subplot(1, 2, 2)
                    axes.set_aspect('equal')
                    axes.set_title("%d Iterations" %
                                   (epoch * n_samples + i * batch_size))
                    axes2.set_title("Average Cost = %f" % (avg_cost2))
                    avg_cost2 = 0.
                    axes.set_xlim((-rnge, rnge))
                    axes.set_ylim((-rnge, rnge))
                    test_xs = synthData[19000:20000]
                    test_ys = synthDataLabels[19000:20000]
                    means, stds = vae.getLatentParams(test_xs)
                    latent_xs = means + stds * np.random.normal(
                        size=stds.shape)
                    im = axes.scatter(latent_xs[:, 0],
                                      latent_xs[:, 1],
                                      c=test_ys,
                                      edgecolor='k')
                    cax = fig.add_axes([0.09, 0.71, 0.37, 0.03])
                    fig.colorbar(im, cax=cax, orientation='horizontal')

                    ws = winSize
                    for i, yi in enumerate(x_values):
                        for j, xi in enumerate(y_values):
                            z_mu = np.array([[xi, yi]] * vae.batch_size)
                            x_mean = vae.generate(z_mu)
                            canvas[(nx - i - 1) * ws:(nx - i) * ws,
                                   j * ws:(j + 1) * ws] = x_mean[0].reshape(
                                       ws, ws)

                    axes2.imshow(canvas, origin="upper")
                    plt.tight_layout()

                    fig.savefig(filename +
                                '/latency_space_while_training/fig%04d.png' %
                                numPlots)
                    numPlots += 1
                    plt.close()

            # Display logs per epoch step
            print("Epoch:", '%04d' % (epoch), "cost=",
                  "{:.9f}".format(avg_cost))

        vae.saver.save(vae.sess, filename + '/exp.meta')