docs/si/experiments/nlp_autoregression.html
11fromtypingimportCallable1213importtorch14importtorch.nnasnn15fromtorch.utils.dataimportDataLoader,RandomSampler1617fromlabmlimportlab,monit,logger,tracker18fromlabml.configsimportoption19fromlabml.loggerimportText20fromlabml\_helpers.datasets.textimportTextDataset,SequentialDataLoader,SequentialUnBatchedDataset,TextFileDataset21fromlabml\_helpers.deviceimportDeviceConfigs22fromlabml\_helpers.metrics.accuracyimportAccuracy23fromlabml\_helpers.moduleimportModule24fromlabml\_helpers.train\_validimportTrainValidConfigs,hook\_model\_outputs,BatchIndex25fromlabml\_nn.optimizers.configsimportOptimizerConfigs
28classCrossEntropyLoss(Module):
33def\_\_init\_\_(self):34super().\_\_init\_\_()35self.loss=nn.CrossEntropyLoss()
37defforward(self,outputs,targets):38returnself.loss(outputs.view(-1,outputs.shape[-1]),targets.view(-1))
එන්එල්පීස්වයංක්රීය-ප්රතිගාමී කාර්ය පුහුණුව සඳහා මූලික වින්යාසයන් මෙයට ඇත. සියලුම ගුණාංග වින්යාසගත කළ හැකිය.
41classNLPAutoRegressionConfigs(TrainValidConfigs):
ප්රශස්තකරණය
52optimizer:torch.optim.Adam
පුහුණුඋපාංගය
54device:torch.device=DeviceConfigs()
ස්වයංක්රීයප්රතිගාමී ආකෘතිය
57model:Module
පෙළදත්ත කට්ටලය
59text:TextDataset
කණ්ඩායම්ප්රමාණය
61batch\_size:int=16
අනුක්රමයේදිග, හෝ සන්දර්භය ප්රමාණය
63seq\_len:int=512
වචනමාලාවේ ටෝකන් ගණන
65n\_tokens:int
ටෝකනයිසර්
67tokenizer:Callable='character'
නියැදීම්ආරම්භ කිරීමට පෙළ විමසුම (නිදර්ශනය සඳහා)
70prompt:str
නියැදීමේදීටෝකන් බෙදුම්කරු (අක්ෂර මට්ටමේ ටෝකනීකරණය සඳහා හිස්)
72prompt\_separator:str
වරින්වර ආකෘති සුරැකීමට යන්න
75is\_save\_models=True
පාඩුශ්රිතය
78loss\_func=CrossEntropyLoss()
නිරවද්යතාශ්රිතය
80accuracy=Accuracy()
ආදර්ශකාවැද්දීමේ ප්රමාණය
82d\_model:int=512
ශ්රේණියේක්ලිපින්
84grad\_norm\_clip:float=1.0
පුහුණුදත්ත පැටවුම
87train\_loader:DataLoader='shuffled\_train\_loader'
වලංගුදත්ත පැටවුම
89valid\_loader:DataLoader='shuffled\_valid\_loader'
දත්තකාරකයන් ආදේශ කිරීම සමඟ මාරු වේ
92dataloader\_shuffle\_with\_replacement:bool=False
ආදර්ශපරාමිතීන් සහ අනුක්රමික ලඝු-සටහන යන්න (එක් එක් එක් එක් එක් වරක්). මේවා ස්ථරයකට සාරාංශගත සංඛ්යාන වේ, නමුත් එය තවමත් ඉතා ගැඹුරු ජාල සඳහා බොහෝ දර්ශක වලට හේතු විය හැකිය.
97is\_log\_model\_params\_grads:bool=False
ආදර්ශසක්රිය කිරීම් ලොග් කළ යුතුද යන්න (එක් එක් ඊපෝච් එකකට වරක්). මේවා ස්ථරයකට සාරාංශගත සංඛ්යාන වේ, නමුත් එය තවමත් ඉතා ගැඹුරු ජාල සඳහා බොහෝ දර්ශක වලට හේතු විය හැකිය.
102is\_log\_model\_activations:bool=False
104definit(self):
ට්රැකර්වින්යාසයන් සකසන්න
109tracker.set\_scalar("accuracy.\*",True)110tracker.set\_scalar("loss.\*",True)111tracker.set\_text("sampled",False)
මොඩියුලප්රතිදානයන් ලොග් කිරීමට කොක්කක් එක් කරන්න
113hook\_model\_outputs(self.mode,self.model,'model')
රාජ්යමොඩියුලයක් ලෙස නිරවද්යතාව එක් කරන්න. RNs සඳහා පුහුණුව සහ වලංගු කිරීම අතර රාජ්යයන් ගබඩා කිරීම අදහස් කරන බැවින් නම බොහෝ විට ව්යාකූල වේ. මෙය පුහුණුව සහ වලංගු කිරීම සඳහා නිරවද්යතා මෙට්රික් සංඛ්යාන වෙනම තබා ගනී.
118self.state\_modules=[self.accuracy]
වෙනත්ප්රමිතික ගණනය කිරීමට හා ලොග් කිරීමට අභිබවා යන්න
120defother\_metrics(self,output:torch.Tensor,target:torch.Tensor):
122pass
124defstep(self,batch:any,batch\_idx:BatchIndex):
පුහුණු/evalමාදිලිය සකසන්න
130self.model.train(self.mode.is\_train)
උපාංගයවෙත දත්ත ගෙනයන්න
133data,target=batch[0].to(self.device),batch[1].to(self.device)
පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)
136ifself.mode.is\_train:137tracker.add\_global\_step(data.shape[0]\*data.shape[1])
ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න
140withself.mode.update(is\_log\_activations=batch\_idx.is\_lastandself.is\_log\_model\_activations):
ආදර්ශප්රතිදානයන් ලබා ගන්න. ආර්එන්එස් භාවිතා කරන විට එය ප්රාන්ත සඳහා ටූල් එකක් නැවත ලබා දෙයි. මෙය තවම ක්රියාත්මක කර නැත 😜
144output,\*\_=self.model(data)
ගණනයකිරීම සහ ලොග් වීම
147loss=self.loss\_func(output,target)148tracker.add("loss.",loss)
ගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය
151self.accuracy(output,target)152self.accuracy.track()153154self.other\_metrics(output,target)
ආකෘතියපුහුණු කරන්න
157ifself.mode.is\_train:
අනුක්රමිකගණනය කරන්න
159loss.backward()
ක්ලිප්අනුක්රමික
161torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=self.grad\_norm\_clip)
ප්රශස්තිකරණපියවර ගන්න
163self.optimizer.step()
සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න
165ifbatch\_idx.is\_lastandself.is\_log\_model\_params\_grads:166tracker.add('model',self.model)
අනුක්රමිකඉවත්
168self.optimizer.zero\_grad()
ලුහුබැඳඇති ප්රමිතික සුරකින්න
171tracker.save()
173defsample(self):
විමසුමක්ආරම්භ කිරීම
179prompt=self.prompt
මුද්රණයසඳහා ප්රතිදානය එකතු කරන්න
181log=[(prompt,Text.subtle)]
සාම්පල25 ටෝකන
183foriinmonit.iterate('Sample',25):
විමසුමටෝකෙන්කරන්න
185data=self.text.text\_to\_i(prompt).unsqueeze(-1)186data=data.to(self.device)
ආදර්ශප්රතිදානය ලබා ගන්න
188output,\*\_=self.model(data)
ආදර්ශඅනාවැකිය ලබා ගන්න (කෑදර)
190output=output.argmax(dim=-1).squeeze()
විමසුමටඅනාවැකිය එක් කරන්න
192prompt+=self.prompt\_separator+self.text.itos[output[-1]]
ලොග්වීම සඳහා අනාවැකිය එක් කරන්න
194log+=[(self.prompt\_separator+self.text.itos[output[-1]],Text.value)]195196tracker.add({'sampled':prompt})
නියැදිප්රතිදානය මුද්රණය කරන්න
198logger.log(log)
201@option(NLPAutoRegressionConfigs.optimizer)202def\_optimizer(c:NLPAutoRegressionConfigs):
207optimizer=OptimizerConfigs()208optimizer.parameters=c.model.parameters()209optimizer.optimizer='Adam'210optimizer.d\_model=c.d\_model211212returnoptimizer
ටෝකනගණන ලබා ගන්න
215@option(NLPAutoRegressionConfigs.n\_tokens)216def\_n\_tokens(c:NLPAutoRegressionConfigs):
220returnc.text.n\_tokens
මෙමඅත්හදා බැලීමේදී අපි චරිත මට්ටමේ ටෝකනයිසර් භාවිතා කරමු. සැකසීමෙන් ඔබට මාරු විය හැකිය,
'tokenizer': 'basic_english',
අත්හදාබැලීම ආරම්භ කිරීමේදී වින්යාස කිරීමේ ශබ්දකෝෂයේ.
223@option(NLPAutoRegressionConfigs.tokenizer)224defbasic\_english():
238fromtorchtext.dataimportget\_tokenizer239returnget\_tokenizer('basic\_english')
242defcharacter\_tokenizer(x:str):
246returnlist(x)
249@option(NLPAutoRegressionConfigs.tokenizer)250defcharacter():
254returncharacter\_tokenizer
නොමැතිනම් එය url එකෙන් බාගත කරනු ඇත
257@option(NLPAutoRegressionConfigs.text)258deftiny\_shakespeare(c:NLPAutoRegressionConfigs):
264returnTextFileDataset(265lab.get\_data\_path()/'tiny\_shakespeare.txt',266c.tokenizer,267url='https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt')
270@option(NLPAutoRegressionConfigs.train\_loader)271defsequential\_train\_loader(c:NLPAutoRegressionConfigs):
275returnSequentialDataLoader(text=c.text.train,276dataset=c.text,277batch\_size=c.batch\_size,278seq\_len=c.seq\_len)
281@option(NLPAutoRegressionConfigs.valid\_loader)282defsequential\_valid\_loader(c:NLPAutoRegressionConfigs):
286returnSequentialDataLoader(text=c.text.valid,287dataset=c.text,288batch\_size=c.batch\_size,289seq\_len=c.seq\_len)
DataLoader පළමු මානය මත කණ්ඩායම් එකතු කරයි. අපි එය පළමුව අනුපිළිවෙලට සම්ප්රේෂණය කළ යුතුය.
292deftranspose\_batch(batch):
300transposed\_data=list(zip(\*batch))
දෙවනමානය ඔස්සේ කණ්ඩායම ගොඩගසන්න dim=1
302src=torch.stack(transposed\_data[0],dim=1)303tgt=torch.stack(transposed\_data[1],dim=1)304305returnsrc,tgt
308@option(NLPAutoRegressionConfigs.train\_loader)309defshuffled\_train\_loader(c:NLPAutoRegressionConfigs):
313dataset=SequentialUnBatchedDataset(text=c.text.train,314dataset=c.text,315seq\_len=c.seq\_len)316sampler=RandomSampler(dataset,replacement=c.dataloader\_shuffle\_with\_replacement)317318returnDataLoader(dataset,319batch\_size=c.batch\_size,320collate\_fn=transpose\_batch,321sampler=sampler)
324@option(NLPAutoRegressionConfigs.valid\_loader)325defshuffled\_valid\_loader(c:NLPAutoRegressionConfigs):
329dataset=SequentialUnBatchedDataset(text=c.text.valid,330dataset=c.text,331seq\_len=c.seq\_len)332sampler=RandomSampler(dataset,replacement=c.dataloader\_shuffle\_with\_replacement)333334returnDataLoader(dataset,335batch\_size=c.batch\_size,336collate\_fn=transpose\_batch,337sampler=sampler)