import numpy
import tensorflow
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
from SynDataGen.Engine.Models.Diffusion.DiffusionModelUnet import UNetModel
from SynDataGen.Engine.Algorithms.Diffusion.AlgorithmDiffusion import DiffusionModel
from SynDataGen.Engine.Algorithms.Diffusion.GaussianDiffusion import GaussianDiffusion
from SynDataGen.Engine.Models.Diffusion.VariationalAutoencoderModel import VariationalModelDiffusion
from SynDataGen.Engine.Algorithms.Diffusion.AlgorithmVariationalAutoencoderDiffusion import VariationalAlgorithmDiffusion
number_samples_per_class = {
"classes": {1: 100, 2: 200, 3: 150},
"number_classes": 3
}
input_shape = (1200, )
# Initialize UNet models
first_instance_unet = UNetModel(
embedding_dimension=128,
embedding_channels=1,
list_neurons_per_level=[1, 2, 4],
list_attentions=[False,True, True],
number_residual_blocks=2,
normalization_groups=1,
intermediary_activation_function='swish',
intermediary_activation_alpha=0.05,
last_layer_activation='linear',
number_samples_per_class=number_samples_per_class
)
second_instance_unet = UNetModel(
embedding_dimension=128,
embedding_channels=1,
list_neurons_per_level=[1, 2, 4],
list_attentions=[False, False, True, True],
number_residual_blocks=2,
normalization_groups=1,
intermediary_activation_function='swish',
intermediary_activation_alpha=0.05,
last_layer_activation='linear',
number_samples_per_class=number_samples_per_class
)
# Initialize Gaussian Diffusion
gaussian_diffusion_util = GaussianDiffusion(
beta_start=1e-4,
beta_end=0.02,
time_steps=1000,
clip_min=-1.0,
clip_max=1.0
)
# Initialize Variational Autoencoder
variation_model_diffusion = VariationalModelDiffusion(
latent_dimension=128,
output_shape=input_shape,
activation_function='swish',
initializer_mean=0.0,
initializer_deviation=0.02,
dropout_decay_encoder=0.2,
dropout_decay_decoder=0.4,
last_layer_activation='sigmoid',
number_neurons_encoder=[128, 64],
number_neurons_decoder=[64, 128],
dataset_type=numpy.float32,
number_samples_per_class=number_samples_per_class
)
# Initialize Diffusion Algorithm
diffusion_algorithm = DiffusionModel(
first_unet_model=first_instance_unet.build_model(),
second_unet_model=second_instance_unet.build_model(),
encoder_model_image=variation_model_diffusion.get_encoder(),
decoder_model_image=variation_model_diffusion.get_decoder(),
gdf_util=gaussian_diffusion_util,
optimizer_autoencoder=Adam(learning_rate=0.0002),
optimizer_diffusion=Adam(learning_rate=0.0002),
time_steps=1000,
ema=0.9999,
margin=0.001,
embedding_dimension=128
)
# Train and generate samples
diffusion_algorithm.compile(loss='mse', optimizer=Adam(learning_rate=0.002))
data_embedding = variation_model_diffusion.create_embedding([x_real_samples, to_categorical(y_real_samples)])
diffusion_algorithm.fit(data_embedding, epochs=1000, batch_size=32)
samples = diffusion_algorithm.get_samples(number_samples_per_class)