Beispiel #1
0
    num_hidden_1 = 10
    num_hidden_2 = 10
    num_hidden_3 = 10
    num_hidden_4 = 10

    n_epoch = 100  #20000

    # ---- train using training data

    # The n==0 statement is done because we only want to initialize the network once and then keep training
    # as we move through time

    if n == 0:
        auto1 = Autoencoder(feats_norm_train.shape[1], num_hidden_1)
    auto1.fit(feats_norm_train, n_epoch=n_epoch)

    inputs = torch.autograd.Variable(
        torch.from_numpy(feats_norm_train.astype(np.float32)))

    if n == 0:
        auto2 = Autoencoder(num_hidden_1, num_hidden_2)
    auto1_out = auto1.encoder(inputs).data.numpy()
    auto2.fit(auto1_out, n_epoch=n_epoch)

    if n == 0:
        auto3 = Autoencoder(num_hidden_2, num_hidden_3)
    auto1_out = torch.autograd.Variable(
        torch.from_numpy(auto1_out.astype(np.float32)))
    auto2_out = auto2.encoder(auto1_out).data.numpy()
    auto3.fit(auto2_out, n_epoch=n_epoch)
Beispiel #2
0
def main():

    # Parse arguments
    args = get_parser().parse_args()

    # Check for GPU
    is_gpu = len(tf.config.list_physical_devices("GPU")) > 0

    if not is_gpu and not args.allow_cpu:
        raise ValueError(
            "Cannot run the code on CPU. Please enable GPU support or pass the '--allow-cpu' flag."
        )

    # Check if dataset should be recreated
    if not os.path.exists("cleaned_dataset") or args.force_recreate:
        prepare_data()

    # ........................................................................
    # Let's select the train folds and the holdout fold
    # ........................................................................
    # Grab folds folders (fold_1, ..., fold_k)
    folds_folders = glob.glob("patched_dataset/**")

    # Randomly select 1 fold for being the holdout final test
    holdout_fold = np.random.choice(folds_folders, 1)[0]

    # Keep the rest for training and performing k-fold
    # Search for elements of `folds_folders` that are not in `holdout_fold`
    train_folds = np.setdiff1d(folds_folders, holdout_fold)

    print(f"Train folds: {train_folds}")
    print(f"Holdout fold: {holdout_fold}")

    for k, fold in enumerate(train_folds):
        # Print current fold
        print(f"Train Fold {k+1}:")
        print_fold_stats(fold)

    # Now for the holdout fold
    print("Holdout Fold:")
    print_fold_stats(holdout_fold)

    # Generate the bands to keep
    bands_to_keep = np.round(np.linspace(0, 272 - 1, args.bands)).astype(int)

    # Load test images and labels
    print("Loading holdout fold images")
    images, labels = load_fold(holdout_fold, bands_to_keep)
    test_data = (images, labels)
    # Creat list for holding the training datasets folds
    train_data_list = []
    for k, fold in enumerate(train_folds):
        print(f"Loading images of training fold {k+1}")
        # Load the normalized images to list
        images, labels = load_fold(fold, bands_to_keep)
        # Save images in dict with labels as value
        train_data_list.append([images, labels])

    # Check if a baseline model should be created
    if args.baseline:
        # ........................................................................
        # Let's now establish a baseline model
        # ........................................................................
        model = BaselineModel().cross_validate(
            train_data_list,
            fully_connected_size=128,
            add_dropout_layers=True,
        )

        # How does the model perform on unseen data?
        result = model.evaluate(test_data[0], test_data[1], batch_size=64)
        result = dict(zip(model.metrics_names, result))
        print(result)

    # ........................................................................
    # Let's now try to use the Autoencoder
    # ........................................................................
    # Get train data (We only care about the features now)
    x_train, _ = build_train_data(train_data_list, range(len(train_data_list)))
    x_test = test_data[0]

    print("Training an Autoencoder")
    # Instantiate autoencoder
    autoencoder = Autoencoder(x_train[0].shape, n_bands=args.bands)

    # Prepare callbacks
    # 1. Reduce learning rate when loss is on plateau
    reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor="val_loss",
                                                     factor=0.2,
                                                     patience=15,
                                                     min_lr=9e-4,
                                                     verbose=1)
    # 2. Early stopping
    early_stop = tf.keras.callbacks.EarlyStopping(
        monitor="val_loss",
        min_delta=0,
        patience=20,
        mode="auto",
        verbose=0,
        restore_best_weights=True,
    )

    # Compile the autoencoder
    autoencoder.compile(
        optimizer=tf.keras.optimizers.Adam(lr=1e-3),
        loss="mse",
    )

    # Train the model
    history = {}
    history["autoencoder"] = autoencoder.fit(
        x_train,
        x_train,
        validation_split=0.2,
        batch_size=16,
        epochs=250,
        verbose=1,
        callbacks=[reduce_lr, early_stop],
    )
    # Plot the Autoencoder loss curve
    plotter = tfdocs.plots.HistoryPlotter(metric="loss", smoothing_std=10)
    plotter.plot(history)
def aae(batch_size=128, dim_list=[100,100],
	latent_dim=32, nb_epoch=1, nb_epoch_ae=1,
	plt_frq=50, saved_model='',
	dataDirName=dataDirName, max_len=20, saved='',
	activation=['tanh', 'tanh']):
	
	# get date
	now = dt.datetime.now()
	date = now.strftime("%d%m_%H%M%S")

	# creating file name with parameters in name
	interm=''
	for i in dim_list:
		interm += str(i)

	name='e'+str(nb_epoch)+'_a'+str(nb_epoch_ae)+'_l'+str(latent_dim)+'_i'+interm+'_o'+str(max_len)


	# import Data
	Y_train, Y_test, Y_train, Y_test = importDataSet(dataDirName, max_len)


        dof = Y_train.shape[2]
        activation_list = activation
        dim_list = dim_list
        output_length = Y_train.shape[1]


	# define different models
        encoder = Encoder(latent_dim, output_length, dof, activation_list, dim_list)
        decoder = Decoder(latent_dim, output_length, dim_list, activation_list, dof)
        autoencoder = Autoencoder(encoder, decoder)
        discriminator = Discriminator(latent_dim)
	generator = Generator(encoder, discriminator)

	# compilating every models necessary
        compile(generator, discriminator, autoencoder)

	# summary of the different models
	encoder.summary()
	decoder.summary()
	discriminator.summary()

	# loading autoencoder if needed
	if saved != '':
		autoencoder = load_model(saved)	
		name += '_s'



        # Pre-train the AE
        print 'pre-training autoencoder'

        autoencoder.fit(Y_train, Y_train,
                                nb_epoch=nb_epoch_ae,
                                verbose=2,
                                batch_size=batch_size,
                                shuffle=True,
                                validation_data=(Y_test, Y_test))


        # Pre-train the discriminator network ...
        ntrain = 1000
        XT = np.random.permutation(Y_train)

	# generating vector (real distribution and encoder output)
        zfake = np.random.uniform(low=-1.0, high=1.0, size=[XT.shape[0], latent_dim])
        zreal = encoder.predict(XT)
        X = np.concatenate((zreal, zfake))

	# putting labels on vectors
        n = XT.shape[0]
        y = np.zeros(2*n)
        y[:n] = 1
        y = np_utils.to_categorical(y, 2)

	# training discriminator
        discriminator.fit(X, y, nb_epoch=1, verbose=0, batch_size=batch_size)
        
        y_hat = discriminator.predict(X)
        y_hat_idx = np.argmax(y_hat, axis=1)

        y_idx = np.argmax(y, axis=1)

        diff = y_idx-y_hat_idx
        n_tot = y.shape[0]
        n_rig = (diff==0).sum()
        acc = n_rig*100.0/n_tot
        print "Discriminator Accuracy pretrain: %0.02f pct (%d pf %d) right on %d epoch"%(acc, n_rig, n_tot, 1)

        # set up loss storage vector
    	losses = {"discriminator":[], "generator":[]}

	# defining function to train aae
        def train_for_n(nb_epoch=5, plt_frq=plt_frq, BATCH_SIZE=32):

                count = 0
                for e in range(nb_epoch):
                        # Train ae
                        print "epoch %d"%(e+1)
			# first we train the autoencoder
                        autoencoder_losses = autoencoder.fit(Y_train, Y_train,
                                                         shuffle=True,
                                                         nb_epoch=1,
                                                         batch_size=BATCH_SIZE,
                                                         verbose=2,
                                                         validation_data=(Y_test, Y_test))


                        # Make generative latent vectors
                        music_batch = Y_train[np.random.randint(Y_train.shape[0], size=BATCH_SIZE)] 
                        noise = np.random.uniform(low=-1.0, high=1.0, size=[BATCH_SIZE,latent_dim])
                        zreal = encoder.predict(music_batch)
                
                        # Train discriminator on generated images
                        nb_misclassified = np.random.randint(BATCH_SIZE)

                        X0 = np.concatenate((zreal, noise))
                        y0 = np.zeros(BATCH_SIZE)
                        y0 = np_utils.to_categorical(y0, 2)

			# noising labels
                        misclass = np.zeros(BATCH_SIZE)
                        misclass[:nb_misclassified] = 0
                        misclass = np_utils.to_categorical(misclass, 2)

                        y0=np.concatenate((misclass, y0))
                           
                        #in order to shuffle labels
                        zipped = list(zip(X0, y0))
                        shuffle(zipped)
                        X0, y0 = zip(*zipped)
                        X0 = np.array(X0)
                        y0 = np.array(y0)

                        # then training discriminator 
                        #make_trainable(discriminator, True)
                        # print "Training discriminator"
                        d_loss, d_lab  = discriminator.train_on_batch(X0, y0)
                        losses["discriminator"].append(float(d_loss))
                
                        # train Generator-Discriminator stack on input noise to non-generated output class
                        y2 = np.ones(BATCH_SIZE)
                        y2 = np_utils.to_categorical(y2, 2)
                

                        #make_trainable(discriminator, False)
                        # Train generator
                        # print "Training generator"
                        g_loss, g_lab = generator.train_on_batch(music_batch, y2)

                        image_batch = Y_train[np.random.randint(0,Y_train.shape[0],size=BATCH_SIZE)]        
                        g_loss, g_lab = generator.train_on_batch(music_batch, y2 )
                        losses["generator"].append(float(g_loss))

                
                        # Updates plots

                        d_acc = discriminator.evaluate(X,y, batch_size=BATCH_SIZE, verbose=0) 
                        print "\ndiscriminator loss:", losses["discriminator"][-1]
                        print "discriminator acc:", d_acc[1]
                        print "generator loss:", losses["generator"][-1]
                        #print "autoencoder loss:", autoencoder_losses
                        
                        count += 1
                        
	# launching previous function to train aae
        train_for_n(nb_epoch=nb_epoch, plt_frq=plt_frq, BATCH_SIZE=batch_size)

	# saving final models
        autoencoder.save(name+'_autoencoder.h5')
        encoder.save(name+'_encoder_save.h5')
        decoder.save(name+'_decoder_save.h5')

	
	#writing losses in a csv to plot them via plot_loss.py
	with open('loss.csv', 'w') as csvfile:
		fieldnames = ['discriminator', 'generator']
		w = csv.DictWriter(csvfile, fieldnames=fieldnames)
		w.writeheader()
		w.writerow(losses)

	# plotting loss
	plot_loss('loss.csv')