Back to Annotated Deep Learning Paper Implementations

StyleGan 2 ආදර්ශ පුහුණුව

docs/si/gan/stylegan/experiment.html

latest25.4 KB
Original Source

homeganstylegan

View code on Github

#

StyleGan 2 ආදර්ශ පුහුණුව

සඳහාපුහුණු කේතය මෙයයි 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()

#

Stylegan2 වෙනස්කම් කරන්නා

96discriminator:Discriminator

#

StyleGan2 උත්පාදක යන්ත්රය

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)

#

නියැදිය w

මෙමසාම්පල 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()

#

දුම්රියවිලායGan2

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

Trending Research Paperslabml.ai