Esempio n. 1
0
class MNIST_DCGAN(object):
    def __init__(self):
        self.img_rows = 28
        self.img_cols = 28
        self.channel = 8

        self.x_train = input_data.read_data_sets("mnist",
                                                 one_hot=True).train.images
        self.x_train = self.x_train.reshape(-1, self.img_rows, self.img_cols,
                                            1).astype(np.float32)

        self.DCGAN = DCGAN()
        self.discriminator = self.DCGAN.discriminator_model()
        self.adversarial = self.DCGAN.adversarial_model()
        self.generator = self.DCGAN.generator()
Esempio n. 2
0
class Spectrogram_dcgan():
    def __init__(self, j=10, batch_size=128, target="HH", data=None):
        self.training_generator = None
        self.test_generator = None
        self.batch_size = batch_size
        self.target = target
        self.data = data

        self.spec_cols = 1024
        self.spec_length = j

        self.DCGAN = DCGAN(img_rows=self.spec_length,
                           img_cols=self.spec_cols,
                           channel=1)
        self.discriminator = self.DCGAN.discriminator_model()
        self.adversarial = self.DCGAN.adversarial_model()
        self.generator = self.DCGAN.generator()

        self.data_size = 0
        self.load_data()

    def load_data(self):

        if self.data is None:
            # Prepare data, adapted from spectrogram.cnn.py
            spectrograms, num_frames = data.import_smt.load_smt_dataset(
                "./data/smt_spectrograms.h5")
            data_size = num_frames - (self.spec_cols - 1) * len(
                spectrograms
            )  # you lose last (j-1) frames at the end of the spectrograms
            train_size = int(data_size * 0.7)

            train_ids = np.arange(start=1, stop=train_size)
            self.training_generator = data.cnn_data_generator.DataGenerator(
                train_ids,
                spectrograms=spectrograms,
                spec_width=self.spec_length,
                num_channels=1,
                shuffle=True,
                n_classes=2,
                batch_size=self.batch_size,
                target=self.target)

            test_ids = np.arange(start=train_size, stop=data_size)
            self.test_generator = data.cnn_data_generator.DataGenerator(
                test_ids,
                spectrograms=spectrograms,
                spec_width=self.spec_length,
                num_channels=1,
                shuffle=True,
                n_classes=2,
                batch_size=self.batch_size,
                target=self.target)
            self.data_size = data_size

            # train_specs, test_specs = data.import_smt.load_smt_train_test_std("./data/smt_spectrograms.h5", test_size=0)
            # train_num_frames = data.import_smt.count_total_frames(train_specs)
            # test_num_frames = data.import_smt.count_total_frames(test_specs)
            #
            # train_data_size = train_num_frames - (self.spec_length - 1) * len(
            #     train_specs)  # you lose last (j-1) frames at the end of the spectrograms
            # # test_data_size = test_num_frames - (self.spec_length - 1) * len(test_specs)
            #
            # self.training_generator = data.cnn_data_generator.DataGenerator(np.arange(train_data_size), spectrograms=train_specs,
            #                                                            spec_width=self.spec_length, num_channels=1,
            #                                                            shuffle=True, n_classes=2,
            #                                                            batch_size=self.batch_size, target=self.target)
            # # self.test_generator = data.cnn_data_generator.DataGenerator(np.arange(test_data_size), spectrograms=test_specs,
            # #                                                        spec_width=j, num_channels=1, shuffle=True,
            # #                                                        n_classes=2, batch_size=self.batch_size,
            # #                                                        target=self.target)
            #
            # self.train_data_size = train_data_size

        else:
            # Try to keep the code as similar as above
            spectrograms, num_frames = self.data, data.import_smt.count_total_frames(
                self.data)
            data_size = num_frames - (self.spec_cols - 1) * len(
                spectrograms
            )  # you lose last (j-1) frames at the end of the spectrograms
            train_size = 1 * data_size  # 100%

            train_ids = np.arange(start=1, stop=train_size)
            self.training_generator = data.cnn_data_generator.DataGenerator(
                train_ids,
                spectrograms=spectrograms,
                spec_width=self.spec_length,
                num_channels=1,
                shuffle=True,
                n_classes=2,
                batch_size=self.batch_size,
                target=self.target)
            self.data_size = data_size

    def train(self, train_steps=2000, batch_size=256, save_interval=0):
        noise_input = None
        if save_interval > 0:
            noise_input = np.random.uniform(-1.0, 1.0, size=[16, 100])
        for i in range(train_steps):
            # images_train = self.x_train[np.random.randint(0,
            #     self.x_train.shape[0], size=batch_size), :, :, :]

            images_train, _ = self.training_generator.__getitem__(i)

            noise = np.random.uniform(-1.0, 1.0, size=[batch_size, 100])
            images_fake = self.generator.predict(noise)
            x = np.concatenate((images_train, images_fake))
            y = np.ones([2 * batch_size, 1])
            y[batch_size:, :] = 0
            d_loss = self.discriminator.train_on_batch(x, y)

            y = np.ones([batch_size, 1])
            noise = np.random.uniform(-1.0, 1.0, size=[batch_size, 100])
            a_loss = self.adversarial.train_on_batch(noise, y)
            log_mesg = "%d: [D loss: %f, acc: %f]" % (i, d_loss[0], d_loss[1])
            log_mesg = "%s  [A loss: %f, acc: %f]" % (log_mesg, a_loss[0],
                                                      a_loss[1])
            print(log_mesg)
            if save_interval > 0:
                if (i + 1) % save_interval == 0:
                    self.plot_images(save2file=True, samples=noise_input.shape[0],\
                        noise=noise_input, step=(i+1))

    def plot_images(self,
                    save2file=False,
                    fake=True,
                    samples=16,
                    noise=None,
                    step=0):
        filename = 'spec.png'
        if fake:
            if noise is None:
                noise = np.random.uniform(-1.0, 1.0, size=[samples, 100])
            else:
                # filename = "mnist_%d.png" % step
                base_filename = "spectrogram_%d" % step
            images = self.generator.predict(noise)
        else:
            X, _ = self.training_generator.__getitem__(0)
            i = np.random.randint(0, X.shape[0], samples)
            images = X[i, :, :, :]

        # plt.figure(figsize=(10, 10))
        for i in range(images.shape[0]):
            filename = "%s_%d.png" % (base_filename, i)
            plt.imshow(
                np.flip(
                    images[i].T.reshape((self.spec_cols, self.spec_length)), 0
                )  # flip the rows, such that in the image the lowest freqs will be down
                ,
                cmap='gray')

            if save2file:
                plt.savefig(filename)
                plt.close('all')