මෙය 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_list
45class 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 x
174class 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 = classification
ConvMixer ස්ථරයේ පිටපත් සාදන්න
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