docs/si/gan/stylegan/experiment.html
සඳහාපුහුණු කේතය මෙයයි StyleGan 2 ආකෘතිය.
මේවා80K පියවර සඳහා පුහුණුවෙන් පසු ජනනය කරන ලද 64×64 රූප වේ.
අපගේක්රියාත්මක කිරීම අවම වේ StyleGAN 2 ආදර්ශ පුහුණු කේතය. ක්රියාත්මක කිරීම සරල ලෙස තබා ගැනීම සඳහා සහාය වන්නේ තනි GPU පුහුණුවක් පමණි. පුහුණු ලූපය ඇතුළුව කේත පේළි 500 කට වඩා අඩු මට්ටමක තබා ගැනීම සඳහා එය හැකිලීමට අපට හැකි විය.
ඩීඩීපී(බෙදා හරින ලද දත්ත සමාන්තරව) සහ බහු-gpu පුහුණුව නොමැතිව විශාල විභේදන (128+) සඳහා ආකෘතිය පුහුණු කිරීමට නොහැකි වනු ඇත. ඔබට fp16 සහ DDP සමඟ පුහුණු කේතය අවශ්ය නම් ලුසිඩ්රයිව්/ස්ටයිලෙගන්2-පයිටෝච්දෙස බලන්න.
අපිමෙය සෙලෙබා-එච්කියු දත්ත කට්ටලයමත පුහුණු කළෙමු. fast.ai හි මෙම සාකච්ඡාවේදීබාගත කිරීමේ උපදෙස් ඔබට සොයාගත හැකිය. data/stylegan ෆෝල්ඩරයතුළ පින්තූර සුරකින්න.
31importmath32frompathlibimportPath33fromtypingimportIterator,Tuple3435importtorch36importtorch.utils.data37importtorchvision38fromPILimportImage3940fromlabmlimporttracker,lab,monit,experiment41fromlabml.configsimportBaseConfigs42fromlabml\_helpers.deviceimportDeviceConfigs43fromlabml\_helpers.train\_validimportModeState,hook\_model\_outputs44fromlabml\_nn.gan.styleganimportDiscriminator,Generator,MappingNetwork,GradientPenalty,PathLengthPenalty45fromlabml\_nn.gan.wassersteinimportDiscriminatorLoss,GeneratorLoss46fromlabml\_nn.utilsimportcycle\_dataloader
මෙයපුහුණු දත්ත කට්ටලය පටවන අතර එය ලබා දෙන රූපයේ ප්රමාණයට වෙනස් කරයි.
49classDataset(torch.utils.data.Dataset):
path පින්තූර අඩංගු ෆෝල්ඩරයට යන මාර්ගයimage_size රූපයේ ප්රමාණය56def\_\_init\_\_(self,path:str,image\_size:int):
61super().\_\_init\_\_()
සියලුම jpg ලිපිගොනු වල මාර්ග ලබා ගන්න
64self.paths=[pforpinPath(path).glob(f'\*\*/\*.jpg')]
පරිවර්තනය
67self.transform=torchvision.transforms.Compose([
රූපයවෙනස් කරන්න
69torchvision.transforms.Resize(image\_size),
PyTorchටෙන්සරය බවට පරිවර්තනය කරන්න
71torchvision.transforms.ToTensor(),72])
රූපගණන
74def\_\_len\_\_(self):
76returnlen(self.paths)
index -th රූපය ලබා ගන්න
78def\_\_getitem\_\_(self,index):
80path=self.paths[index]81img=Image.open(path)82returnself.transform(img)
85classConfigs(BaseConfigs):
ආකෘතියපුහුණු කිරීමේ උපකරණය. DeviceConfigs ලබා ගත හැකි CUDA උපාංගයක් අහුලනවා හෝ CPU කිරීමට පෙරනිමි.
93device:torch.device=DeviceConfigs()
96discriminator:Discriminator
98generator:Generator
100mapping\_network:MappingNetwork
වෙනස්කම්කරන්නා සහ උත්පාදක නැතිවීමේ කාර්යයන්. අපි වොසර්ස්ටයින් නැතිවීම භාවිතා කරමු
104discriminator\_loss:DiscriminatorLoss105generator\_loss:GeneratorLoss
ප්රශස්තකරණය
108generator\_optimizer:torch.optim.Adam109discriminator\_optimizer:torch.optim.Adam110mapping\_network\_optimizer:torch.optim.Adam
Gradient දණ්ඩන නියාමනය අඞු කිරීමට
113gradient\_penalty=GradientPenalty()
ශ්රේණියේදණ්ඩන සංගුණකය γ
115gradient\_penalty\_coefficient:float=10.
118path\_length\_penalty:PathLengthPenalty
දත්තකාරකය
121loader:Iterator
කණ්ඩායම්ප්රමාණය
124batch\_size:int=32
මානයන්හි z සහ w
126d\_latent:int=512
රූපයේඋස/පළල
128image\_size:int=32
සිතියම්කරණජාලයේ ස්ථර ගණන
130mapping\_network\_layers:int=8
උත්පාදකසහ වෙනස්කම් කිරීමේ ඉගෙනුම් අනුපාතය
132learning\_rate:float=1e-3
ජාලඉගෙනුම් අනුපාතය සිතියම්ගත කිරීම (අනෙක් ඒවාට වඩා100× අඩු)
134mapping\_network\_learning\_rate:float=1e-5
මතඵලය අනුක්රමික සමුච්චය කිරීමට පියවර ගණන. Effective ලදායී කණ්ඩායම් ප්රමාණය වැඩි කිරීමට මෙය භාවිතා කරන්න.
136gradient\_accumulate\_steps:int=1
β1 සහ ආදම් ප්රශස්තකරණය β2 සඳහා
138adam\_betas:Tuple[float,float]=(0.0,0.99)
මෝස්තරමිශ්ර කිරීමේ සම්භාවිතාව
140style\_mixing\_prob:float=0.9
මුළුපුහුණු පියවර ගණන
143training\_steps:int=150\_000
උත්පාදකයන්ත්රයේ බ්ලොක් ගණන (රූප විභේදනය මත පදනම්ව ගණනය කරනු ලැබේ)
146n\_gen\_blocks:int
නියාමනයකිරීමේ පාඩු ගණනය කිරීම වෙනුවට, කඩදාසි කම්මැලි නියාමනය යෝජනා කරන අතර එහිදී විධිමත් කිරීමේ නියමයන් වරකට වරක් ගණනය කරනු ලැබේ. මෙය පුහුණු කාර්යක්ෂමතාව වැඩි දියුණු කරයි.
අනුක්රමිකද penalty ුවම ගණනය කළ යුතු කාල සීමාව
154lazy\_gradient\_penalty\_interval:int=4
මාර්ගදිග ද penalty ුවම් ගණනය කිරීමේ පරතරය
156lazy\_path\_penalty\_interval:int=32
පුහුණුවේආරම්භක අදියරේදී මාර්ග දිග ද penalty ුවම ගණනය කිරීම මඟ හරින්න
158lazy\_path\_penalty\_after:int=5\_000
ජනනයකරන ලද පින්තූර ලොග් කරන්නේ කෙසේද?
161log\_generated\_interval:int=500
ආදර්ශමුරපොලවල් සුරැකීමට කොපමණ වාරයක්
163save\_checkpoint\_interval:int=2\_000
ලොග්වීම සක්රිය කිරීම සඳහා පුහුණු මාදිලියේ තත්වය
166mode:ModeState
ආදර්ශස්ථර ප්රතිදානයන් ලොග් කළ යුතුද යන්න
168log\_layer\_outputs:bool=False
අපි මෙය සෙලෙබා-එච්කියු දත්ත කට්ටලය මත පුහුණු කළෙමු. fast.ai හි මෙම සාකච්ඡාවේදීබාගත කිරීමේ උපදෙස් ඔබට සොයාගත හැකිය. data/stylegan ෆෝල්ඩරය තුළ පින්තූර සුරකින්න.
175dataset\_path:str=str(lab.get\_data\_path()/'stylegan2')
177definit(self):
දත්තසමුදාය සාදන්න
182dataset=Dataset(self.dataset\_path,self.image\_size)
දත්තපැටවුම සාදන්න
184dataloader=torch.utils.data.DataLoader(dataset,batch\_size=self.batch\_size,num\_workers=8,185shuffle=True,drop\_last=True,pin\_memory=True)
අඛණ්ඩ චක්රීය කාරකය
187self.loader=cycle\_dataloader(dataloader)
log2 රූප විභේදනයේ
190log\_resolution=int(math.log2(self.image\_size))
වෙනස්කම්කරන්නා සහ උත්පාදක යන්ත්රය සාදන්න
193self.discriminator=Discriminator(log\_resolution).to(self.device)194self.generator=Generator(log\_resolution,self.d\_latent).to(self.device)
ශෛලියසහ ශබ්ද යෙදවුම් නිර්මාණය කිරීම සඳහා උත්පාදක කොටස් ගණන ලබා ගන්න
196self.n\_gen\_blocks=self.generator.n\_blocks
සිතියම්කරණජාලයක් සාදන්න
198self.mapping\_network=MappingNetwork(self.d\_latent,self.mapping\_network\_layers).to(self.device)
මාර්ගදිග ද penalty ුවම් නැතිවීම
200self.path\_length\_penalty=PathLengthPenalty(0.99).to(self.device)
ස්ථරප්රතිදානයන් අධීක්ෂණය කිරීම සඳහා ආදර්ශ කොකු එක් කරන්න
203ifself.log\_layer\_outputs:204hook\_model\_outputs(self.mode,self.discriminator,'discriminator')205hook\_model\_outputs(self.mode,self.generator,'generator')206hook\_model\_outputs(self.mode,self.mapping\_network,'mapping\_network')
වෙනස්කම්කරන්නා සහ උත්පාදක පාඩු
209self.discriminator\_loss=DiscriminatorLoss().to(self.device)210self.generator\_loss=GeneratorLoss().to(self.device)
ප්රශස්තකරණයසාදන්න
213self.discriminator\_optimizer=torch.optim.Adam(214self.discriminator.parameters(),215lr=self.learning\_rate,betas=self.adam\_betas216)217self.generator\_optimizer=torch.optim.Adam(218self.generator.parameters(),219lr=self.learning\_rate,betas=self.adam\_betas220)221self.mapping\_network\_optimizer=torch.optim.Adam(222self.mapping\_network.parameters(),223lr=self.mapping\_network\_learning\_rate,betas=self.adam\_betas224)
ට්රැකර්වින්යාසයන් සකසන්න
227tracker.set\_image("generated",True)
මෙමසාම්පල z අහඹු ලෙස සහ සිතියම්කරණ w ජාලයෙන් ලබා ගන්න.
ඒවගේම අපි ගුප්ත විචල්යයන් දෙකක් ජනනය z1 z2 w1 හා අනුරූප ලබා එහිදී සමහර විට ශෛලිය මිශ්ර අදාළ w2වේ. ඉන්පසු අපි අහඹු ලෙස හරස් ඕවර් ලක්ෂ්යයක් සාම්පල කර හරස් ඕවර් w1 ලක්ෂ්යයට පෙර උත්පාදක කුට්ටි w2 වලට සහ පසුව කුට්ටි වලට අදාළ වෙමු.
229defget\_w(self,batch\_size:int):
මෝස්තරමිශ්ර කරන්න
243iftorch.rand(()).item()\<self.style\_mixing\_prob:
අහඹුහරස් ඕවර් ලක්ෂ්යය
245cross\_over\_point=int(torch.rand(()).item()\*self.n\_gen\_blocks)
නියැදිය z1 සහ z2
247z2=torch.randn(batch\_size,self.d\_latent).to(self.device)248z1=torch.randn(batch\_size,self.d\_latent).to(self.device)
ලබා w1 ගන්න w2
250w1=self.mapping\_network(z1)251w2=self.mapping\_network(z2)
උත්පාදකකුට්ටි w1 සහ සංයුක්ත කිරීම w2 සඳහා පුළුල් කරන්න
253w1=w1[None,:,:].expand(cross\_over\_point,-1,-1)254w2=w2[None,:,:].expand(self.n\_gen\_blocks-cross\_over\_point,-1,-1)255returntorch.cat((w1,w2),dim=0)
මිශ්රනොකර
257else:
නියැදිය z සහ z
259z=torch.randn(batch\_size,self.d\_latent).to(self.device)
ලබා w ගන්න w
261w=self.mapping\_network(z)
උත්පාදකකොටස් w සඳහා පුළුල් කරන්න
263returnw[None,:,:].expand(self.n\_gen\_blocks,-1,-1)
මෙයඑක් එක් උත්පාදක කොටසසඳහා ශබ්දය ජනනය කරයි
265defget\_noise(self,batch\_size:int):
ශබ්දයගබඩා කිරීමට ලැයිස්තුව
272noise=[]
ශබ්දවිභේදනය ආරම්භ වන්නේ 4
274resolution=4
එක්එක් උත්පාදක කොටස සඳහා ශබ්දය ජනනය කරන්න
277foriinrange(self.n\_gen\_blocks):
පළමුකොටස ඇත්තේ එක් 3×3 සංවහනයක් පමණි
279ifi==0:280n1=None
පළමුකැටි ගැසුණු ස්ථරයෙන් පසු එකතු කිරීම සඳහා ශබ්දය ජනනය කරන්න
282else:283n1=torch.randn(batch\_size,1,resolution,resolution,device=self.device)
දෙවනකැටි ගැසුණු ස්ථරයට පසු එකතු කිරීම සඳහා ශබ්දය ජනනය කරන්න
285n2=torch.randn(batch\_size,1,resolution,resolution,device=self.device)
ලැයිස්තුවටශබ්ද ආතතීන් එක් කරන්න
288noise.append((n1,n2))
ඊළඟවාරණයට 2× විභේදනයක් ඇත
291resolution\*=2
ආපසුශබ්ද ආතතීන්
294returnnoise
මෙයඋත්පාදක යන්ත්රය භාවිතයෙන් රූප ජනනය කරයි
296defgenerate\_images(self,batch\_size:int):
ලබාගන්න w
304w=self.get\_w(batch\_size)
ශබ්දයලබා ගන්න
306noise=self.get\_noise(batch\_size)
රූපජනනය කරන්න
309images=self.generator(w,noise)
ආපසුපින්තූර සහ w
312returnimages,w
314defstep(self,idx:int):
වෙනස්කම්කරන්නා පුහුණු කරන්න
320withmonit.section('Discriminator'):
අනුක්රමිකයළි පිහිටුවන්න
322self.discriminator\_optimizer.zero\_grad()
සඳහාඅනුක්රමික සමුච්චය gradient_accumulate_steps
325foriinrange(self.gradient\_accumulate\_steps):
යාවත්කාලීනකිරීම mode . සක්රිය කිරීම ලොග් කළ යුතුද යන්න සකසන්න
327withself.mode.update(is\_log\_activations=(idx+1)%self.log\_generated\_interval==0):
උත්පාදකයන්ත්රයෙන් නියැදි පින්තූර
329generated\_images,\_=self.generate\_images(self.batch\_size)
ජනනයකරන ලද රූප සඳහා වෙනස්කම් කිරීමේ වර්ගීකරණය
331fake\_output=self.discriminator(generated\_images.detach())
දත්තපැටවුමෙන් සැබෑ රූප ලබා ගන්න
334real\_images=next(self.loader).to(self.device)
අපිඵලය අනුක්රමික දඬුවම සඳහා wr. සැබෑ රූප ගණනය කිරීමට අවශ්ය
336if(idx+1)%self.lazy\_gradient\_penalty\_interval==0:337real\_images.requires\_grad\_()
සැබෑරූප සඳහා වෙනස්කම් කිරීමේ වර්ගීකරණය
339real\_output=self.discriminator(real\_images)
වෙනස්කම්කරන්නාගේ පාඩුව ලබා ගන්න
342real\_loss,fake\_loss=self.discriminator\_loss(real\_output,fake\_output)343disc\_loss=real\_loss+fake\_loss
ශ්රේණියේද penalty ුවම එකතු කරන්න
346if(idx+1)%self.lazy\_gradient\_penalty\_interval==0:
ශ්රේණියේද penalty ුවම ගණනය කර ලොග් කරන්න
348gp=self.gradient\_penalty(real\_images,real\_output)349tracker.add('loss.gp',gp)
සංගුණකයමගින් ගුණ කර ශ්රේණියේ ද penalty ුවම එකතු කරන්න
351disc\_loss=disc\_loss+0.5\*self.gradient\_penalty\_coefficient\*gp\*self.lazy\_gradient\_penalty\_interval
අනුක්රමිකගණනය
354disc\_loss.backward()
ලොග්වෙනස්කම් කරන්නාගේ අලාභය
357tracker.add('loss.discriminator',disc\_loss)358359if(idx+1)%self.log\_generated\_interval==0:
විටින්විට ලොග් වෙනස්කම් කිරීමේ ආකෘති පරාමිතීන්
361tracker.add('discriminator',self.discriminator)
ස්ථායීකරණයසඳහා ක්ලිප් අනුක්රමික
364torch.nn.utils.clip\_grad\_norm\_(self.discriminator.parameters(),max\_norm=1.0)
ප්රශස්තිකරණපියවර ගන්න
366self.discriminator\_optimizer.step()
උත්පාදකයන්ත්රය පුහුණු කරන්න
369withmonit.section('Generator'):
අනුක්රමිකයළි පිහිටුවන්න
371self.generator\_optimizer.zero\_grad()372self.mapping\_network\_optimizer.zero\_grad()
සඳහාඅනුක්රමික සමුච්චය gradient_accumulate_steps
375foriinrange(self.gradient\_accumulate\_steps):
උත්පාදකයන්ත්රයෙන් නියැදි පින්තූර
377generated\_images,w=self.generate\_images(self.batch\_size)
ජනනයකරන ලද රූප සඳහා වෙනස්කම් කිරීමේ වර්ගීකරණය
379fake\_output=self.discriminator(generated\_images)
උත්පාදකනැතිවීම ලබා ගන්න
382gen\_loss=self.generator\_loss(fake\_output)
මාර්ගදිග ද penalty ුවම එකතු
385ifidx\>self.lazy\_path\_penalty\_afterand(idx+1)%self.lazy\_path\_penalty\_interval==0:
මාර්ගයදිග ද penalty ුවම ගණනය
387plp=self.path\_length\_penalty(w,generated\_images)
නම්නොසලකා හරින්න nan
389ifnottorch.isnan(plp):390tracker.add('loss.plp',plp)391gen\_loss=gen\_loss+plp
අනුක්රමිකගණනය කරන්න
394gen\_loss.backward()
ලොග්උත්පාදක නැතිවීම
397tracker.add('loss.generator',gen\_loss)398399if(idx+1)%self.log\_generated\_interval==0:
විටින්විට ලොග් වෙනස්කම් කිරීමේ ආකෘති පරාමිතීන්
401tracker.add('generator',self.generator)402tracker.add('mapping\_network',self.mapping\_network)
ස්ථායීකරණයසඳහා ක්ලිප් අනුක්රමික
405torch.nn.utils.clip\_grad\_norm\_(self.generator.parameters(),max\_norm=1.0)406torch.nn.utils.clip\_grad\_norm\_(self.mapping\_network.parameters(),max\_norm=1.0)
ප්රශස්තිකරණපියවර ගන්න
409self.generator\_optimizer.step()410self.mapping\_network\_optimizer.step()
ලොග්ජනනය කරන ලද රූප
413if(idx+1)%self.log\_generated\_interval==0:414tracker.add('generated',torch.cat([generated\_images[:6],real\_images[:3]],dim=0))
ආදර්ශමුරපොලවල් සුරකින්න
416if(idx+1)%self.save\_checkpoint\_interval==0:417experiment.save\_checkpoint()
ෆ්ලෂ්ට්රැකර්
420tracker.save()
422deftrain(self):
ලූප්සඳහා training_steps
428foriinmonit.loop(self.training\_steps):
පුහුණුපියවරක් ගන්න
430self.step(i)
432if(i+1)%self.log\_generated\_interval==0:433tracker.new\_line()
436defmain():
අත්හදාබැලීමක් සාදන්න
442experiment.create(name='stylegan2')
වින්යාසවස්තුව සාදන්න
444configs=Configs()
වින්යාසයන්සකසන්න සහ සමහර ඒවා අභිබවා යන්න
447experiment.configs(configs,{448'device.cuda\_device':0,449'image\_size':64,450'log\_generated\_interval':200451})
ආරම්භකරන්න
454configs.init()
ඉතිරිකිරීම සහ පැටවීම සඳහා ආකෘති සකසන්න
456experiment.add\_pytorch\_models(mapping\_network=configs.mapping\_network,457generator=configs.generator,458discriminator=configs.discriminator)
අත්හදාබැලීම ආරම්භ කරන්න
461withexperiment.start():
පුහුණුලූපය ධාවනය කරන්න
463configs.train()
467if\_\_name\_\_=='\_\_main\_\_':468main()