docs/si/transformers/vit/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/transformers/vit/ init.py)
මෙයඅ පයිටෝච් කඩදාසි ක්රියාත්මක කිරීම රූපයක් වටිනවා 16x16 වචන: පරිමාණයෙන් රූප හඳුනාගැනීම සඳහා ට්රාන්ස්ෆෝමර් .
දර්ශනට්රාන්ස්ෆෝමරය කිසිදු කැටි ගැසුණු ස්ථර නොමැතිව රූප සඳහා පිරිසිදු ට්රාන්ස්ෆෝමරයක් යොදයි. ඔවුන් රූපය පැච් බවට බෙදී ඇති අතර පැච් කාවැද්දීම් මත ට්රාන්ස්ෆෝමරයක් යොදයි. පැච් කාවැද්දීම් ජනනය කරනු ලබන්නේ පැච් වල පැතලි පික්සල් අගයන් සඳහා සරල රේඛීය පරිවර්තනයක් යෙදීමෙනි. එවිට සම්මත ට්රාන්ස්ෆෝමර් එන්කෝඩරයක් පැච් කාවැද්දීම් සමඟ වර්ගීකරණ ටෝකනයක් සමඟ පෝෂණය [CLS] වේ. රූපය එම්එල්පී සමඟ වර්ගීකරණය කිරීම සඳහා [CLS] ටෝකනයේ කේතනය භාවිතා කරයි.
පැච්සමඟ ට්රාන්ස්ෆෝමරය පෝෂණය කරන විට, පැච් කාවැද්දීම් වලට උගත් ස්ථානීය කාවැද්දීම් එකතු කරනු ලැබේ, මන්ද එම පැච් කාවැද්දීම් වලින් එම පැච් එක කොතැනද යන්න පිළිබඳ කිසිදු තොරතුරක් නොමැති බැවිනි. ස්ථානීය කාවැද්දීම් යනු එක් එක් පැච් ස්ථානය සඳහා දෛශික සමූහයක් වන අතර අනෙක් පරාමිතීන් සමඟ ශ්රේණියේ සම්භවය සමඟ පුහුණු වේ.
විශාලදත්ත කට්ටල පිළිබඳ පූර්ව පුහුණුව ලැබූ විට VITs හොඳින් ක්රියා කරයි. කඩදාසි යෝජනා කරන්නේ එම්එල්පී වර්ගීකරණ හිසක් සමඟ ඒවා පෙර පුහුණු කිරීම සහ හොඳින් සුසර කිරීමේදී තනි රේඛීය තට්ටුවක් භාවිතා කිරීමයි. කඩදාසි මිලියන 300 ක රූප දත්ත කට්ටලයක් මත පෙර පුහුණු කරන ලද VIT සමඟ SOTA පරාජය කරයි. පැච් ප්රමාණය එලෙසම තබා ගනිමින් අනුමානය අතරතුර ඔවුන් ඉහළ විභේදන රූප භාවිතා කරයි. නව පැච් ස්ථාන සඳහා ස්ථානීය කාවැද්දීම් ගණනය කරනු ලබන්නේ ස්ථානීය කාවැද්දීම් ඉගෙනීම අන්තර්ග්රහණය කිරීමෙනි.
CIFA-10 හි VIT පුහුණු කරන අත්හදා බැලීමක් මෙන්න. එය කුඩා දත්ත සමුදාය මත පුහුණු වෙනවා නිසා මෙය ඉතා හොඳින් කරන්නේ නැහැ. එය ඕනෑම කෙනෙකුට VITs සමඟ ධාවනය කර සෙල්ලම් කළ හැකි සරල අත්හදා බැලීමකි.
45importtorch46fromtorchimportnn4748fromlabml\_helpers.moduleimportModule49fromlabml\_nn.transformersimportTransformerLayer50fromlabml\_nn.utilsimportclone\_module\_list
කඩදාසිරූපය සමාන ප්රමාණයේ පැච් වලට බෙදී ඇති අතර එක් එක් පැච් එක සඳහා පැතලි පික්සල් මත රේඛීය පරිවර්තනයක් සිදු කරයි.
අපිඑකම දේ ක්රියාත්මක කිරීම සරල නිසා, කැටි ගැසුණු ස්ථරයක් හරහා ක්රියාත්මක කරමු.
53classPatchEmbeddings(Module):
d_model ට්රාන්ස්ෆෝමර් කාවැද්දීම් ප්රමාණය වේpatch_size පැච් වල ප්රමාණයයිin_channels ආදාන රූපයේ නාලිකා ගණන (rgb සඳහා 3)65def\_\_init\_\_(self,d\_model:int,patch\_size:int,in\_channels:int):
71super().\_\_init\_\_()
අපිකර්නල් ප්රමාණයෙන් හා ලප ප්රමාණය සමාන stride දිග සමග convolution ස්ථරය නිර්මාණය කරන්න. මෙය රූපය පැච් වලට බෙදීමට හා එක් එක් පැච් එකේ රේඛීය පරිවර්තනයක් කිරීමට සමාන වේ.
76self.conv=nn.Conv2d(in\_channels,d\_model,patch\_size,stride=patch\_size)
x යනු හැඩයේ ආදාන රූපයයි [batch_size, channels, height, width]78defforward(self,x:torch.Tensor):
කැටිගැසුණු ස්ථරය යොදන්න
83x=self.conv(x)
හැඩයලබා ගන්න.
85bs,c,h,w=x.shape
හැඩයටනැවත සකස් කරන්න [patches, batch_size, d_model]
87x=x.permute(2,3,0,1)88x=x.view(h\*w,bs,c)
පැච්කාවැද්දීම් ආපසු ලබා දෙන්න
91returnx
මෙයපැච් කාවැද්දීම් සඳහා උගත් ස්ථානීය කාවැද්දීම් එකතු කරයි.
94classLearnedPositionalEmbeddings(Module):
d_model ට්රාන්ස්ෆෝමර් කාවැද්දීම් ප්රමාණය වේmax_len පැච් වල උපරිම ගණන103def\_\_init\_\_(self,d\_model:int,max\_len:int=5\_000):
108super().\_\_init\_\_()
එක්එක් ස්ථානය සඳහා ස්ථානීය කාවැද්දීම්
110self.positional\_encodings=nn.Parameter(torch.zeros(max\_len,1,d\_model),requires\_grad=True)
x හැඩයේ පැච් කාවැද්දීම් වේ [patches, batch_size, d_model]112defforward(self,x:torch.Tensor):
දීඇති පැච් සඳහා ස්ථානීය කාවැද්දීම් ලබා ගන්න
117pe=self.positional\_encodings[:x.shape[0]]
පැච්කාවැද්දීම් වලට එකතු කර ආපසු යන්න
119returnx+pe
[CLS] ටෝකන් කාවැද්දීම මත පදනම්ව රූපය වර්ගීකරණය කිරීම සඳහා ස්ථර දෙකේ එම්එල්පී හිස මෙයයි.
122classClassificationHead(Module):
d_model ට්රාන්ස්ෆෝමර් කාවැද්දීම ප්රමාණය වේn_hidden සැඟවුණු ස්ථරයේ ප්රමාණයයිn_classes වර්ගීකරණ කාර්යයේ පන්ති ගණන වේ130def\_\_init\_\_(self,d\_model:int,n\_hidden:int,n\_classes:int):
136super().\_\_init\_\_()
පළමුස්ථරය
138self.linear1=nn.Linear(d\_model,n\_hidden)
සක්රීයකිරීම
140self.act=nn.ReLU()
දෙවනස්ථරය
142self.linear2=nn.Linear(n\_hidden,n\_classes)
x``[CLS] ටෝකනය සඳහා ට්රාන්ස්ෆෝමර් කේතනය වේ144defforward(self,x:torch.Tensor):
පළමුස්ථරය සහ සක්රිය කිරීම
149x=self.act(self.linear1(x))
දෙවනස්ථරය
151x=self.linear2(x)
154returnx
මෙය පැච් කාවැද්දීම්, ස්ථානීය කාවැද්දීම්, ට්රාන්ස්ෆෝමර්සහ වර්ගීකරණ හිසඒකාබද්ධ කරයි.
157classVisionTransformer(Module):
transformer_layer යනු තනි ට්රාන්ස්ෆෝමර් ස්ථරයකපිටපතක්. ට්රාන්ස්ෆෝමරය සෑදීම සඳහා අපි එහි පිටපත් සාදන්නෙමු n_layers .n_layersට්රාන්ස්ෆෝමර් ස්ථරගණන වේ.patch_embපැච් කාවැද්දීම් ස්ථරයවේ.pos_emb යනු ස්ථානීය කාවැද්දීම් ස්ථරයයි.classificationවර්ගීකරණ හිසවේ.165def\_\_init\_\_(self,transformer\_layer:TransformerLayer,n\_layers:int,166patch\_emb:PatchEmbeddings,pos\_emb:LearnedPositionalEmbeddings,167classification:ClassificationHead):
176super().\_\_init\_\_()
පැච්කාවැද්දීම්
178self.patch\_emb=patch\_emb179self.pos\_emb=pos\_emb
වර්ගීකරණහිස
181self.classification=classification
ට්රාන්ස්ෆෝමර්ස්ථරයේ පිටපත් සාදන්න
183self.transformer\_layers=clone\_module\_list(transformer\_layer,n\_layers)
[CLS] කාවැද්දීම ටෝකනය
186self.cls\_token\_emb=nn.Parameter(torch.randn(1,1,transformer\_layer.size),requires\_grad=True)
අවසානසාමාන්යකරණ ස්තරය
188self.ln=nn.LayerNorm([transformer\_layer.size])
x යනු හැඩයේ ආදාන රූපයයි [batch_size, channels, height, width]190defforward(self,x:torch.Tensor):
පැච්කාවැද්දීම් ලබා ගන්න. මෙය හැඩයේ ආතතිකයක් ලබා දෙයි [patches, batch_size, d_model]
195x=self.patch\_emb(x)
ස්ථානීයකාවැද්දීම් එකතු කරන්න
197x=self.pos\_emb(x)
ට්රාන්ස්ෆෝමරයපෝෂණය කිරීමට පෙර [CLS] ටෝකන් කාවැද්දීම් සංයුක්ත කරන්න
199cls\_token\_emb=self.cls\_token\_emb.expand(-1,x.shape[1],-1)200x=torch.cat([cls\_token\_emb,x])
කිසිදුඅවධානයක් ආවරණ සහිත ට්රාන්ස්ෆෝමර් ස්ථර හරහා ගමන් කරන්න
203forlayerinself.transformer\_layers:204x=layer(x=x,mask=None)
[CLS] ටෝකනයේ ට්රාන්ස්ෆෝමර් ප්රතිදානය ලබා ගන්න (එය අනුපිළිවෙලෙහි පළමු වේ).
207x=x[0]
ස්ථරයසාමාන්යකරණය
210x=self.ln(x)
වර්ගීකරණහිස, පිවිසුම් ලබා ගැනීමට
213x=self.classification(x)
216returnx