docs/si/experiments/arithmetic_dataset.html
මෙය ජෝර්ජස් හාරික් (@gharik)විසින් කරන ලද කේතය මත පදනම් වේ.
11importrandom12importstring13fromtypingimportList1415importtorch16fromlabml.loggerimportText17fromtorch.utils.dataimportDataLoader,Dataset1819fromlabmlimportmonit,logger,tracker20fromlabml.configsimportoption21fromlabml\_nn.experiments.nlp\_autoregressionimportNLPAutoRegressionConfigs,transpose\_batch
මෙයඅංක ගණිතමය එකතු කිරීමේ ගැටළු සහ ක්රියාකාරිත්වය සමඟ විසඳුම් නිර්මාණය කරයි. අපි මෙතෙක් ක්රියාත්මක කර ඇත්තේ එකතු කිරීම පමණි.
එයපදනම් වී ඇත්තේ චරිත මට්ටමේ ටෝකනීකරණය මත ය.
24classArithmeticDataset(Dataset):
seq_len යනු ජනනය කරන ලද ගණිත ගැටළු වල අනුක්රමික දිගයි. මෙම දිග දක්වා අපි හැකි තරම් ගැටළු පුරවන්නෙමු: max_digits: යනු ඔපෙරන්ඩ් සංඛ්යාවේ උපරිම ඉලක්කම් සංඛ්යාව වේ: n_sequences: යනු එපෝච් එකකට අනුක්රම ගණනවේ
34def\_\_init\_\_(self,seq\_len:int,max\_digits:int,n\_sequences:int):
41self.n\_sequences=n\_sequences42self.max\_digits=max\_digits43self.seq\_len=seq\_len
නූලටටෝකන් හැඳුනුම්පත
45self.itos=list(string.digits+'xe =\n?+;')
අක්ෂරටෝකන් හැඳුනුම්පතට
47self.stoi={c:ifori,cinenumerate(self.itos)}
ඉලක්කම් n_digit ගණන සහිත පූර්ණ සංඛ්යාවක් ජනනය කරයි
49@staticmethod50defmake\_int(n\_digits:int):
54res=055foriinrange(n\_digits):56d=random.randrange(1,11)ifi==0elserandom.randrange(0,11)57res=res\*10+d5859returnres
සඳහාක්රියාකාරිත්වය ජනනය කරයි x + y . උදාහරණයක් ලෙස 11+29 එය ජනනය කිරීම සඳහා 1e0+9e0+0e0=10e0 1e0+2e0+1e0=4e0 .
61@staticmethod62defget\_add\_explanation(x:int,y:int):
69carry=070e=071explanation=[]72whilex\>0ory\>0orcarry\>0:73rx,ry=x%10,y%1074total=rx+ry+carry75explanation.append(f"{rx}e{e}+{ry}e{e}+{carry}e{e}=={total}e{e}")76x,y,carry=x//10,y//10,total//1077e+=17879return' '.join(explanation)
පූර්වපැහැදිලි කිරීමක් සමඟ ගැටළුවක් ඇති කරන්න හෝ නැත
workingsහා පිළිතුරු සමග අංක ගණිතමය එකතු කිරීමේ ගැටලුවක් නිර්මාණය කරයි.
82defmake\_add\_problem(self):
86x=self.make\_int(n\_digits=random.randrange(1,self.max\_digits+1))87y=self.make\_int(n\_digits=random.randrange(1,self.max\_digits+1))8889explanation=self.get\_add\_explanation(x,y)90returnf"x={x}+{y}; {explanation} x=={x+y}\n"
අංකගණිතමය ගැටළුව සහ පිළිතුරු ලබා ගන්න. මෙය ඇගයීම සඳහා භාවිතා වේ.
92defget\_qa(self):
96x=self.make\_int(n\_digits=random.randrange(1,self.max\_digits+1))97y=self.make\_int(n\_digits=random.randrange(1,self.max\_digits+1))9899returnf'x={x}+{y};',f'{x+y}'
බහුගැටළු ජනනය කර ඒවා අනුපිළිවෙලකට ඇසුරුම් කරන්න.
101defget\_packed\_math\_input(self):
105s\_enc=[]106whilelen(s\_enc)\<=self.seq\_len:107s\_part=self.make\_add\_problem()108s\_part\_enc=self.encode('?'+s\_part)109s\_enc=s\_enc+s\_part\_enc110returns\_enc
දීඇති නූලක් කේතනය කරන්න
112defencode(self,s:str):
116return[self.stoi[c]forcins]
ටෝකන්හැඳුනුම්පත් ලැයිස්තුවක් විකේතනය කරන්න
118defdecode(self,arr:List[int]):
122return''.join([self.itos[c]forcinarr])
ස්වයංක්රීයප්රතිගාමී ආකෘති නිර්මාණය සඳහා ආදාන සහ ඉලක්ක යුගලයක් ලබා ගන්න
124def\_\_getitem\_\_(self,idx:int):
128s=torch.tensor(self.get\_packed\_math\_input())129returns[:self.seq\_len],s[1:self.seq\_len+1]
එපෝච්එකකට අනුපිළිවෙලවල් ගණන
131def\_\_len\_\_(self):
135returnself.n\_sequences
138classArithmeticAutoregression(NLPAutoRegressionConfigs):
ක්රියාකාරීපූර්ණ සංඛ්යාවකට උපරිම ඉලක්කම් ගණන
143max\_digits:int=4
එපෝච්එකකට පුහුණු අනුපිළිවෙල ගණන
145train\_sequences\_per\_epoch:int=2\*\*12
පුහුණුදත්ත පැටවුම
147train\_loader:DataLoader='arithmetic\_train\_loader'
ඇගයීමේගැටළු ගණන
149n\_tests:int=64
වලංගුදත්ත කට්ටලයක් අවශ්ය නොවේ
151validator=None
එපෝච්එකකට ඇගයීම් ක්රියාත්මක කිරීමට වාර ගණන
153inner\_iterations=4
වචනමාලාවේ ටෝකන ගණන
155n\_tokens=len(ArithmeticDataset(1,1,1).itos)
ගැටළුසමූහයක් මත ආකෘතිය ඇගයීම සඳහා අපි නියැදි ශ්රිතය භාවිතා කරමු
[email protected]\_grad()158defsample(self):
පළමුඑපෝච් එකේ මඟ හරින්න
166ifself.training\_loop.idx\<1:167return
ගැටළුජනනය කිරීම සඳහා දත්ත කට්ටලයක් සාදන්න
170dataset=ArithmeticDataset(self.seq\_len,self.max\_digits,1)
ගැටළුසහ පිළිතුරු සමූහයක් ලබා ගන්න
172qa=[dataset.get\_qa()for\_inrange(self.n\_tests)]
ගැටළුපමණක් එකතු කරන්න
174questions=[p[0]forpinqa]
ආරම්භකටෝකනය පමණක් සහිත ටෙන්සරයක් සාදන්න
177data=torch.tensor([[dataset.stoi[p[0]]forpinquestions]])
උපාංගයවෙත ගෙන යන්න
179data=data.to(self.device)
සම්පූර්ණකර ඇති අනුක්රම ගණන
182finished=torch.zeros((len(questions),)).bool().to(self.device)
නවරේඛා අක්ෂරයෙහි ටෝකන් හැඳුනුම්පත - මෙය පිළිතුරේ අවසානය සලකුණු කරයි
184new\_line=dataset.stoi['\n']
නියැදිප්රති. ල
187results=[p[0]forpinquestions]
අනුක්රමිකදිග දක්වා නියැදිය
190foriinmonit.iterate('Sample',self.seq\_len-1):
සියලුමඅනුක්රමයන් සම්පූර්ණ කර ඇත්නම් අපි මෙය මඟ හරිමු
192iffinished.sum()==len(finished):193continue
ආදර්ශප්රතිදානය ලබා ගන්න
196output,\*\_=self.model(data)
ආදර්ශඅනාවැකිය ලබා ගන්න (කෑදර)
198output=output[-1].argmax(dim=-1)
කුමනඅනුපිළිවෙලවල් අවසන් කර ඇත්දැයි සොයා ගන්න
201finished=finished|(output==new\_line)
සියල්ලඅවසන් වී ඇත්නම් මඟ හරින්න
203iffinished.sum()==len(finished):204continue
ප්රශ්නයසමඟ අභිබවා යන්න
207forj,pinenumerate(questions):208iflen(p)\>i+1:209output[j]=dataset.stoi[p[i+1]]
ආදානයටඊළඟ ටෝකනය එක් කරන්න
212data=torch.cat([data,output[None,:]],dim=0)
නියැදිප්රතිඵල ලබා ගන්න
215forj,cinenumerate(output):216results[j]+=dataset.itos[c]
ප්රතිඵලවලපිළිතුරෙන් පසු සියල්ල ඉවතලන්න
219results=[r.split('\n')[0]forrinresults]
නියැදියක්ලොග් කරන්න
222res\_sample=results[0].split(';')223logger.log([(res\_sample[0],Text.key),(';',Text.subtle),(';'.join(res\_sample[1:]),Text.none)])
පිළිතුරුලබා ගන්න
226results=[r.split('x==')[-1]forrinresults]
නිවැරදිපිළිතුරු ගණන ගණන් කරන්න
229correct=0230forr,\_qainzip(results,qa):231ifr==\_qa[1]:232correct+=1
ලකුණුලොග් කරන්න
235tracker.save('score',correct/len(results))
පුහුණුදත්ත පැටවුම
238@option(ArithmeticAutoregression.train\_loader)239defarithmetic\_train\_loader(c:ArithmeticAutoregression):
243returnDataLoader(ArithmeticDataset(c.seq\_len,c.max\_digits,c.train\_sequences\_per\_epoch),244batch\_size=c.batch\_size,245collate\_fn=transpose\_batch,246num\_workers=4)
ජනනයකරන ලද ගැටළු පරීක්ෂා කිරීම සඳහා කේතය
249def\_test():
253dataset=ArithmeticDataset(256,8,10)254255print(dataset.decode(dataset.get\_packed\_math\_input()))
259if\_\_name\_\_=='\_\_main\_\_':260\_test()