docs/si/graphs/gat/experiment.html
13fromtypingimportDict1415importnumpyasnp16importtorch17fromtorchimportnn1819fromlabmlimportlab,monit,tracker,experiment20fromlabml.configsimportBaseConfigs,option,calculate21fromlabml.utilsimportdownload22fromlabml\_helpers.deviceimportDeviceConfigs23fromlabml\_helpers.moduleimportModule24fromlabml\_nn.graphs.gatimportGraphAttentionLayer25fromlabml\_nn.optimizers.configsimportOptimizerConfigs
කෝරා දත්ත කට්ටලය පර්යේෂණ පත්රිකා දත්ත කට්ටලයකි. සෑම කඩදාසි සඳහාම අපට ද්විමය අංග දෛශිකයක් ලබා දී ඇති අතර එය වචන ඇති බව පෙන්නුම් කරයි. සෑම කඩදාසියක්ම පන්ති 7 න් එකකට වර්ගීකරණය කර ඇත. දත්ත කට්ටලයට උපුටා දැක්වීමේ ජාලය ද ඇත.
පත්රිකා යනු ප්රස්ථාරයේ නෝඩ් වන අතර දාර උපුටා දැක්වීම් වේ.
කර්තව්යය වන්නේ නෝඩ් 7 පන්ති වලට විශේෂාංග දෛශික සහ උපුටා දැක්වීමේ ජාලය ආදානය ලෙස වර්ගීකරණය කිරීමයි.
28classCoraDataset:
එක්එක් නෝඩය සඳහා ලේබල
43labels:torch.Tensor
පන්තිනාම කට්ටලයක් සහ අද්විතීය පූර්ණ සංඛ්යා දර්ශකය
45classes:Dict[str,int]
සියලුමනෝඩ් සඳහා විශේෂාංග වාහකයන්
47features:torch.Tensor
දාරයේතොරතුරු සමඟ සම්බන්ධ වීමේ අනුකෘතිය. adj_mat[i][j] සිට දාරයක් තිබේ True``i නම් j .
50adj\_mat:torch.Tensor
දත්තකට්ටලය බාගන්න
52@staticmethod53def\_download():
57ifnot(lab.get\_data\_path()/'cora').exists():58download.download\_file('https://linqs-data.soe.ucsc.edu/public/lbc/cora.tgz',59lab.get\_data\_path()/'cora.tgz')60download.extract\_tar(lab.get\_data\_path()/'cora.tgz',lab.get\_data\_path())
දත්තකට්ටලය පූරණය කරන්න
62def\_\_init\_\_(self,include\_edges:bool=True):
දාරඇතුළත් කළ යුතුද යන්න. මෙම අපි උපුටා දැක්වීමේ ජාලය නොසලකා නම් කොපමණ නිරවද්යතාව අහිමි වේ පරීක්ෂා වේ.
69self.include\_edges=include\_edges
බාගතදත්ත කට්ටලය
72self.\_download()
කඩදාසිහැඳුනුම්පත්, විශේෂාංග දෛශික සහ ලේබල කියවන්න
75withmonit.section('Read content file'):76content=np.genfromtxt(str(lab.get\_data\_path()/'cora/cora.content'),dtype=np.dtype(str))
උපුටාදැක්වීම් පූරණය කරන්න, එය නිඛිල යුගල ලැයිස්තුවකි.
78withmonit.section('Read citations file'):79citations=np.genfromtxt(str(lab.get\_data\_path()/'cora/cora.cites'),dtype=np.int32)
විශේෂාංගදෛශික ලබා ගන්න
82features=torch.tensor(np.array(content[:,1:-1],dtype=np.float32))
විශේෂාංගදෛශික සාමාන්යකරණය කරන්න
84self.features=features/features.sum(dim=1,keepdim=True)
පන්තිනාම ලබා ගන්න සහ ඒ එක් එක් සඳහා අද්විතීය පූර්ණ සංඛ්යාවක් පවරන්න
87self.classes={s:ifori,sinenumerate(set(content[:,-1]))}
එමලේබල් එම නිඛිල ලෙස ලබා ගන්න
89self.labels=torch.tensor([self.classes[i]foriincontent[:,-1]],dtype=torch.long)
කඩදාසිහැඳුනුම්පත් ලබා ගන්න
92paper\_ids=np.array(content[:,0],dtype=np.int32)
කඩදාසිහැඳුනුම්පතේ සිට දර්ශකය දක්වා සිතියම
94ids\_to\_idx={id\_:ifori,id\_inenumerate(paper\_ids)}
හිස්adjacency න්යාසය - අනන්යතා අනුකෘතියක්
97self.adj\_mat=torch.eye(len(self.labels),dtype=torch.bool)
මෙමadjacency න්යාසය තුළ උපුටා දැක්වීම් සලකුණු
100ifself.include\_edges:101foreincitations:
කඩදාසිදර්ශක යුගලය
103e1,e2=ids\_to\_idx[e[0]],ids\_to\_idx[e[1]]
අපිසමමිතික ප්රස්තාරය ඉදි, එහිදී කඩදාසි i යොමු කඩදාසි නම් j අපි සිට i adge තැනින් j මෙන්ම සිට අද්දර j කිරීමට i.
107self.adj\_mat[e1][e2]=True108self.adj\_mat[e2][e1]=True
මෙමප්රස්තාර අවධානය ජාලය ප්රස්තාරය අවධානය ස්ථරදෙකක් ඇත.
111classGAT(Module):
in_features node එකක් මතම ඊට අදාල විශේෂාංග සංඛ්යාව වේn_hidden පළමු ප්රස්තාරය අවධානය ස්ථරය ලක්ෂණ සංඛ්යාව වේn_classes යනු පන්ති ගණනn_heads ප්රස්ථාර අවධානය ස්ථර වල හිස් ගණනdropout අතහැර දැමීමේ සම්භාවිතාව118def\_\_init\_\_(self,in\_features:int,n\_hidden:int,n\_classes:int,n\_heads:int,dropout:float):
126super().\_\_init\_\_()
අපිහිස් concatenate එහිදී පළමු ප්රස්තාරය අවධානය ස්ථරය
129self.layer1=GraphAttentionLayer(in\_features,n\_hidden,n\_heads,is\_concat=True,dropout=dropout)
පළමුප්රස්ථාර අවධානය ස්ථරයෙන් පසු සක්රිය කිරීමේ කාර්යය
131self.activation=nn.ELU()
අපිහිස් සාමාන්යය එහිදී අවසන් ප්රස්තාරය අවධානය ස්ථරය
133self.output=GraphAttentionLayer(n\_hidden,n\_classes,1,is\_concat=False,dropout=dropout)
හැලීම
135self.dropout=nn.Dropout(dropout)
x හැඩයේ ලක්ෂණ දෛශික වේ [n_nodes, in_features]adj_mat යනු ආකෘතියේ අනුකෘතියේ අනුකෘතිය [n_nodes, n_nodes, n_heads] හෝ [n_nodes, n_nodes, 1]137defforward(self,x:torch.Tensor,adj\_mat:torch.Tensor):
ආදානයටඅතහැර දැමීම යොදන්න
144x=self.dropout(x)
පළමුප්රස්ථාර අවධානය ස්ථරය
146x=self.layer1(x,adj\_mat)
සක්රියකිරීමේ කාර්යය
148x=self.activation(x)
හැලීම
150x=self.dropout(x)
පිවිසුම්සඳහා ප්රතිදාන ස්ථරය (සක්රිය කිරීමකින් තොරව)
152returnself.output(x,adj\_mat)
නිරවද්යතාවගණනය කිරීම සඳහා සරල ශ්රිතයක්
155defaccuracy(output:torch.Tensor,labels:torch.Tensor):
159returnoutput.argmax(dim=-1).eq(labels).sum().item()/len(labels)
162classConfigs(BaseConfigs):
ආකෘතිය
168model:GAT
පුහුණුකිරීමට නෝඩ් ගණන
170training\_samples:int=500
ආදානයේනෝඩයකට විශේෂාංග ගණන
172in\_features:int
පළමුප්රස්තාරයේ අවධානය ස්ථරයේ විශේෂාංග ගණන
174n\_hidden:int=64
හිස්ගණන
176n\_heads:int=8
වර්ගීකරණයසඳහා පන්ති ගණන
178n\_classes:int
අතහැරදැමීමේ සම්භාවිතාව
180dropout:float=0.6
උපුටාදැක්වීමේ ජාලය ඇතුළත් කළ යුතුද යන්න
182include\_edges:bool=True
දත්තකට්ටලය
184dataset:CoraDataset
පුහුණුපුනරාවර්තන ගණන
186epochs:int=1\_000
පාඩුශ්රිතය
188loss\_func=nn.CrossEntropyLoss()
පුහුණුකිරීමට උපාංගය
මෙයඋපාංගය සඳහා වින්යාස නිර්මාණය කරයි, එවිට අපට වින්යාස අගයක් පසු කිරීමෙන් උපාංගය වෙනස් කළ හැකිය
193device:torch.device=DeviceConfigs()
ප්රශස්තකරණය
195optimizer:torch.optim.Adam
දත්තසමුදාය කුඩා බැවින් අපි පූර්ණ කණ්ඩායම් පුහුණුව කරන්නෙමු. අප නියැදිය හා පුහුණු කිරීමට නම්, එක් එක් පුහුණු පියවර සඳහා නෝඩ් කට්ටලයක් සාම්පල ලබා ගත යුතු අතර එම තෝරාගත් නෝඩ් හරහා විහිදෙන දාර සමඟ.
197defrun(self):
විශේෂාංගදෛශික උපාංගයට ගෙනයන්න
207features=self.dataset.features.to(self.device)
ලේබලඋපාංගයට ගෙනයන්න
209labels=self.dataset.labels.to(self.device)
උපකරණයටඅනුකෘතිය ගෙන යන්න
211edges\_adj=self.dataset.adj\_mat.to(self.device)
හිස්සඳහා හිස් තෙවන මානයක් එක් කරන්න
213edges\_adj=edges\_adj.unsqueeze(-1)
අහඹුදර්ශක
216idx\_rand=torch.randperm(len(labels))
පුහුණුවසඳහා නෝඩ්
218idx\_train=idx\_rand[:self.training\_samples]
වලංගුකිරීම සඳහා නෝඩ්
220idx\_valid=idx\_rand[self.training\_samples:]
පුහුණුලූපය
223forepochinmonit.loop(self.epochs):
පුහුණුමාදිලියට ආකෘතිය සකසන්න
225self.model.train()
සියලුමඅනුක්රමික ශුන්ය කරන්න
227self.optimizer.zero\_grad()
ආකෘතියතක්සේරු කරන්න
229output=self.model(features,edges\_adj)
පුහුණුනෝඩ් සඳහා අලාභය ලබා ගන්න
231loss=self.loss\_func(output[idx\_train],labels[idx\_train])
අනුක්රමිකගණනය කරන්න
233loss.backward()
ප්රශස්තිකරණපියවර ගන්න
235self.optimizer.step()
අලාභයලොග් කරන්න
237tracker.add('loss.train',loss)
නිරවද්යතාවයලොග් කරන්න
239tracker.add('accuracy.train',accuracy(output[idx\_train],labels[idx\_train]))
වලංගුකිරීම සඳහා ඇගයීමේ ප්රකාරයට සකසන්න
242self.model.eval()
අනුක්රමිකගණනය කිරීමට අවශ්ය නැත
245withtorch.no\_grad():
ආකෘතියනැවත ඇගයීමට ලක් කරන්න
247output=self.model(features,edges\_adj)
වලංගුකිරීමේ නෝඩ් සඳහා අලාභය ගණනය කරන්න
249loss=self.loss\_func(output[idx\_valid],labels[idx\_valid])
අලාභයලොග් කරන්න
251tracker.add('loss.valid',loss)
නිරවද්යතාවයලොග් කරන්න
253tracker.add('accuracy.valid',accuracy(output[idx\_valid],labels[idx\_valid]))
ලොග්සුරකින්න
256tracker.save()
කෝරාදත්ත කට්ටලය සාදන්න
259@option(Configs.dataset)260defcora\_dataset(c:Configs):
264returnCoraDataset(c.include\_edges)
පන්තිගණන ලබා ගන්න
268calculate(Configs.n\_classes,lambdac:len(c.dataset.classes))
ආදානයේවිශේෂාංග ගණන
270calculate(Configs.in\_features,lambdac:c.dataset.features.shape[1])
GATආකෘතිය සාදන්න
273@option(Configs.model)274defgat\_model(c:Configs):
278returnGAT(c.in\_features,c.n\_hidden,c.n\_classes,c.n\_heads,c.dropout).to(c.device)
වින්යාසගතකළ හැකි ප්රශස්තකරණය
281@option(Configs.optimizer)282def\_optimizer(c:Configs):
286opt\_conf=OptimizerConfigs()287opt\_conf.parameters=c.model.parameters()288returnopt\_conf
291defmain():
වින්යාසයන්සාදන්න
293conf=Configs()
අත්හදාබැලීමක් සාදන්න
295experiment.create(name='gat')
වින්යාසයන්ගණනය කරන්න.
297experiment.configs(conf,{
ආදම්ප්රශස්තකරණය
299'optimizer.optimizer':'Adam',300'optimizer.learning\_rate':5e-3,301'optimizer.weight\_decay':5e-4,302})
අත්හදාබැලීම ආරම්භ කර නරඹන්න
305withexperiment.start():
පුහුණුවක්රියාත්මක කරන්න
307conf.run()
311if\_\_name\_\_=='\_\_main\_\_':312main()