def Generator(noise_shape, condition_shape, output_shape, final_size, latent_shape=64, base_filters=512, min_filters=8): # Initial Layers condition_input = Input(condition_shape) condition_latent = Dense(units=latent_shape)(condition_input) condition_latent = Activation('relu')(condition_latent) condition_latent = Reshape()(condition_latent) condition_model = Model(inputs=condition_input, outputs=condition_latent) noise_input = Input(noise_shape) noise_latent = Dense(units=latent_shape)(noise_input) noise_latent = Activation('relu')(noise_latent) noise_latent = Reshape()(noise_latent) noise_model = Model(inputs=noise_input, outputs=noise_latent) filters = base_filters gen = condition_model.output noise = noise_model.output for i in range(int(np.log2(final_size / 4))): gen = concatenate([gen, noise]) gen = Conv2D(filters, kernel_size=3, strides=1)(gen) gen = Activation('relu')(gen) gen = Conv2D(filters, kernel_size=3, strides=1)(gen) gen = Activation('relu')(gen) gen = UpSampling2D()(gen) noise = UpSampling2D()(noise) filters = int(filters / 2) if filters > min_filters else filters gen = Conv2D(output_shape, kernel_size=1, strides=1)(gen) gen = Activation('linear')(gen) G = Model(inputs=[noise_model.input, condition_model.input], outputs=gen, name='Generator') return G