docs/si/gan/original/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/gan/original/ init.py)
මෙය Generative Aversarial Networkක්රියාත්මක කිරීමයි.
උත්පාදකයන්ත්රය, දත්ත බෙදා හැරීමට ගැලපෙන සාම්පල G(zz;θg) ජනනය කරන අතර වෙනස්කම් කරන්නා, වඩා දත්ත වලින් xx පැමිණි සම්භාවිතාව D(xx;θg) ලබා දෙයි G.
වටිනාකම්ක්රියාකාරිත්වය සහිත ක්රීඩක දෙකක මිනි-මැක්ස් ක්රීඩාවක් සඳහා අපි පුහුණු D කරමු V(G,D). G
GminDmaxV(D,G)=Exx∼pdata(xx)[logD(xx)]+Ezz∼pzz(zz)[log(1−D(G(zz))]
pdata(xx) යනු දත්ත වලට වඩා සම්භාවිතා බෙදා හැරීම වන අතර pzz(zz) සම්භාවිතා ව්යාප්තිය zzවන අතර එය ගවුසියානු ශබ්දයට සකසා ඇත.
මෙමගොනුව පාඩු කාර්යයන් අර්ථ දක්වයි. මෙන්න උත්පාදක යන්ත්රය සහ වෙනස්කම් කරන්නා සඳහා බහු ස්ථර perceptron දෙකක් සහිත MNIST උදාහරණයකි.
34importtorch35importtorch.nnasnn36importtorch.utils.data37importtorch.utils.data3839fromlabml\_helpers.moduleimportModule
වෙනස්කම්කරන්නා ශ්රේණිය මතට නැග්විය යුතුය,
∇θdm1i=1∑m[logD(xx(i))+log(1−D(G(zz(i))))]
m කුඩා කණ්ඩායම් ප්රමාණය (i) වන අතර කුඩා කණ්ඩායමේ සාම්පල දර්ශකය සඳහා භාවිතා කරයි. xx වෙතින් සාම්පල වන pdata අතර zz ඒවා සාම්පල pzවේ.
42classDiscriminatorLogitsLoss(Module):
57def\_\_init\_\_(self,smoothing:float=0.2):58super().\_\_init\_\_()
අපිභාවිතා කරමු PyTorch ද්විමය ක්රොස් එන්ට්රොපි නැතිවීම −∑[ylog(y^)+(1−y)log(1−y^)], එනම් ලේබල් සහ y^ අනාවැකි y කොහේද යන්නයි. සෘණලකුණ සටහන් කරන්න. අපි සිට සමාන ලේබල් භාවිතා 1 කරන pdata අතර xx xx සිට 0 සමාන ලේබල් pG. එවිට මේවායේ එකතුව මතට බැස යාම ඉහත ශ්රේණීය මත නැඟීම හා සමාන වේ.
BCEWithLogitsLoss සොෆ්ට්මැක්ස් සහ ද්විමය හරස් එන්ට්රොපි නැතිවීම ඒකාබද්ධ කරයි.
69self.loss\_true=nn.BCEWithLogitsLoss()70self.loss\_false=nn.BCEWithLogitsLoss()
අපිලේබල් සුමටනය භාවිතා කරන්නේ එය සමහර අවස්ථාවලදී වඩා හොඳින් ක්රියා කරන බව පෙනෙන බැවිනි
73self.smoothing=smoothing
ලේබලබෆර් ලෙස ලියාපදිංචි කර ඇති අතර නොපසුබට උත්සාහය සකසා False ඇත.
76self.register\_buffer('labels\_true',\_create\_labels(256,1.0-smoothing,1.0),False)77self.register\_buffer('labels\_false',\_create\_labels(256,0.0,smoothing),False)
logits_true සිට පිවිසුම් logits_false වන D(xx(i)) අතර සිට පිවිසුම් වේ D(G(zz(i)))
79defforward(self,logits\_true:torch.Tensor,logits\_false:torch.Tensor):
84iflen(logits\_true)\>len(self.labels\_true):85self.register\_buffer("labels\_true",86\_create\_labels(len(logits\_true),1.0-self.smoothing,1.0,logits\_true.device),False)87iflen(logits\_false)\>len(self.labels\_false):88self.register\_buffer("labels\_false",89\_create\_labels(len(logits\_false),0.0,self.smoothing,logits\_false.device),False)9091return(self.loss\_true(logits\_true,self.labels\_true[:len(logits\_true)]),92self.loss\_false(logits\_false,self.labels\_false[:len(logits\_false)]))
උත්පාදකයන්ත්රය අනුක්රමික මතට බැස යා යුතුය,
∇θgm1i=1∑m[log(1−D(G(zz(i))))]
95classGeneratorLogitsLoss(Module):
105def\_\_init\_\_(self,smoothing:float=0.2):106super().\_\_init\_\_()107self.loss\_true=nn.BCEWithLogitsLoss()108self.smoothing=smoothing
අපිසමාන ලේබල් භාවිතා කරමු xx සිට pG. එවිට මෙම අලාභය මත බැස යාම ඉහත ශ්රේණියෙන් බැස යාම හා සමාන වේ. 1
112self.register\_buffer('fake\_labels',\_create\_labels(256,1.0-smoothing,1.0),False)
114defforward(self,logits:torch.Tensor):115iflen(logits)\>len(self.fake\_labels):116self.register\_buffer("fake\_labels",117\_create\_labels(len(logits),1.0-self.smoothing,1.0,logits.device),False)118119returnself.loss\_true(logits,self.fake\_labels[:len(logits)])
සුමටලේබල සාදන්න
122def\_create\_labels(n:int,r1:float,r2:float,device:torch.device=None):
126returntorch.empty(n,1,requires\_grad=False,device=device).uniform\_(r1,r2)