docs/si/experiments/nlp_classification.html
11fromcollectionsimportCounter12fromtypingimportCallable1314importtorch15importtorchtext16fromtorchimportnn17fromtorch.utils.dataimportDataLoader18importtorchtext.vocab19fromtorchtext.vocabimportVocab2021fromlabmlimportlab,tracker,monit22fromlabml.configsimportoption23fromlabml\_helpers.deviceimportDeviceConfigs24fromlabml\_helpers.metrics.accuracyimportAccuracy25fromlabml\_helpers.moduleimportModule26fromlabml\_helpers.train\_validimportTrainValidConfigs,hook\_model\_outputs,BatchIndex27fromlabml\_nn.optimizers.configsimportOptimizerConfigs
එන්එල්පීවර්ගීකරණ කාර්ය පුහුණුව සඳහා මූලික වින්යාසයන් මෙයට ඇත. සියලුම ගුණාංග වින්යාසගත කළ හැකිය.
30classNLPClassificationConfigs(TrainValidConfigs):
ප්රශස්තකරණය
41optimizer:torch.optim.Adam
පුහුණුඋපාංගය
43device:torch.device=DeviceConfigs()
ස්වයංක්රීයප්රතිගාමී ආකෘතිය
46model:Module
කණ්ඩායම්ප්රමාණය
48batch\_size:int=16
අනුක්රමයේදිග, හෝ සන්දර්භය ප්රමාණය
50seq\_len:int=512
වචනමාලාව
52vocab:Vocab='ag\_news'
වචනමාලාවේ ටෝකන් ගණන
54n\_tokens:int
පන්තිගණන
56n\_classes:int='ag\_news'
ටෝකනයිසර්
58tokenizer:Callable='character'
වරින්වර ආකෘති සුරැකීමට යන්න
61is\_save\_models=True
පාඩුශ්රිතය
64loss\_func=nn.CrossEntropyLoss()
නිරවද්යතාශ්රිතය
66accuracy=Accuracy()
ආදර්ශකාවැද්දීමේ ප්රමාණය
68d\_model:int=512
ශ්රේණියේක්ලිපින්
70grad\_norm\_clip:float=1.0
පුහුණුදත්ත පැටවුම
73train\_loader:DataLoader='ag\_news'
වලංගුදත්ත පැටවුම
75valid\_loader:DataLoader='ag\_news'
ආදර්ශපරාමිතීන් සහ අනුක්රමික ලඝු-සටහන යන්න (එක් එක් එක් එක් එක් වරක්). මේවා ස්ථරයකට සාරාංශගත සංඛ්යාන වේ, නමුත් එය තවමත් ඉතා ගැඹුරු ජාල සඳහා බොහෝ දර්ශක වලට හේතු විය හැකිය.
80is\_log\_model\_params\_grads:bool=False
ආදර්ශසක්රිය කිරීම් ලොග් කළ යුතුද යන්න (එක් එක් ඊපෝච් එකකට වරක්). මේවා ස්ථරයකට සාරාංශගත සංඛ්යාන වේ, නමුත් එය තවමත් ඉතා ගැඹුරු ජාල සඳහා බොහෝ දර්ශක වලට හේතු විය හැකිය.
85is\_log\_model\_activations:bool=False
87definit(self):
ට්රැකර්වින්යාසයන් සකසන්න
92tracker.set\_scalar("accuracy.\*",True)93tracker.set\_scalar("loss.\*",True)
මොඩියුලප්රතිදානයන් ලොග් කිරීමට කොක්කක් එක් කරන්න
95hook\_model\_outputs(self.mode,self.model,'model')
රාජ්යමොඩියුලයක් ලෙස නිරවද්යතාව එක් කරන්න. RNs සඳහා පුහුණුව සහ වලංගු කිරීම අතර රාජ්යයන් ගබඩා කිරීම අදහස් කරන බැවින් නම බොහෝ විට ව්යාකූල වේ. මෙය පුහුණුව සහ වලංගු කිරීම සඳහා නිරවද්යතා මෙට්රික් සංඛ්යාන වෙනම තබා ගනී.
100self.state\_modules=[self.accuracy]
102defstep(self,batch:any,batch\_idx:BatchIndex):
උපාංගයවෙත දත්ත ගෙනයන්න
108data,target=batch[0].to(self.device),batch[1].to(self.device)
පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)
111ifself.mode.is\_train:112tracker.add\_global\_step(data.shape[1])
ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න
115withself.mode.update(is\_log\_activations=batch\_idx.is\_lastandself.is\_log\_model\_activations):
ආදර්ශප්රතිදානයන් ලබා ගන්න. ආර්එන්එස් භාවිතා කරන විට එය ප්රාන්ත සඳහා ටූල් එකක් නැවත ලබා දෙයි. මෙය තවම ක්රියාත්මක කර නැත 😜
119output,\*\_=self.model(data)
ගණනයකිරීම සහ ලොග් වීම
122loss=self.loss\_func(output,target)123tracker.add("loss.",loss)
ගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය
126self.accuracy(output,target)127self.accuracy.track()
ආකෘතියපුහුණු කරන්න
130ifself.mode.is\_train:
අනුක්රමිකගණනය කරන්න
132loss.backward()
ක්ලිප්අනුක්රමික
134torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=self.grad\_norm\_clip)
ප්රශස්තිකරණපියවර ගන්න
136self.optimizer.step()
සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න
138ifbatch\_idx.is\_lastandself.is\_log\_model\_params\_grads:139tracker.add('model',self.model)
අනුක්රමිකඉවත්
141self.optimizer.zero\_grad()
ලුහුබැඳඇති ප්රමිතික සුරකින්න
144tracker.save()
147@option(NLPClassificationConfigs.optimizer)148def\_optimizer(c:NLPClassificationConfigs):
153optimizer=OptimizerConfigs()154optimizer.parameters=c.model.parameters()155optimizer.optimizer='Adam'156optimizer.d\_model=c.d\_model157158returnoptimizer
මෙමඅත්හදා බැලීමේදී අපි චරිත මට්ටමේ ටෝකනයිසර් භාවිතා කරමු. සැකසීමෙන් ඔබට මාරු විය හැකිය,
'tokenizer': 'basic_english',
අත්හදාබැලීම ආරම්භ කිරීමේදී වින්යාස කිරීමේ ශබ්දකෝෂයේ.
161@option(NLPClassificationConfigs.tokenizer)162defbasic\_english():
176fromtorchtext.dataimportget\_tokenizer177returnget\_tokenizer('basic\_english')
180defcharacter\_tokenizer(x:str):
184returnlist(x)
අක්ෂරමට්ටමේ ටෝකනයිසර් වින්යාසය
187@option(NLPClassificationConfigs.tokenizer)188defcharacter():
192returncharacter\_tokenizer
ටෝකනගණන ලබා ගන්න
195@option(NLPClassificationConfigs.n\_tokens)196def\_n\_tokens(c:NLPClassificationConfigs):
200returnlen(c.vocab)+2
203classCollateFunc:
tokenizer ටෝකනයිසර් ශ්රිතය වේvocab යනු වචන මාලාවයිseq_len අනුක්රමයේ දිග වේpadding_token යනු පෙළ දිගට වඩා විශාල seq_len වන විට පෑඩින් කිරීම සඳහා භාවිතා කරන ටෝකනය වේclassifier_token යනු ආදානය අවසානයේ අප විසින් සකස් කරන ලද [CLS] ටෝකනයයි208def\_\_init\_\_(self,tokenizer,vocab:Vocab,seq\_len:int,padding\_token:int,classifier\_token:int):
216self.classifier\_token=classifier\_token217self.padding\_token=padding\_token218self.seq\_len=seq\_len219self.vocab=vocab220self.tokenizer=tokenizer
batch විසින් එකතු කරන ලද දත්ත කාණ්ඩයයි DataLoader222def\_\_call\_\_(self,batch):
ආදානදත්ත ටෙන්සරය, සමඟ ආරම්භ කර ඇත padding_token
228data=torch.full((self.seq\_len,len(batch)),self.padding\_token,dtype=torch.long)
හිස්ලේබල් ටෙන්සර්
230labels=torch.zeros(len(batch),dtype=torch.long)
සාම්පලහරහා ලූප
233for(i,(\_label,\_text))inenumerate(batch):
ලේබලයසකසන්න
235labels[i]=int(\_label)-1
ආදානපෙළ ටෝකනයිස් කරන්න
237\_text=[self.vocab[token]fortokeninself.tokenizer(\_text)]
දක්වාටන්ක කරන්න seq_len
239\_text=\_text[:self.seq\_len]
දත්තසම්ප්රේෂණය කර එකතු කරන්න
241data[:len(\_text),i]=data.new\_tensor(\_text)
අනුපිළිවෙලෙහිඅවසාන ටෝකනය සකසන්න [CLS]
244data[-1,:]=self.classifier\_token
247returndata,labels
මෙයAG පුවත් දත්ත සමුදාය පටවන අතර n_classes , සඳහා අගයන් සකසා ඇත, vocab , train_loader , සහ valid_loader .
250@option([NLPClassificationConfigs.n\_classes,251NLPClassificationConfigs.vocab,252NLPClassificationConfigs.train\_loader,253NLPClassificationConfigs.valid\_loader])254defag\_news(c:NLPClassificationConfigs):
පුහුණුවසහ වලංගු කිරීමේ දත්ත කට්ටල ලබා ගන්න
263train,valid=torchtext.datasets.AG\_NEWS(root=str(lab.get\_data\_path()/'ag\_news'),split=('train','test'))
මතකයවෙත දත්ත පූරණය කරන්න
266withmonit.section('Load data'):267fromlabml\_nn.utilsimportMapStyleDataset
සිතියම් ආකාරයේ දත්ත කට්ටල සාදන්න
270train,valid=MapStyleDataset(train),MapStyleDataset(valid)
ටෝකනයිසර්ලබා ගන්න
273tokenizer=c.tokenizer
කවුන්ටරයක්සාදන්න
276counter=Counter()
පුහුණුදත්ත කට්ටලයෙන් ටෝකන එකතු කරන්න
278for(label,line)intrain:279counter.update(tokenizer(line))
වලංගුදත්ත කට්ටලයෙන් ටෝකන එකතු කරන්න
281for(label,line)invalid:282counter.update(tokenizer(line))
වචනමාලාව සාදන්න
284vocab=torchtext.vocab.vocab(counter,min\_freq=1)
පුහුණුදත්ත පැටවුම සාදන්න
287train\_loader=DataLoader(train,batch\_size=c.batch\_size,shuffle=True,288collate\_fn=CollateFunc(tokenizer,vocab,c.seq\_len,len(vocab),len(vocab)+1))
වලංගුදත්ත පැටවුම සාදන්න
290valid\_loader=DataLoader(valid,batch\_size=c.batch\_size,shuffle=True,291collate\_fn=CollateFunc(tokenizer,vocab,c.seq\_len,len(vocab),len(vocab)+1))
ආපසු n_classes``vocab , train_loader , සහ valid_loader
294return4,vocab,train\_loader,valid\_loader