ගුප්ත විසරණ ආකෘති

ගුප්ත විසරණය ආකෘති රූප අවකාශය සහ ගුප්ත අවකාශය අතර සිතියම් ගත කිරීම සඳහා ස්වයංක්රීය එන්කෝඩරයක් භාවිතා කරයි. විසරණ ආකෘතිය සැහැල්ලු අවකාශය මත ක්රියා කරයි, එය පුහුණු කිරීම පහසු කරයි. එය පදනම් වී ඇත්තේ ගුප්ත විසරණ ආකෘති සමඟ කඩදාසි අධි-විභේදන රූප සංශ්ලේෂණය මත ය.

ඔවුන් පෙර පුහුණු කරන ලද ස්වයංක්රීය එන්කෝඩරයක් භාවිතා කරන අතර පෙර පුහුණු කරන ලද ස්වයංක්රීය එන්කෝඩරයේ ගුප්ත අවකාශය මත විසරණය යූ-නෙට් පුහුණු කරයි.

සරල විසරණය ක්රියාත්මක කිරීම සඳහා අපගේ 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_model
46    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: CLIPTextEmbedder
  • unet_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_factor
92        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. - beta

103        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())).device

පෙළ විමසුම් ලැයිස්තුවක් සඳහා CLIP කාවැද්දීම් ලබා ගන්න

113    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)