ගුප්ත විසරණය ආකෘති රූප අවකාශය සහ ගුප්ත අවකාශය අතර සිතියම් ගත කිරීම සඳහා ස්වයංක්රීය එන්කෝඩරයක් භාවිතා කරයි. විසරණ ආකෘතිය සැහැල්ලු අවකාශය මත ක්රියා කරයි, එය පුහුණු කිරීම පහසු කරයි. එය පදනම් වී ඇත්තේ ගුප්ත විසරණ ආකෘති සමඟ කඩදාසි අධි-විභේදන රූප සංශ්ලේෂණය මත ය.
ඔවුන් පෙර පුහුණු කරන ලද ස්වයංක්රීය එන්කෝඩරයක් භාවිතා කරන අතර පෙර පුහුණු කරන ලද ස්වයංක්රීය එන්කෝඩරයේ ගුප්ත අවකාශය මත විසරණය යූ-නෙට් පුහුණු කරයි.
සරල විසරණය ක්රියාත්මක කිරීම සඳහා අපගේ DDPM ක්රියාත්මක කිරීම වෙත යොමු වන්න. කාලසටහන් ආදිය සඳහා අපි එකම අංකන භාවිතා කරමු.
24from typing import List
25
26import torch
27import torch.nn as nn
28
29from labml_nn.diffusion.stable_diffusion.model.autoencoder import Autoencoder
30from labml_nn.diffusion.stable_diffusion.model.clip_embedder import CLIPTextEmbedder
31from labml_nn.diffusion.stable_diffusion.model.unet import UNetModelමෙය යූ-නෙට් වටා හිස් දවටන පන්තියකි. චෙක්පොයින්ට් බර පැහැදිලිව සිතියම් ගත කිරීමට අවශ්ය නොවන පරිදි කොම්විස්/ස්ථාවර විසරණය හා සමාන ආකෘති ව්යුහයක් තිබීම සඳහා අපි මෙය තබා ගනිමු.
34class DiffusionWrapper(nn.Module):42 def __init__(self, diffusion_model: UNetModel):
43 super().__init__()
44 self.diffusion_model = diffusion_model46 def forward(self, x: torch.Tensor, time_steps: torch.Tensor, context: torch.Tensor):
47 return self.diffusion_model(x, time_steps, context)පහත සඳහන් සංරචක අඩංගු වේ:
50class LatentDiffusion(nn.Module):60 model: DiffusionWrapper
61 first_stage_model: Autoencoder
62 cond_stage_model: CLIPTextEmbedderunet_model
ගුප්ත අවකාශයේ ශබ්දය පුරෝකථනය කරන යූ-නෙට් යautoencoder
මෙම ස්වයං ආකේතකය වේclip_embedder
CLIP කාවැද්දීම් උත්පාදක යන්ත්රයlatent_scaling_factor
ගුප්ත අවකාශය සඳහා පරිමාණ සාධකය වේ. යූ-නෙට් වෙත පෝෂණය කිරීමට පෙර ඔටෝඑන්කෝඩරයේ කේතීකරණ මේ මගින් පරිමාණය කරනු ලැබේ.n_steps
යනු විසරණය කිරීමේ පියවර ගණන වේ.linear_start
කාලසටහනේ ආරම්භය වේ.linear_end
කාලසටහනේ අවසානයයි.64 def __init__(self,
65 unet_model: UNetModel,
66 autoencoder: Autoencoder,
67 clip_embedder: CLIPTextEmbedder,
68 latent_scaling_factor: float,
69 n_steps: int,
70 linear_start: float,
71 linear_end: float,
72 ):84 super().__init__()87 self.model = DiffusionWrapper(unet_model)ස්වයංක්රීය එන්කෝඩරය සහ පරිමාණ සාධකය
89 self.first_stage_model = autoencoder
90 self.latent_scaling_factor = latent_scaling_factor92 self.cond_stage_model = clip_embedderපියවර ගණන
95 self.n_steps = n_stepsකාලසටහන
98 beta = torch.linspace(linear_start ** 0.5, linear_end ** 0.5, n_steps, dtype=torch.float64) ** 2
99 self.beta = nn.Parameter(beta.to(torch.float32), requires_grad=False)101 alpha = 1. - beta103 alpha_bar = torch.cumprod(alpha, dim=0)
104 self.alpha_bar = nn.Parameter(alpha_bar.to(torch.float32), requires_grad=False)106 @property
107 def device(self):111 return next(iter(self.model.parameters())).device113 def get_text_conditioning(self, prompts: List[str]):117 return self.cond_stage_model(prompts)එන්කෝඩර් ප්රතිදානය බෙදා හැරීමකි. අපි එයින් නියැදි කර පරිමාණය කිරීමේ සාධකය මගින් ගුණ කරමු.
119 def autoencoder_encode(self, image: torch.Tensor):126 return self.latent_scaling_factor * self.first_stage_model.encode(image).sample()128 def autoencoder_decode(self, z: torch.Tensor):134 return self.first_stage_model.decode(z / self.latent_scaling_factor)136 def forward(self, x: torch.Tensor, t: torch.Tensor, context: torch.Tensor):145 return self.model(x, t, context)