GAN (Ģeneratīvais pretrunu tīkls) ir progresīva pieeja ģeneratīvai modelēšanai dziļās mācīšanās ietvaros, bieži izmantojot tādas arhitektūras kā konvolucionālie neironu tīkli . Ģeneratīvās modelēšanas mērķis ir autonomi identificēt ievades datu modeļus, ļaujot modelim radīt jaunus piemērus, kas līdzinās oriģinālajai datu kopai.
Šajā rakstā ir aprakstīts viss, kas jums jāzina GAN, GAN arhitektūra, GAN darbība un GAN modeļu veidi utt.
Satura rādītājs
- Kas ir ģeneratīvs pretrunīgs tīkls?
- GAN veidi
- GAN arhitektūra
- Kā darbojas GAN?
- GAN ieviešana
- Ģeneratīvo pretrunīgo tīklu (GAN) pielietošana
- GAN priekšrocības
- GAN trūkumi
- GAN (ģeneratīvais pretrunīgs tīkls) — FAQ
Kas ir ģeneratīvs pretrunīgs tīkls?
Ģeneratīvie pretrunīgie tīkli (GAN) ir spēcīga neironu tīklu klase, ko izmanto mācīšanās bez uzraudzības . GAN sastāv no diviem neironu tīkli , diskriminators un ģenerators. Viņi izmanto pretrunīgu apmācību, lai iegūtu mākslīgus datus, kas ir identiski faktiskajiem datiem.
- Ģenerators mēģina apmānīt diskriminatoru, kura uzdevums ir precīzi nošķirt radītos datus un patiesos datus, radot nejaušus trokšņu paraugus.
- Šīs konkurences mijiedarbības rezultātā tiek iegūti reālistiski augstas kvalitātes paraugi, kas virza abus tīklus uz attīstību.
- GAN ir izrādījušies ļoti daudzpusīgi mākslīgā intelekta rīki, par ko liecina to plašā izmantošana attēlu sintēzē, stila pārsūtīšanā un teksta-attēlu sintēzē.
- Viņi ir arī mainījuši ģeneratīvo modelēšanu.
Izmantojot pretrunīgu apmācību, šie modeļi iesaistās konkurējošā mijiedarbībā, līdz ģenerators kļūst prasmīgs reālistisku paraugu veidošanā, apmānot diskriminētāju aptuveni pusi laika.
Ģeneratīvos pretrunīgos tīklus (GAN) var iedalīt trīs daļās:
- Ģeneratīvs: Apgūt ģeneratīvo modeli, kas apraksta, kā dati tiek ģenerēti, izmantojot varbūtības modeli.
- Pretēja: Vārds sacīkstes attiecas uz vienas lietas nostādīšanu pret citu. Tas nozīmē, ka GAN kontekstā ģeneratīvais rezultāts tiek salīdzināts ar faktiskajiem attēliem datu kopā. Mehānisms, kas pazīstams kā diskriminators, tiek izmantots, lai piemērotu modeli, kas mēģina atšķirt reālus un viltus attēlus.
- Tīkli: Apmācības nolūkos izmantojiet dziļos neironu tīklus kā mākslīgā intelekta (AI) algoritmus.
GAN veidi
- Vaniļas GAN: Šis ir vienkāršākais GAN veids. Šeit ģenerators un diskriminators ir vienkārši pamata elementi daudzslāņu perceptroni . Vaniļas GAN algoritms ir patiešām vienkāršs, tas mēģina optimizēt matemātisko vienādojumu, izmantojot stohastiskā gradienta nolaišanās.
- Nosacīta GAN (CGAN): CGAN var raksturot kā a dziļa mācīšanās metode, kurā tiek ieviesti daži nosacījuma parametri .
- CGAN ģeneratoram tiek pievienots papildu parametrs “y”, lai ģenerētu atbilstošos datus.
- Etiķetes tiek ievietotas arī Diskriminatora ievadē, lai Diskriminators palīdzētu atšķirt reālos datus no viltotiem ģenerētajiem datiem.
- Deep Convolutional GAN (DCGAN): DCGAN ir viena no populārākajām un arī veiksmīgākajām GAN ieviešanām. Tas sastāv no ConvNets vietā daudzslāņu perceptroni .
- ConvNets tiek ieviests bez maksimālās apvienošanas, kas faktiski tiek aizstāts ar konvolucionālo soli.
- Arī slāņi nav pilnībā savienoti.
- Laplasijas piramīda GAN (LAPGAN): The Laplasijas piramīda ir lineārs invertējams attēla attēlojums, kas sastāv no frekvenču joslas attēlu kopas, kas izvietotas oktāvas attālumā, kā arī zemas frekvences atlikuma.
- Šī pieeja izmanto vairākus Generator un Discriminator tīklus un dažādi Laplasijas piramīdas līmeņi.
- Šo pieeju galvenokārt izmanto, jo tā rada ļoti augstas kvalitātes attēlus. Attēla paraugs vispirms tiek samazināts katrā piramīdas slānī un pēc tam atkal tiek palielināts katrā slānī atpakaļgaitā, kur attēls iegūst zināmu troksni no nosacītās GAN šajos slāņos, līdz tas sasniedz sākotnējo izmēru.
- Super Izšķirtspēja GAN (SRGAN): SRGAN kā norāda nosaukums, ir veids, kā izveidot GAN, kurā a dziļais neironu tīkls tiek izmantots kopā ar pretrunīgu tīklu, lai iegūtu augstākas izšķirtspējas attēlus. Šis GAN veids ir īpaši noderīgs, lai optimāli palielinātu sākotnējos zemas izšķirtspējas attēlus, lai uzlabotu to detaļas, tādējādi samazinot kļūdas.
GAN arhitektūra
Ģeneratīvais pretrunīgais tīkls (GAN) sastāv no divām galvenajām daļām, kas ir ģenerators un diskriminators.
Ģeneratora modelis
Galvenais elements, kas atbild par jaunu, precīzu datu izveidi ģeneratīvajā pretrunā tīklā (GAN), ir ģeneratora modelis. Ģenerators izmanto nejaušu troksni kā ievadi un pārvērš to sarežģītos datu paraugos, piemēram, tekstā vai attēlos. To parasti attēlo kā dziļu neironu tīklu.
Apmācības datu pamatā esošais sadalījums tiek tverts apgūstamo parametru slāņos, veidojot apmācību. Ģenerators pielāgo savu izvadi, lai radītu paraugus, kas precīzi atdarina reālus datus, kad tas tiek apmācīts, izmantojot atpakaļpavairošanu, lai precizētu tā parametrus.
Ģeneratora spēja ģenerēt augstas kvalitātes, daudzveidīgus paraugus, kas var apmānīt diskriminētāju, padara to veiksmīgu.
Ģeneratora zudums
Ģeneratora mērķis GAN ir radīt sintētiskos paraugus, kas ir pietiekami reālistiski, lai apmānītu diskriminētāju. Ģenerators to panāk, samazinot tā zudumu funkciju
kur,
J_G izmērīt, cik labi ģenerators maldina diskriminētāju.- žurnāls
D(G(z_i) ) atspoguļo logaritmisko varbūtību, ka diskriminators ir pareizs ģenerētajiem paraugiem. - Ģeneratora mērķis ir samazināt šos zaudējumus, mudinot ražot paraugus, kurus diskriminators klasificē kā reālus
(log D(G(z_i)) , tuvu 1.
Diskriminatora modelis
Mākslīgais neironu tīkls, ko sauc par diskriminatora modeli, tiek izmantots ģeneratīvajos pretrunīgos tīklos (GAN), lai atšķirtu ģenerēto un faktisko ievadi. Novērtējot ievades paraugus un piešķirot autentiskuma varbūtību, diskriminators darbojas kā binārais klasifikators.
Laika gaitā diskriminētājs iemācās atšķirt patiesos datus no datu kopas un mākslīgiem paraugiem, ko izveidojis ģenerators. Tas ļauj tai pakāpeniski uzlabot parametrus un paaugstināt prasmes līmeni.
Konvolūcijas slāņi vai citām modalitātēm atbilstošas struktūras parasti tiek izmantotas tās arhitektūrā, strādājot ar attēla datiem. Sacensību apmācības procedūras mērķis ir maksimāli palielināt diskriminatora spēju precīzi identificēt ģenerētos paraugus kā krāpnieciskus un īstus paraugus kā autentiskus. Ģeneratora un diskriminatora mijiedarbības rezultātā diskriminators kļūst arvien diskriminējošāks, kas palīdz GAN kopumā radīt ārkārtīgi reālistiskus sintētiskos datus.
Diskriminatora zaudējums
Diskriminators samazina negatīvo žurnāla varbūtību pareizi klasificēt gan ražotos, gan reālos paraugus. Šis zaudējums stimulē diskriminatoru precīzi klasificēt ģenerētos paraugus kā viltotus un īstus paraugus ar šādu vienādojumu:
J_D novērtē diskriminētāja spēju atšķirt saražotos un faktiskos paraugus.- Žurnāla iespējamība, ka diskriminētājs precīzi klasificēs reālos datus, tiek attēlota ar
logD(x_i) . - Žurnāla iespēja, ka diskriminētājs pareizi klasificēs ģenerētos paraugus kā viltotus, tiek attēlota ar
log(1-D(G(z_i))) . - Diskriminatora mērķis ir samazināt šos zaudējumus, precīzi identificējot mākslīgos un reālos paraugus.
MinMax zaudējums
Ģeneratīvā pretrunīgā tīklā (GAN) minimālā maksimālā zuduma formulu nodrošina:
kur,
- G ir ģeneratoru tīkls un D ir diskriminācijas tīkls
- Faktisko datu paraugi, kas iegūti no patiesā datu sadalījuma
p_{data}(x) ir attēloti ar x. - Nejaušs trokšņa paraugs no iepriekšējā sadalījuma
p_z(z) (parasti normāls vai vienmērīgs sadalījums) tiek attēlots ar z. - D(x) apzīmē diskriminētāja iespējamību pareizi identificēt faktiskos datus kā reālus.
- D(G(z)) ir iespējamība, ka diskriminators identificēs ģenerētos datus, kas nāk no ģeneratora, kā autentiskus.

Kā darbojas GAN?
GAN darbības soļi:
- Inicializācija: Tiek izveidoti divi neironu tīkli: ģenerators (G) un diskriminators (D).
- G uzdevums ir izveidot jaunus datus, piemēram, attēlus vai tekstu, kas ļoti līdzinās reāliem datiem.
- D darbojas kā kritiķis, mēģinot atšķirt reālos datus (no apmācības datu kopas) un G ģenerētos datus.
- Ģeneratora pirmais gājiens: G kā ievadi izmanto nejaušu trokšņu vektoru. Šis trokšņu vektors satur nejaušas vērtības un darbojas kā G izveides procesa sākumpunkts. Izmantojot iekšējos slāņus un apgūtos modeļus, G pārveido trokšņu vektoru jaunā datu paraugā, piemēram, ģenerētā attēlā.
- Diskriminatora gājiens: D saņem divu veidu ievades:
- Reāli datu paraugi no apmācības datu kopas.
- Datu paraugi, ko G ģenerēja iepriekšējā darbībā. D uzdevums ir analizēt katru ievadi un noteikt, vai tie ir reāli dati vai kaut kas, ko G ir sagatavojis. Tas izvada varbūtības rādītāju no 0 līdz 1. Vērtējums 1 norāda, ka dati, visticamāk, ir patiesi, un 0 norāda, ka tie ir viltoti.
- Mācību process: Tagad nāk pretrunīgā daļa:
- Ja D pareizi identificē reālus datus kā reālus (rezultāts tuvu 1) un ģenerētos datus kā viltus (rezultāts tuvu 0), gan G, gan D tiek apbalvoti nelielā mērā. Tas ir tāpēc, ka viņi abi labi veic savu darbu.
- Tomēr galvenais ir nepārtraukti uzlaboties. Ja D konsekventi visu identificē pareizi, tas neko daudz neuzzinās. Tātad mērķis ir, lai G galu galā piemānītu D.
- Ģeneratora uzlabojumi:
- Ja D kļūdaini atzīmē G radīšanu kā īstu (rezultāts tuvu 1), tā ir zīme, ka G ir uz pareizā ceļa. Šajā gadījumā G saņem nozīmīgu pozitīvu atjauninājumu, savukārt D saņem sodu par apmānīšanu.
- Šīs atsauksmes palīdz G uzlabot ģenerēšanas procesu, lai izveidotu reālistiskākus datus.
- Diskriminatora adaptācija:
- Un otrādi, ja D pareizi identificē G viltotos datus (rezultāts ir tuvu 0), bet G nesaņem atlīdzību, D tiek vēl vairāk nostiprināta savās diskriminācijas spējās.
- Šis notiekošais duelis starp G un D laika gaitā uzlabo abus tīklus.
Treniņam progresējot, G kļūst labāk ģenerējot reālistiskus datus, tāpēc D ir grūtāk noteikt atšķirību. Ideālā gadījumā G kļūst tik prasmīgs, ka D nevar droši atšķirt īstus datus no viltotiem. Šajā brīdī G tiek uzskatīts par labi apmācītu, un to var izmantot jaunu, reālistisku datu paraugu ģenerēšanai.
atrodiet bloķētos numurus operētājsistēmā Android
Ģeneratīvā pretrunīgā tīkla (GAN) ieviešana
Mēs sekosim un sapratīsim darbības, lai saprastu, kā tiek ieviests GAN:
1. darbība: nepieciešamo bibliotēku importēšana
Python3
import> torch> import> torch.nn as nn> import> torch.optim as optim> import> torchvision> from> torchvision>import> datasets, transforms> import> matplotlib.pyplot as plt> import> numpy as np> # Set device> device>=> torch.device(>'cuda'> if> torch.cuda.is_available()>else> 'cpu'>)> |
For training on the CIFAR-10 image dataset, this PyTorch module creates a Generative Adversarial Network (GAN), switching between generator and discriminator training. Visualization of the generated images occurs every tenth epoch, and the development of the GAN is tracked. Step 2: Defining a TransformThe code uses PyTorch’s transforms to define a simple picture transforms.Compose. It normalizes and transforms photos into tensors. Python3 # Define a basic transform transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) Step 3: Loading the Dataset A CIFAR-10 dataset is created for training with below code, which also specifies a root directory, turns on train mode, downloads if needed, and applies the specified transform. Subsequently, it generates a 32-batch DataLoader and shuffles the training set of data. Python3 train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) Step 4: Defining parameters to be used in later processes A Generative Adversarial Network (GAN) is used with specified hyperparameters. The latent space’s dimensionality is represented by latent_dim. lr is the optimizer’s learning rate. The coefficients for the Adam optimizer are beta1 and beta2. To find the total number of training epochs, use num_epochs. Python3 # Hyperparameters latent_dim = 100 lr = 0.0002 beta1 = 0.5 beta2 = 0.999 num_epochs = 10 Step 5: Defining a Utility Class to Build the Generator The generator architecture for a GAN in PyTorch is defined with below code. From nn.Module , the Generator class inherits. It is comprised of a sequential model with Tanh, linear, convolutional, batch normalization, reshaping, and upsampling layers. The neural network synthesizes an image (img) from a latent vector (z), which is the generator’s output. The architecture uses a series of learned transformations to turn the initial random noise in the latent space into a meaningful image. Python3 # Define the generator class Generator(nn.Module): def __init__(self, latent_dim): super(Generator, self).__init__() self.model = nn.Sequential( nn.Linear(latent_dim, 128 * 8 * 8), nn.ReLU(), nn.Unflatten(1, (128, 8, 8)), nn.Upsample(scale_factor=2), nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.BatchNorm2d(128, momentum=0.78), nn.ReLU(), nn.Upsample(scale_factor=2), nn.Conv2d(128, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64, momentum=0.78), nn.ReLU(), nn.Conv2d(64, 3, kernel_size=3, padding=1), nn.Tanh() ) def forward(self, z): img = self.model(z) return img Step 6: Defining a Utility Class to Build the Discriminator The PyTorch code describes the discriminator architecture for a GAN. The class Discriminator is descended from nn.Module. It is composed of linear layers, batch normalization, dropout , convolutional, LeakyReLU , and sequential layers. An image (img) is the discriminator’s input, and its validity—the probability that the input image is real as opposed to artificial—is its output. Python3 # Define the discriminator class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.model = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1), nn.LeakyReLU(0.2), nn.Dropout(0.25), nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1), nn.ZeroPad2d((0, 1, 0, 1)), nn.BatchNorm2d(64, momentum=0.82), nn.LeakyReLU(0.25), nn.Dropout(0.25), nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1), nn.BatchNorm2d(128, momentum=0.82), nn.LeakyReLU(0.2), nn.Dropout(0.25), nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(256, momentum=0.8), nn.LeakyReLU(0.25), nn.Dropout(0.25), nn.Flatten(), nn.Linear(256 * 5 * 5, 1), nn.Sigmoid() ) def forward(self, img): validity = self.model(img) return validity Step 7: Building the Generative Adversarial Network The code snippet defines and initializes a discriminator (Discriminator) and a generator (Generator). The designated device (GPU if available) receives both models. Binary Cross Entropy Loss, which is frequently used for GANs, is selected as the loss function (adversarial_loss). For the generator (optimizer_G) and discriminator (optimizer_D), distinct Adam optimizers with predetermined learning rates and betas are also defined. Python3 # Define the generator and discriminator # Initialize generator and discriminator generator = Generator(latent_dim).to(device) discriminator = Discriminator().to(device) # Loss function adversarial_loss = nn.BCELoss() # Optimizers optimizer_G = optim.Adam(generator.parameters() , lr=lr, betas=(beta1, beta2)) optimizer_D = optim.Adam(discriminator.parameters() , lr=lr, betas=(beta1, beta2)) Step 8: Training the Generative Adversarial Network For a Generative Adversarial Network (GAN), the code implements the training loop. The training data batches are iterated through during each epoch. Whereas the generator (optimizer_G) is trained to generate realistic images that trick the discriminator, the discriminator (optimizer_D) is trained to distinguish between real and phony images. The generator and discriminator’s adversarial losses are computed. Model parameters are updated by means of Adam optimizers and the losses are backpropagated. Discriminator printing and generator losses are used to track progress. For a visual assessment of the training process, generated images are additionally saved and shown every 10 epochs. Python3 # Training loop for epoch in range(num_epochs): for i, batch in enumerate(dataloader): # Convert list to tensor real_images = batch[0].to(device) # Adversarial ground truths valid = torch.ones(real_images.size(0), 1, device=device) fake = torch.zeros(real_images.size(0), 1, device=device) # Configure input real_images = real_images.to(device) # --------------------- # Train Discriminator # --------------------- optimizer_D.zero_grad() # Sample noise as generator input z = torch.randn(real_images.size(0), latent_dim, device=device) # Generate a batch of images fake_images = generator(z) # Measure discriminator's ability # to classify real and fake images real_loss = adversarial_loss(discriminator (real_images), valid) fake_loss = adversarial_loss(discriminator (fake_images.detach()), fake) d_loss = (real_loss + fake_loss) / 2 # Backward pass and optimize d_loss.backward() optimizer_D.step() # ----------------- # Train Generator # ----------------- optimizer_G.zero_grad() # Generate a batch of images gen_images = generator(z) # Adversarial loss g_loss = adversarial_loss(discriminator(gen_images), valid) # Backward pass and optimize g_loss.backward() optimizer_G.step() # --------------------- # Progress Monitoring # --------------------- if (i + 1) % 100 == 0: print( f'Epoch [{epoch+1}/{num_epochs}] Batch {i+1}/{len(dataloader)} ' f'Discriminator Loss: {d_loss.item():.4f} ' f'Generator Loss: {g_loss.item():.4f}' ) # Save generated images for every epoch if (epoch + 1) % 10 == 0: with torch.no_grad(): z = torch.randn(16, latent_dim, device=device) generated = generator(z).detach().cpu() grid = torchvision.utils.make_grid(generated, nrow=4, normalize=True) plt.imshow(np.transpose(grid, (1, 2, 0))) plt.axis('off') plt.show() Output: Epoch [10/10] Batch 1300/1563 Discriminator Loss: 0.4473 Generator Loss: 0.9555 Epoch [10/10] Batch 1400/1563 Discriminator Loss: 0.6643 Generator Loss: 1.0215 Epoch [10/10] Batch 1500/1563 Discriminator Loss: 0.4720 Generator Loss: 2.5027 GAN Output Application Of Generative Adversarial Networks (GANs)GANs, or Generative Adversarial Networks, have many uses in many different fields. Here are some of the widely recognized uses of GANs: Image Synthesis and Generation : GANs are often used for picture synthesis and generation tasks, They may create fresh, lifelike pictures that mimic training data by learning the distribution that explains the dataset. The development of lifelike avatars, high-resolution photographs, and fresh artwork have all been facilitated by these types of generative networks. Image-to-Image Translation : GANs may be used for problems involving image-to-image translation, where the objective is to convert an input picture from one domain to another while maintaining its key features. GANs may be used, for instance, to change pictures from day to night, transform drawings into realistic images, or change the creative style of an image. Text-to-Image Synthesis : GANs have been used to create visuals from descriptions in text. GANs may produce pictures that translate to a description given a text input, such as a phrase or a caption. This application might have an impact on how realistic visual material is produced using text-based instructions. Data Augmentation : GANs can augment present data and increase the robustness and generalizability of machine-learning models by creating synthetic data samples. Data Generation for Training : GANs can enhance the resolution and quality of low-resolution images. By training on pairs of low-resolution and high-resolution images, GANs can generate high-resolution images from low-resolution inputs, enabling improved image quality in various applications such as medical imaging, satellite imaging, and video enhancement.Advantages of GANThe advantages of the GANs are as follows: Synthetic data generation : GANs can generate new, synthetic data that resembles some known data distribution, which can be useful for data augmentation, anomaly detection, or creative applications. High-quality results : GANs can produce high-quality, photorealistic results in image synthesis, video synthesis, music synthesis, and other tasks. Unsupervised learning : GANs can be trained without labeled data, making them suitable for unsupervised learning tasks, where labeled data is scarce or difficult to obtain. Versatility : GANs can be applied to a wide range of tasks, including image synthesis, text-to-image synthesis, image-to-image translation, anomaly detection , The disadvantages of the GANs are as follows: Training Instability : GANs can be difficult to train, with the risk of instability, mode collapse, or failure to converge. Computational Cost : GANs can require a lot of computational resources and can be slow to train, especially for high-resolution images or large datasets. Overfitting : GANs can overfit the training data, producing synthetic data that is too similar to the training data and lacking diversity. Bias and Fairness : GANs can reflect the biases and unfairness present in the training data, leading to discriminatory or biased synthetic data. Interpretability and Accountability : GANs can be opaque and difficult to interpret or explain, making it challenging to ensure accountability, transparency, or fairness in their applications.GAN(Generative Adversarial Network)- FAQs Q1. What is a Generative Adversarial Network(GAN)?An artificial intelligence model known as a GAN is made up of two neural networks—a discriminator and a generator—that were developed in tandem using adversarial training. The discriminator assesses the new data instances for authenticity, while the generator produces new ones. Q2. What are the main applications of GAN?Generating images and videos, transferring styles, enhancing data, translating images to other images, producing realistic synthetic data for machine learning model training, and super-resolution are just a few of the many uses for GANs. Q3. What challenges do GAN face?GANs encounter difficulties such training instability, mode collapse (when the generator generates a limited range of samples), and striking the correct balance between the discriminator and generator. It’s frequently necessary to carefully build the model architecture and tune the hyperparameters. Q4. How are GAN evaluated?The produced samples’ quality, diversity, and resemblance to real data are the main criteria used to assess GANs. For quantitative assessment, metrics like the Fréchet Inception Distance (FID) and Inception Score are frequently employed. Q5. Can GAN be used for tasks other than image generation ?Yes, different tasks can be assigned to GANs. Text, music, 3D models, and other things have all been generated with them. The usefulness of conditional GANs is expanded by enabling the creation of specific content under certain input conditions. Q6. What are some famous architectures of GANs ?A few well-known GAN architectures are Progressive GAN (PGAN), Wasserstein GAN (WGAN), Conditional GAN (cGAN), Deep Convolutional GAN (DCGAN), and Vanilla GAN. Each has special qualities and works best with particular kinds of data and tasks.>