මෙය PyTorch කඩදාසි ක්රියාත්මක කිරීමයි පැච් ඔබට අවශ්යද? .

ConvMixer MLP-මික්සර්සමාන වේ. එම්එල්පී-මික්සර් අවකාශීය හා නාලිකා මානයන් මිශ්ර කිරීම වෙන් කරයි, අවකාශීය මානය හරහා එම්එල්පී යෙදීමෙන් සහ පසුව නාලිකා මානය හරහා එම්එල්පී යෙදීමෙන් (අවකාශීය එම්එල්පී වීඅයිටී අවධානය ප්රතිස්ථාපනය කරන අතර නාලිකාව එම්එල්පී යනු එෆ්එෆ්එන් වේ vit).
ConvMixerනාලිකාව මිශ්ර කිරීම සඳහා convvolution සහ අවකාශීය මිශ්ර කිරීම සඳහා ගැඹුර-wise convolution භාවිතා කරයි. එය අවකාශය හරහා සම්පූර්ණ එම්එල්පී වෙනුවට කැටි ගැස්වීමක් බැවින්, එය VIT හෝ MLP-මික්සර් වලට වඩා වෙනස්ව අසල ඇති කාණ්ඩ පමණක් මිශ්ර කරයි. එසේම, MLP-මික්සර් එක් එක් මිශ්රණය සඳහා ස්ථර දෙකක MLPs භාවිතා කරන අතර ConvMixer එක් එක් මිශ්රණය සඳහා තනි ස්ථරයක් භාවිතා කරයි.
කඩදාසිනිර්දේශ කරන්නේ නාලිකා මිශ්රණය හරහා ඇති අවශේෂ සම්බන්ධතාවය ඉවත් කිරීම (ලක්ෂ්ය-අනුව කැටි ගැන්විම) සහ අවකාශීය මිශ්රණයට වඩා අවශේෂ සම්බන්ධතාවයක් පමණක් තිබීම (ගැඹුර-wise convolution) ය. ස්ථර සාමාන්යකරණය වෙනුවට කණ්ඩායම් සාමාන්යකරණය ද ඔවුන් භාවිතා කරයි.
38import torch
39from torch import nn
40
41from labml_helpers.module import Module
42from labml_nn.utils import clone_module_list45class ConvMixerLayer(Module):d_model
 පැච් කාවැද්දීම් වල නාලිකා ගණන,  kernel_size
 අවකාශීය සංවහනයේ කර්නලයේ ප්රමාණය, 54    def __init__(self, d_model: int, kernel_size: int):59        super().__init__()ගැඹුරු-ප්රඥාවන්තසංකෝචනය යනු එක් එක් නාලිකාව සඳහා වෙනම කැටි ගැසුමකි. නාලිකා සංඛ්යාවට සමාන කණ්ඩායම් සංඛ්යාවක් සමඟ සංකෝචනය වන ස්ථරයක් සමඟ අපි මෙය සිදු කරමු. එබැවින් සෑම නාලිකාවක්ම තමන්ගේම කණ්ඩායමක් වේ.
63        self.depth_wise_conv = nn.Conv2d(d_model, d_model,
64                                         kernel_size=kernel_size,
65                                         groups=d_model,
66                                         padding=(kernel_size - 1) // 2)ගැඹුරු-අනුවකැටි ගැසීමෙන් පසු සක්රිය කිරීම
68        self.act1 = nn.GELU()ගැඹුරු-අනුවකැටි ගැසීමෙන් පසු සාමාන්යකරණය
70        self.norm1 = nn.BatchNorm2d(d_model)ලක්ෂ්ය-නැණවත්කැටි ගැසීමකි. එනම් පැච් කාවැද්දීම් රේඛීය පරිවර්තනයකි
74        self.point_wise_conv = nn.Conv2d(d_model, d_model, kernel_size=1)ලක්ෂ්යයඅනුව කැටි ගැසීමෙන් පසු සක්රිය කිරීම
76        self.act2 = nn.GELU()ලක්ෂ්යයඅනුව කැටි ගැසීමෙන් පසු සාමාන්යකරණය
78        self.norm2 = nn.BatchNorm2d(d_model)80    def forward(self, x: torch.Tensor):ගැඹුර-නැණවත්කැටි කිරීම වටා ඇති අවශේෂ සම්බන්ධතාවය සඳහා
82        residual = xගැඹුරු-නැණවත්කැටි කිරීම, සක්රිය කිරීම සහ සාමාන්යකරණය කිරීම
85        x = self.depth_wise_conv(x)
86        x = self.act1(x)
87        x = self.norm1(x)අවශේෂසම්බන්ධතාවය එක් කරන්න
90        x += residualලක්ෂ්ය-නැණවත්කැටි ගැන්විම, සක්රිය කිරීම සහ සාමාන්යකරණය
93        x = self.point_wise_conv(x)
94        x = self.act2(x)
95        x = self.norm2(x)98        return xමෙයරූපය ප්රමාණයෙන් පැච් වලට බෙදෙන අතර එක් එක් පැච් සඳහා කාවැද්දීම ලබා දෙයි.
101class PatchEmbeddings(Module):d_model
 පැච් කාවැද්දීම් වල නාලිකා ගණන  patch_size
 පැච් වල ප්රමාණය,  in_channels
 ආදාන රූපයේ නාලිකා ගණන (rgb සඳහා 3)110    def __init__(self, d_model: int, patch_size: int, in_channels: int):116        super().__init__()අපිකර්නල් ප්රමාණයෙන් හා ලප ප්රමාණය සමාන stride දිග සමග convolution ස්ථරය නිර්මාණය කරන්න. මෙය රූපය පැච් වලට බෙදීමට හා එක් එක් පැච් එකේ රේඛීය පරිවර්තනයක් කිරීමට සමාන වේ.
121        self.conv = nn.Conv2d(in_channels, d_model, kernel_size=patch_size, stride=patch_size)සක්රියකිරීමේ කාර්යය
123        self.act = nn.GELU()කණ්ඩායම්සාමාන්යකරණය
125        self.norm = nn.BatchNorm2d(d_model)x
 යනු හැඩයේ ආදාන රූපයයි [batch_size, channels, height, width]
127    def forward(self, x: torch.Tensor):කැටිගැසුණු ස්ථරය යොදන්න
132        x = self.conv(x)සක්රියකිරීම සහ සාමාන්යකරණය
134        x = self.act(x)
135        x = self.norm(x)138        return xරූපපංතිවල ලොග්-සම්භාවිතාවන් පුරෝකථනය කිරීම සඳහා ඔවුන් සාමාන්ය තටාක කිරීම (සියලු පැච් කාවැද්දීම් වල මධ්යන්යය ගනිමින්) සහ අවසාන රේඛීය පරිවර්තනයක් සිදු කරයි.
141class ClassificationHead(Module):d_model
 පැච් කාවැද්දීම් වල නාලිකා ගණන,  n_classes
 වර්ගීකරණ කාර්යයේ පන්ති ගණන වේ151    def __init__(self, d_model: int, n_classes: int):156        super().__init__()සාමාන්යතටාකය
158        self.pool = nn.AdaptiveAvgPool2d((1, 1))රේඛීයස්ථරය
160        self.linear = nn.Linear(d_model, n_classes)162    def forward(self, x: torch.Tensor):සාමාන්යතටාක
164        x = self.pool(x)කාවැද්දීමලබා ගන්න, හැඩය x
 ඇත [batch_size, d_model, 1, 1]
 
166        x = x[:, :, 0, 0]රේඛීයස්ථරය
168        x = self.linear(x)171        return x174class ConvMixer(Module):conv_mixer_layer
 තනි ConvMixer ස්ථරයේපිටපතක් වේ. ConvMixer සමඟ එය සෑදීමට අපි එහි පිටපත් සාදන්නෙමු n_layers
. n_layers
 ConVMixer ස්ථර (හෝ ගැඹුර) සංඛ්යාව වේ. patch_emb
 පැච් කාවැද්දීම් ස්ථරයවේ. classification
 වර්ගීකරණ හිසවේ. 181    def __init__(self, conv_mixer_layer: ConvMixerLayer, n_layers: int,
182                 patch_emb: PatchEmbeddings,
183                 classification: ClassificationHead):191        super().__init__()පැච්කාවැද්දීම්
193        self.patch_emb = patch_embවර්ගීකරණහිස
195        self.classification = classificationConvMixer ස්ථරයේ පිටපත් සාදන්න
197        self.conv_mixer_layers = clone_module_list(conv_mixer_layer, n_layers)x
 යනු හැඩයේ ආදාන රූපයයි [batch_size, channels, height, width]
199    def forward(self, x: torch.Tensor):පැච්කාවැද්දීම් ලබා ගන්න. මෙය හැඩයේ ආතතිකයක් ලබා දෙයි [batch_size, d_model, height / patch_size, width / patch_size]
. 
204        x = self.patch_emb(x)ConvMixer ස්ථර හරහා ගමන් කරන්න
207        for layer in self.conv_mixer_layers:
208            x = layer(x)වර්ගීකරණහිස, පිවිසුම් ලබා ගැනීමට
211        x = self.classification(x)214        return x