Exemplo n.º 1
0
def test_autoencoder():
    """
    Test that all components of the auto-encoder work correctly by executing a
    training run against generated data.
    """

    input_shape = (3, )
    epochs = 1000

    # Generate some data
    x_train = np.random.rand(100, 3)
    x_test = np.random.rand(30, 3)

    # Define encoder and decoder model
    def create_encoder_model(input_shape):
        model_input = Input(shape=input_shape)

        encoder = Dense(4)(model_input)
        encoder = BatchNormalization()(encoder)
        encoder = Activation(activation='relu')(encoder)

        return Model(model_input, encoder)

    def create_decoder_model(embedding_shape):
        embedding_a = Input(shape=embedding_shape)

        decoder = Dense(3)(embedding_a)
        decoder = BatchNormalization()(decoder)
        decoder = Activation(activation='relu')(decoder)

        return Model(embedding_a, decoder)

    # Create auto-encoder network
    encoder_model = create_encoder_model(input_shape)
    decoder_model = create_decoder_model(encoder_model.output_shape)
    autoencoder = AutoEncoder(encoder_model, decoder_model)

    # Prepare auto-encoder for training
    autoencoder.compile(loss='binary_crossentropy', optimizer='adam')

    # Evaluate network before training to establish a baseline
    score_before = autoencoder.evaluate(x_train, x_train)

    # Train network
    autoencoder.fit(x_train,
                    x_train,
                    validation_data=(x_test, x_test),
                    epochs=epochs)

    # Evaluate network
    score_after = autoencoder.evaluate(x_train, x_train)

    # Ensure that the training loss score improved as a result of the training
    assert (score_before > score_after)
Exemplo n.º 2
0
def train_autoencoder_and_log(
        autoencoder: AutoEncoder,
        train_loader: DataLoader,
        test_loader: DataLoader,
        ) -> None:
    """Train the autoencoder and log data to disc."""
    if os.path.exists(config.LOG_DIR):
        shutil.rmtree(config.LOG_DIR)
    os.mkdir(config.LOG_DIR)
    train_losses = []
    test_losses = []
    test_images = _get_sample_digits(test_loader)
    all_encodings = []
    all_reconstructions = []
    for i in tqdm(range(config.STEPS)):
        # Train
        autoencoder.train_step(steps=1)

        # collect train and test losses
        train_losses.append(autoencoder.evaluate(train_loader))
        test_losses.append(autoencoder.evaluate(test_loader))

        # collect and save train encodings
        encodings = None
        for images, _ in train_loader:
            encodings_ = autoencoder.encode(images)
            if encodings is None:
                encodings = encodings_
            else:
                encodings = torch.cat((encodings, encodings_), 0)
        all_encodings.append(encodings)

        # collect the sample reconstructions
        reconstructions = autoencoder.autoencode(test_images)
        all_reconstructions.append(reconstructions)

    def save(filename, object):
        filename = os.path.join(config.LOG_DIR, filename)
        np.save(filename, object)



    # Format and save data
    train_losses = np.array(train_losses)
    save("train_losses.npy", train_losses)
    test_losses = np.array(test_losses)
    save("test_losses.npy", test_losses)

    test_images = (test_images.numpy() + 1) / 2
    save("test_images.npy", test_images)

    all_encodings = np.array([x.numpy() for x in all_encodings])
    save("encodings.npy", all_encodings)

    all_reconstructions = np.array([x.numpy() for x in all_reconstructions])
    all_reconstructions = (all_reconstructions + 1) / 2
    save("reconstructions.npy", all_reconstructions)

    labels = [x.numpy() for __, x in train_loader]
    labels = np.array(labels, dtype=int).flatten()
    save("labels.npy", labels)