docs/si/gan/cycle_gan/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/gan/cycle_gan/ init.py)
මෙය PyTorch ක්රියාත්මක කිරීම/නිබන්ධනයක් වන අතර එය Cycle-Consistent adversarial Networks භාවිතා කරමින් PyTorch Image පරිවර්තනය නොකළ අනුරූපය-රූප පරිවර්තනය .
මම එරික්ලින්ඩර්නොරන්/පයිටෝර්ච්-ගන්වෙතින් කේත කෑලි ගෙන ඇත්තෙමි. ඔබට වෙනත් GAN වෙනස්කම් පරීක්ෂා කිරීමට අවශ්ය නම් එය ඉතා හොඳ සම්පතකි.
චක්රයGAN රූපය-කිරීමට රූප පරිවර්තනය කරයි. ලබා දී ඇති බෙදාහැරීමෙන් රූපයක් තවත් එකකට පරිවර්තනය කිරීම සඳහා ආකෘතියක් පුහුණු කරයි, පවසන්නේ, A සහ B පන්තියේ රූප යම් බෙදාහැරීමක් පිළිබඳ රූප යම් ශෛලියක හෝ ස්වභාවධර්මයේ රූප වැනි දේවල් විය හැකිය. ආකෘති A සහ B අතර යුගල රූප අවශ්ය නොවේ එක් එක් පන්තියේ රූප සමූහයක් පමණක් ප්රමාණවත් වේ. රූප මෝස්තර, ආලෝකකරණ වෙනස්වීම්, රටා වෙනස්වීම් යනාදිය වෙනස් කිරීම සඳහා මෙය ඉතා හොඳින් ක්රියා කරයි. නිදසුනක් ලෙස ගිම්හානය ශීත to තුව දක්වා වෙනස් කිරීම, ඡායාරූප වලට පින්තාරු කිරීමේ ශෛලිය සහ අශ්වයන් සීබ්රා වෙත.
චක්රයGAN උත්පාදක ආකෘති දෙකක් සහ වෙනස්කම් කිරීමේ ආකෘති දෙකක් දුම්රිය කරයි. එක් උත්පාදක යන්ත්රයක් A සිට B දක්වාත් අනෙක B සිට A දක්වාත් පරිවර්තනය කරයි වෙනස්කම් කරන්නන් ජනනය කරන ලද රූප සැබෑ ලෙස පෙනෙනවාද යන්න පරීක්ෂා කරයි.
මෙමගොනුවේ ආදර්ශ කේතය මෙන්ම පුහුණු කේතයද අඩංගු වේ. අපට ගූගල් කොලැබ් සටහන් පොතක් ද ඇත.
36importitertools37importrandom38importzipfile39fromtypingimportTuple4041importtorch42importtorch.nnasnn43importtorchvision.transformsastransforms44fromPILimportImage45fromtorch.utils.dataimportDataLoader,Dataset46fromtorchvision.transformsimportInterpolationMode47fromtorchvision.utilsimportmake\_grid4849fromlabmlimportlab,tracker,experiment,monit50fromlabml.configsimportBaseConfigs51fromlabml.utils.downloadimportdownload\_file52fromlabml.utils.pytorchimportget\_modules53fromlabml\_helpers.deviceimportDeviceConfigs54fromlabml\_helpers.moduleimportModule
උත්පාදකයන්ත්රය අවශේෂ ජාලයකි.
57classGeneratorResNet(Module):
62def\_\_init\_\_(self,input\_channels:int,n\_residual\_blocks:int):63super().\_\_init\_\_()
මෙමපළමු කොටස 7×7 සංකෝචනය වන අතර රූපය විශේෂාංග සිතියමකට සිතියම් ගත කරයි. නිමැවුම් විශේෂාංග සිතියමට සමාන උස හා පළල ඇත්තේ අපට පෑඩින් එකක් ඇති බැවිනි 3. පරාවර්තන පුරවන එය දාරවල වඩා හොඳ රූපයේ ගුණාත්මක බවක් ලබා දෙන නිසා භාවිතා වේ.
inplace=True තුළ මතකය ටිකක් ReLU ඉතිරි කරයි.
71out\_features=6472layers=[73nn.Conv2d(input\_channels,out\_features,kernel\_size=7,padding=3,padding\_mode='reflect'),74nn.InstanceNorm2d(out\_features),75nn.ReLU(inplace=True),76]77in\_features=out\_features
අපි2 ක stride සමග 3×3 convolutions දෙකක් සමග පහළ-ආදර්ශ
81for\_inrange(2):82out\_features\*=283layers+=[84nn.Conv2d(in\_features,out\_features,kernel\_size=3,stride=2,padding=1),85nn.InstanceNorm2d(out\_features),86nn.ReLU(inplace=True),87]88in\_features=out\_features
අපිමෙය හරහා ගන්නෙමු n_residual_blocks . මෙම මොඩියුලය පහත අර්ථ දක්වා ඇත.
92for\_inrange(n\_residual\_blocks):93layers+=[ResidualBlock(out\_features)]
එවිටඑහි ප්රතිඵලයක් ලක්ෂණය සිතියම මුල් රූපයේ උස හා පළල ගැලපෙන දක්වා sampled ඇත.
97for\_inrange(2):98out\_features//=299layers+=[100nn.Upsample(scale\_factor=2),101nn.Conv2d(in\_features,out\_features,kernel\_size=3,stride=1,padding=1),102nn.InstanceNorm2d(out\_features),103nn.ReLU(inplace=True),104]105in\_features=out\_features
අවසානවශයෙන් අපි විශේෂාංග සිතියම RGB රූපයකට සිතියම් ගත කරමු
108layers+=[nn.Conv2d(out\_features,input\_channels,7,padding=3,padding\_mode='reflect'),nn.Tanh()]
ස්ථරසමඟ අනුක්රමික මොඩියුලයක් සාදන්න
111self.layers=nn.Sequential(\*layers)
බරආරම්භ කරන්න N(0,0.2)
114self.apply(weights\_init\_normal)
116defforward(self,x):117returnself.layers(x)
මෙයඅවශේෂ කොටස වන අතර, කැටි ගැසුණු ස්ථර දෙකක් ඇත.
120classResidualBlock(Module):
125def\_\_init\_\_(self,in\_features:int):126super().\_\_init\_\_()127self.block=nn.Sequential(128nn.Conv2d(in\_features,in\_features,kernel\_size=3,padding=1,padding\_mode='reflect'),129nn.InstanceNorm2d(in\_features),130nn.ReLU(inplace=True),131nn.Conv2d(in\_features,in\_features,kernel\_size=3,padding=1,padding\_mode='reflect'),132nn.InstanceNorm2d(in\_features),133nn.ReLU(inplace=True),134)
136defforward(self,x:torch.Tensor):137returnx+self.block(x)
මෙයවෙනස්කම් කරන්නා ය.
140classDiscriminator(Module):
145def\_\_init\_\_(self,input\_shape:Tuple[int,int,int]):146super().\_\_init\_\_()147channels,height,width=input\_shape
වෙනස්කම්කරන්නාගේ ප්රතිදානය ද සම්භාවිතාවන්ගේ සිතියමකි, රූපයේ එක් එක් කලාපය සැබෑ හෝ ජනනය වේද යන්න
151self.output\_shape=(1,height//2\*\*4,width//2\*\*4)152153self.layers=nn.Sequential(
මෙමඑක් එක් බ්ලොක් 2 ක සාධකයක් මගින් උස හා පළල හැකිලෙනු ඇත
155DiscriminatorBlock(channels,64,normalize=False),156DiscriminatorBlock(64,128),157DiscriminatorBlock(128,256),158DiscriminatorBlock(256,512),
නිමැවුම්උස සහ පළල 4×4 කර්නලය සමඟ සමානව තබා ගැනීම සඳහා ඉහළින් සහ වමේ ශුන්ය පෑඩ්
161nn.ZeroPad2d((1,0,1,0)),162nn.Conv2d(512,1,kernel\_size=4,padding=1)163)
බරආරම්භ කරන්න N(0,0.2)
166self.apply(weights\_init\_normal)
168defforward(self,img):169returnself.layers(img)
මෙයවෙනස්කම් කිරීමේ බ්ලොක් මොඩියුලයයි. එය convolution, විකල්ප සාමාන්යකරණය, සහ කාන්දු RELU කරන්නේ.
එයආදාන විශේෂාංග සිතියමේ උස හා පළල අඩකින් හැකිලී යයි.
172classDiscriminatorBlock(Module):
180def\_\_init\_\_(self,in\_filters:int,out\_filters:int,normalize:bool=True):181super().\_\_init\_\_()182layers=[nn.Conv2d(in\_filters,out\_filters,kernel\_size=4,stride=2,padding=1)]183ifnormalize:184layers.append(nn.InstanceNorm2d(out\_filters))185layers.append(nn.LeakyReLU(0.2,inplace=True))186self.layers=nn.Sequential(\*layers)
188defforward(self,x:torch.Tensor):189returnself.layers(x)
කැටිගැසුණු ස්ථර බර ආරම්භ කරන්න N(0,0.2)
192defweights\_init\_normal(m):
196classname=m.\_\_class\_\_.\_\_name\_\_197ifclassname.find("Conv")!=-1:198torch.nn.init.normal\_(m.weight.data,0.0,0.02)
අළුපරිමාණයෙන් නම් රූපයක් පටවා RGB වෙත වෙනස් කරන්න.
201defload\_image(path:str):
205image=Image.open(path)206ifimage.mode!='RGB':207image=Image.new("RGB",image.size).paste(image)208209returnimage
212classImageDataset(Dataset):
217@staticmethod218defdownload(dataset\_name:str):
URL
223url=f'https://people.eecs.berkeley.edu/~taesung\_park/CycleGAN/datasets/{dataset\_name}.zip'
බාගතෆෝල්ඩරය
225root=lab.get\_data\_path()/'cycle\_gan'226ifnotroot.exists():227root.mkdir(parents=True)
ගමනාන්තයබාගන්න
229archive=root/f'{dataset\_name}.zip'
බාගතගොනුව (සාමාන්යයෙන් ~ 100MB)
231download\_file(url,archive)
සංරක්ෂිතයඋපුටා ගන්න
233withzipfile.ZipFile(archive,'r')asf:234f.extractall(root)
dataset_name දත්ත සමුදාය නමtransforms_ රූප පරිවර්තනය කිරීමේ කට්ටලය වේmode එක්කෝ train හෝ test236def\_\_init\_\_(self,dataset\_name:str,transforms\_,mode:str):
දත්තසමුදාය මාර්ගය
245root=lab.get\_data\_path()/'cycle\_gan'/dataset\_name
අස්ථානගතවුවහොත් බාගත කරන්න
247ifnotroot.exists():248self.download(dataset\_name)
රූපපරිවර්තනය කරයි
251self.transform=transforms.Compose(transforms\_)
රූපමාර්ග ලබා ගන්න
254path\_a=root/f'{mode}A'255path\_b=root/f'{mode}B'256self.files\_a=sorted(str(f)forfinpath\_a.iterdir())257self.files\_b=sorted(str(f)forfinpath\_b.iterdir())
259def\_\_getitem\_\_(self,index):
රූපයුගලයක් ආපසු එවන්න. මෙම යුගල එකට එකතු වන අතර ඒවා පුහුණුවීම්වල යුගල මෙන් ක්රියා නොකරයි. එබැවින් අපි සෑම විටම එකම යුගලයක් ලබා දීම හරි ය.
263return{"x":self.transform(load\_image(self.files\_a[index%len(self.files\_a)])),264"y":self.transform(load\_image(self.files\_b[index%len(self.files\_b)]))}
266def\_\_len\_\_(self):
දත්තකට්ටුවේ පින්තූර ගණන
268returnmax(len(self.files\_a),len(self.files\_b))
වෙනස්කම්කරන්නා පුහුණු කිරීම සඳහා නැවත ධාවනය කිරීමේ බෆරය භාවිතා කරයි. ජනනය කරන ලද පින්තූර නැවත ධාවනය කිරීමේ බෆරයට එකතු කර එයින් සාම්පල ලබා ගනී.
නැවතධාවනය වන බෆරය අලුතින් එකතු කරන ලද රූපය සම්භාවිතාවයකින් නැවත ලබා දෙයි 0.5. එසේ නොමැතිනම්, එය පැරණි ජනනය කරන ලද රූපයක් යවන අතර පැරණි රූපය අලුතින් ජනනය කරන ලද රූපය සමඟ ප්රතිස්ථාපනය කරයි.
ආදර්ශදෝලනය අඩු කිරීම සඳහා මෙය සිදු කෙරේ.
271classReplayBuffer:
285def\_\_init\_\_(self,max\_size:int=50):286self.max\_size=max\_size287self.data=[]
රූපයක්එකතු කරන්න/ලබා ගන්න
289defpush\_and\_pop(self,data:torch.Tensor):
291data=data.detach()292res=[]293forelementindata:294iflen(self.data)\<self.max\_size:295self.data.append(element)296res.append(element)297else:298ifrandom.uniform(0,1)\>0.5:299i=random.randint(0,self.max\_size-1)300res.append(self.data[i].clone())301self.data[i]=element302else:303res.append(element)304returntorch.stack(res)
307classConfigs(BaseConfigs):
DeviceConfigs තිබේ නම් GPU එකක් තෝරා ගනු ඇත
311device:torch.device=DeviceConfigs()
අධිපරාමිතීන්
314epochs:int=200315dataset\_name:str='monet2photo'316batch\_size:int=1317318data\_loader\_workers=8319320learning\_rate=0.0002321adam\_betas=(0.5,0.999)322decay\_start=100
කඩදාසියෝජනා කරන්නේ සෘණ ලොග් වීමේ සම්භාවිතාව වෙනුවට අවම චතුරස්ර අලාභයක් භාවිතා කිරීමයි, එය වඩා ස්ථායී බව සොයාගෙන ඇත.
326gan\_loss=torch.nn.MSELoss()
L1අලාභය චක්රීය අලාභය සහ අනන්යතාවය නැතිවීම සඳහා භාවිතා කරයි
329cycle\_loss=torch.nn.L1Loss()330identity\_loss=torch.nn.L1Loss()
රූපමානයන්
333img\_height=256334img\_width=256335img\_channels=3
උත්පාදකයන්ත්රයේ අවශේෂ කොටස් ගණන
338n\_residual\_blocks=9
පාඩුසංගුණක
341cyclic\_loss\_coefficient=10.0342identity\_loss\_coefficient=5.343344sample\_interval=500
ආකෘති
347generator\_xy:GeneratorResNet348generator\_yx:GeneratorResNet349discriminator\_x:Discriminator350discriminator\_y:Discriminator
ප්රශස්තකරණය
353generator\_optimizer:torch.optim.Adam354discriminator\_optimizer:torch.optim.Adam
ඉගෙනුම්අනුපාත කාලසටහන්
357generator\_lr\_scheduler:torch.optim.lr\_scheduler.LambdaLR358discriminator\_lr\_scheduler:torch.optim.lr\_scheduler.LambdaLR
දත්තකාරකයන්
361dataloader:DataLoader362valid\_dataloader:DataLoader
පරීක්ෂණකට්ටලයෙන් සාම්පල ජනනය කර ඒවා සුරකින්න
364defsample\_images(self,n:int):
366batch=next(iter(self.valid\_dataloader))367self.generator\_xy.eval()368self.generator\_yx.eval()369withtorch.no\_grad():370data\_x,data\_y=batch['x'].to(self.generator\_xy.device),batch['y'].to(self.generator\_yx.device)371gen\_y=self.generator\_xy(data\_x)372gen\_x=self.generator\_yx(data\_y)
x-අක්ෂය ඔස්සේ රූප සකස් කරන්න
375data\_x=make\_grid(data\_x,nrow=5,normalize=True)376data\_y=make\_grid(data\_y,nrow=5,normalize=True)377gen\_x=make\_grid(gen\_x,nrow=5,normalize=True)378gen\_y=make\_grid(gen\_y,nrow=5,normalize=True)
Y-අක්ෂය ඔස්සේ රූප සකස් කරන්න
381image\_grid=torch.cat((data\_x,gen\_y,data\_y,gen\_x),1)
සාම්පලපෙන්වන්න
384plot\_image(image\_grid)
386definitialize(self):
390input\_shape=(self.img\_channels,self.img\_height,self.img\_width)
ආකෘතිසාදන්න
393self.generator\_xy=GeneratorResNet(self.img\_channels,self.n\_residual\_blocks).to(self.device)394self.generator\_yx=GeneratorResNet(self.img\_channels,self.n\_residual\_blocks).to(self.device)395self.discriminator\_x=Discriminator(input\_shape).to(self.device)396self.discriminator\_y=Discriminator(input\_shape).to(self.device)
මෙමoptmizers නිර්මාණය
399self.generator\_optimizer=torch.optim.Adam(400itertools.chain(self.generator\_xy.parameters(),self.generator\_yx.parameters()),401lr=self.learning\_rate,betas=self.adam\_betas)402self.discriminator\_optimizer=torch.optim.Adam(403itertools.chain(self.discriminator\_x.parameters(),self.discriminator\_y.parameters()),404lr=self.learning\_rate,betas=self.adam\_betas)
ඉගෙනුම්අනුපාත කාලසටහන් සාදන්න. ඉගෙනුම් අනුපාතය decay_start එපොච් තෙක් පැතලි වන අතර පසුව පුහුණුව 0 අවසානයේ රේඛීයව අඩු වේ.
409decay\_epochs=self.epochs-self.decay\_start410self.generator\_lr\_scheduler=torch.optim.lr\_scheduler.LambdaLR(411self.generator\_optimizer,lr\_lambda=lambdae:1.0-max(0,e-self.decay\_start)/decay\_epochs)412self.discriminator\_lr\_scheduler=torch.optim.lr\_scheduler.LambdaLR(413self.discriminator\_optimizer,lr\_lambda=lambdae:1.0-max(0,e-self.decay\_start)/decay\_epochs)
රූපපරිවර්තනයන්
416transforms\_=[417transforms.Resize(int(self.img\_height\*1.12),InterpolationMode.BICUBIC),418transforms.RandomCrop((self.img\_height,self.img\_width)),419transforms.RandomHorizontalFlip(),420transforms.ToTensor(),421transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),422]
පුහුණුදත්ත පැටවුම
425self.dataloader=DataLoader(426ImageDataset(self.dataset\_name,transforms\_,'train'),427batch\_size=self.batch\_size,428shuffle=True,429num\_workers=self.data\_loader\_workers,430)
වලංගුදත්ත පැටවුම
433self.valid\_dataloader=DataLoader(434ImageDataset(self.dataset\_name,transforms\_,"test"),435batch\_size=5,436shuffle=True,437num\_workers=self.data\_loader\_workers,438)
විසඳීමටඅපගේ ඉලක්කය: G∗,F∗=argG,FminDX,DYmaxL(G,F,DX,DY)
කොහෙන්ද, පින්තූර G පරිවර්තනය කරයි X→Y, පින්තූර F පරිවර්තනය කරයි Y→X, රූප තිබේදැයි DX පරීක්ෂා කරයි X අභ්යවකාශයේ සිට, රූප Y අභ්යවකාශයේ සිට නම් DY පරීක්ෂණ සහ
L(G,F,DX,DY)LGAN(G,F,DY,X,Y)Lcyc(G,F)Lidentity(G,F)=LGAN(G,DY,X,Y)+LGAN(F,DX,Y,X)+λ1Lcyc(G,F)+λ2Lidentity(G,F)=Ey∼pdata(y)[logDY(y)]+Ex∼pdata(x)[log(1−DY(G(x)))]+Ex∼pdata(x)[logDX(x)]+Ey∼pdata(y)[log(1−DX(F(y)))]=Ex∼pdata(x)[∥F(G(x))−x∥1]+Ey∼pdata(y)[∥G(F(y))−y∥1]=Ex∼pdata(x)[∥F(x)−x∥1]+Ey∼pdata(y)[∥G(y)−y∥1]
LGAN යනු මුල් GAN කඩදාසි වලින් උත්පාදක අහිතකර අලාභයයි.
Lcyc යනු චක්රීය අලාභයයි, එහිදී අපි සමාන F(G(x)) වීමට xහා සමාන G(F(y)) වීමට උත්සාහ කරමු y. මූලික වශයෙන් ජනක යන්ත්ර දෙක (පරිවර්තනයන්) ශ්රේණිගතව යෙදුවහොත් එය මුල් රූපය ආපසු ලබා දිය යුතුය. මෙම ලිපියේ ප්රධාන දායකත්වය මෙයයි. මුල් රූපයට සමාන වෙනත් බෙදාහැරීමේ රූපයක් ජනනය කිරීමට එය ජනක යන්ත්ර පුහුණු කරයි. මෙම අලාභය නොමැතිව බෙදා හැරීමෙන් ඕනෑම දෙයක් ජනනය G(x) කළ Yහැකිය. දැන් එය බෙදා හැරීමෙන් යමක් ජනනය කළ යුතු Y නමුත් තවමත් ගුණාංග ඇත x, එවිට වැනි දෙයක් නැවත ජනනය F(G(x) කළ හැකිය x.
Lcyc අනන්යතාව අහිමි වේ. ආදානය සහ ප්රතිදානය අතර වර්ණ සංයුතිය ආරක්ෂා කර ගැනීම සඳහා සිතියම්කරණය දිරිමත් කිරීම සඳහා මෙය භාවිතා කරන ලදී.
විසඳීමට G∗,F∗, වෙනස්කම් කරන්නන් DX සහ ශ්රේණිය මත නගින්නේ DY සිටිය යුතුය,
∇θDX,DYm1i=1∑m[logDY(y(i))+log(1−DY(G(x(i))))+logDX(x(i))+log(1−DX(F(y(i))))]
බව සෘණ ලොග්-සම්භාවිතාව අහිමි මත බැස ඇත.
පුහුණුවස්ථාවර කිරීම සඳහා negative ණාත්මක ලොග්- සම්භාවිතාව පරමාර්ථය අවම වශයෙන් කොටු වූ අලාභයක් මගින් ප්රතිස්ථාපනය කරන ලදි - වෙනස්කම් කරන්නාගේ අවම කොටු දෝෂය, 1 සමඟ සැබෑ රූප ලේබල් කිරීම සහ 0 සමඟ රූප ජනනය කිරීම. ඒ නිසා අපි ඵලය අනුක්රමික මත බැස කිරීමට අවශ්ය,
∇θDX,DYm1i=1∑m[(DY(y(i))−1)2+DY(G(x(i)))2+(DX(x(i))−1)2+DX(F(y(i)))2]
අපිජනක යන්ත්ර සඳහා අඩු චතුරස්රයන් ද භාවිතා කරමු. ජනක යන්ත්ර ශ්රේණිය මතට බැස යා යුතුය,
∇θF,Gm1i=1∑m[(DY(G(x(i)))−1)2+(DX(F(y(i)))−1)2+Lcyc(G,F)+Lidentity(G,F)]
අපි generator_xy``generator_yx සඳහා G සහ භාවිතා කරමු F. අපි discriminator_x``discriminator_y සඳහා DX සහ භාවිතා කරමු DY.
440defrun(self):
ජනනයසාම්පල තබා ගැනීමට බෆර නැවත ධාවනය
542gen\_x\_buffer=ReplayBuffer()543gen\_y\_buffer=ReplayBuffer()
එපොච්හරහා ලූප්
546forepochinmonit.loop(self.epochs):
දත්තකට්ටලය හරහා ලූප
548fori,batchinmonit.enum('Train',self.dataloader):
උපාංගයටරූප ගෙනයන්න
550data\_x,data\_y=batch['x'].to(self.device),batch['y'].to(self.device)
සැබෑලේබල වලට සමාන වේ 1
553true\_labels=torch.ones(data\_x.size(0),\*self.discriminator\_x.output\_shape,554device=self.device,requires\_grad=False)
ව්යාජලේබල වලට සමාන වේ 0
556false\_labels=torch.zeros(data\_x.size(0),\*self.discriminator\_x.output\_shape,557device=self.device,requires\_grad=False)
ජනකයන්ත්ර පුහුණු කරන්න. මෙය ජනනය කරන ලද රූප නැවත ලබා දෙයි.
561gen\_x,gen\_y=self.optimize\_generators(data\_x,data\_y,true\_labels)
වෙනස්කම්කරන්නන් පුහුණු කරන්න
564self.optimize\_discriminator(data\_x,data\_y,565gen\_x\_buffer.push\_and\_pop(gen\_x),gen\_y\_buffer.push\_and\_pop(gen\_y),566true\_labels,false\_labels)
පුහුණුසංඛ්යාලේඛන සුරකින්න සහ ගෝලීය පියවර කවුන්ටරය වැඩි කරන්න
569tracker.save()570tracker.add\_global\_step(max(len(data\_x),len(data\_y)))
කාලපරතරයන් පින්තූර සුරකින්න
573batches\_done=epoch\*len(self.dataloader)+i574ifbatches\_done%self.sample\_interval==0:
පින්තූරනියැදි කිරීමේදී ආකෘති සුරකින්න
576experiment.save\_checkpoint()
නියැදිරූප
578self.sample\_images(batches\_done)
ඉගෙනුම්අනුපාත යාවත්කාලීන කරන්න
581self.generator\_lr\_scheduler.step()582self.discriminator\_lr\_scheduler.step()
නවපේළිය
584tracker.new\_line()
586defoptimize\_generators(self,data\_x:torch.Tensor,data\_y:torch.Tensor,true\_labels:torch.Tensor):
පුහුණුප්රකාරයට වෙනස් කරන්න
592self.generator\_xy.train()593self.generator\_yx.train()
අනන්යතාවයනැතිවීම ∥F(G(x(i)))−x(i)∥1 ∥G(F(y(i)))−y(i)∥1
598loss\_identity=(self.identity\_loss(self.generator\_yx(data\_x),data\_x)+599self.identity\_loss(self.generator\_xy(data\_y),data\_y))
රූප G(x) ජනනය කරන්න F(y)
602gen\_y=self.generator\_xy(data\_x)603gen\_x=self.generator\_yx(data\_y)
GANපාඩුව (DY(G(x(i)))−1)2+(DX(F(y(i)))−1)2
608loss\_gan=(self.gan\_loss(self.discriminator\_y(gen\_y),true\_labels)+609self.gan\_loss(self.discriminator\_x(gen\_x),true\_labels))
චක්රයඅහිමි ∥F(G(x(i)))−x(i)∥1+∥G(F(y(i)))−y(i)∥1
616loss\_cycle=(self.cycle\_loss(self.generator\_yx(gen\_y),data\_x)+617self.cycle\_loss(self.generator\_xy(gen\_x),data\_y))
මුළුඅලාභය
620loss\_generator=(loss\_gan+621self.cyclic\_loss\_coefficient\*loss\_cycle+622self.identity\_loss\_coefficient\*loss\_identity)
ප්රශස්තකරණයේපියවරක් ගන්න
625self.generator\_optimizer.zero\_grad()626loss\_generator.backward()627self.generator\_optimizer.step()
ලොග්පාඩු
630tracker.add({'loss.generator':loss\_generator,631'loss.generator.cycle':loss\_cycle,632'loss.generator.gan':loss\_gan,633'loss.generator.identity':loss\_identity})
ජනනයකරන ලද රූප ආපසු
636returngen\_x,gen\_y
638defoptimize\_discriminator(self,data\_x:torch.Tensor,data\_y:torch.Tensor,639gen\_x:torch.Tensor,gen\_y:torch.Tensor,640true\_labels:torch.Tensor,false\_labels:torch.Tensor):
GANපාඩුව
(DY(y(i))−1)2+DY(G(x(i)))2+(DX(x(i))−1)2+DX(F(y(i)))2
653loss\_discriminator=(self.gan\_loss(self.discriminator\_x(data\_x),true\_labels)+654self.gan\_loss(self.discriminator\_x(gen\_x),false\_labels)+655self.gan\_loss(self.discriminator\_y(data\_y),true\_labels)+656self.gan\_loss(self.discriminator\_y(gen\_y),false\_labels))
ප්රශස්තකරණයේපියවරක් ගන්න
659self.discriminator\_optimizer.zero\_grad()660loss\_discriminator.backward()661self.discriminator\_optimizer.step()
ලොග්පාඩු
664tracker.add({'loss.discriminator':loss\_discriminator})
667deftrain():
වින්යාසයන්සාදන්න
672conf=Configs()
අත්හදාබැලීමක් සාදන්න
674experiment.create(name='cycle\_gan')
වින්යාසයන්ගණනය කරන්න. එය ගණනය කරනු conf.run ඇති අතර එයට අවශ්ය අනෙකුත් සියලුම වින්යාස.
677experiment.configs(conf,{'dataset\_name':'summer2winter\_yosemite'})678conf.initialize()
සුරැකීමසහ පැටවීම සඳහා ආකෘති ලියාපදිංචි කරන්න. get_modules ශබ්ද කෝෂයක් ලබා nn.Modules දෙයි conf . ඔබට ආකෘති වල අභිරුචි ශබ්ද කෝෂයක් ද නියම කළ හැකිය.
683experiment.add\_pytorch\_models(get\_modules(conf))
අත්හදාබැලීම ආරම්භ කර නරඹන්න
685withexperiment.start():
පුහුණුවක්රියාත්මක කරන්න
687conf.run()
690defplot\_image(img:torch.Tensor):
694frommatplotlibimportpyplotasplt
ආතකයCPU වෙත ගෙන යන්න
697img=img.cpu()
සාමාන්යකරණයසඳහා රූපයේ විනාඩි සහ උපරිම අගයන් ලබා ගන්න
699img\_min,img\_max=img.min(),img.max()
රූපඅගයන් 0... 1 විය යුතුය
701img=(img-img\_min)/(img\_max-img\_min+1e-5)
අපිHWC වෙත මානයන් අනුපිළිවෙල වෙනස් කළ යුතුය.
703img=img.permute(1,2,0)
රූපයපෙන්වන්න
705plt.imshow(img)
අපටඅක්ෂ අවශ්ය නොවේ
707plt.axis('off')
සංදර්ශකය
709plt.show()
712defevaluate():
පුහුණුධාවනයෙන් UUID ධාවනය කරන්න
717trained\_run\_uuid='f73c1164184711eb9190b74249275441'
වින්යාසවස්තුව සාදන්න
719conf=Configs()
අත්හදාබැලීම සාදන්න
721experiment.create(name='cycle\_gan\_inference')
පුහුණුවසඳහා සකසා ඇති අධි පරාමිතීන් පටවන්න
723conf\_dict=experiment.load\_configs(trained\_run\_uuid)
වින්යාසයන්ගණනය කරන්න. අපි ජනක යන්ත්ර නියම කර ඇති අතර 'generator_xy', 'generator_yx' එමඟින් එය පටවන්නේ ඒවා සහ ඒවායේ පරායත්තතාවයන් පමණි. වින්යාස කිරීම device හා ගණනය img_channels කරනු ලැබේ, මේවා අවශ්ය වන බැවින් generator_xy සහ generator_yx .
ඔබටවෙනත් පරාමිතීන් අවශ්ය නම් dataset_name ඔබ ඒවා මෙහි සඳහන් කළ යුතුය. ඔබ කිසිවක් සඳහන් නොකරන්නේ නම්, දත්ත පැටවුම් ඇතුළුව සියලු වින්යාසයන් ගණනය කරනු ලැබේ. වින්යාසයන් සහ ඒවායේ පරායත්තතා ගණනය කිරීම ඔබ අමතන විට සිදුවනු ඇත experiment.start
732experiment.configs(conf,conf\_dict)733conf.initialize()
සුරැකීමසහ පැටවීම සඳහා ආකෘති ලියාපදිංචි කරන්න. get_modules ශබ්ද කෝෂයක් ලබා nn.Modules දෙයි conf . ඔබට ආකෘති වල අභිරුචි ශබ්ද කෝෂයක් ද නියම කළ හැකිය.
738experiment.add\_pytorch\_models(get\_modules(conf))
කුමනධාවනයෙන් පූරණය කළ යුතු දැයි සඳහන් කරන්න. ඔබ කතා කරන විට පැටවීම ඇත්ත වශයෙන්ම සිදුවනු ඇත experiment.start
741experiment.load(trained\_run\_uuid)
අත්හදාබැලීම ආරම්භ කරන්න
744withexperiment.start():
රූපපරිවර්තනයන්
746transforms\_=[747transforms.ToTensor(),748transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),749]
ඔබේමදත්ත පූරණය කරන්න. මෙන්න අපි පරීක්ෂණ කට්ටලය උත්සාහ කරමු. මම යෝස්මයිට් ඡායාරූප සමඟ උත්සාහ කරමින් සිටියෙමි, ඒවා නියමයි. ඔබට ඇමතුමේ ගණනය කිරීමට අවශ්ය වූ දෙයක් dataset_name ලෙස ඔබ නියම කර ඇත්නම් conf.dataset_name , ඔබට භාවිතා කළ
හැකිය experiment.configs
755dataset=ImageDataset(conf.dataset\_name,transforms\_,'train')
දත්තකට්ටලයෙන් රූපයක් ලබා ගන්න
757x\_image=dataset[10]['x']
රූපයපෙන්වන්න
759plot\_image(x\_image)
ඇගයීම්මාදිලිය
762conf.generator\_xy.eval()763conf.generator\_yx.eval()
අපටඅනුක්රමික අවශ්ය නොවේ
766withtorch.no\_grad():
කණ්ඩායම්මානය එක් කර අප භාවිතා කරන උපාංගයට යන්න
768data=x\_image.unsqueeze(0).to(conf.device)769generated\_y=conf.generator\_xy(data)
ජනනයකරන ලද රූපය පෙන්වන්න.
772plot\_image(generated\_y[0].cpu())773774775if\_\_name\_\_=='\_\_main\_\_':776train()
ඇගයීම()