පැච්ඔබට අවශ්ය සියලුම ද? (කොන්වී මික්සර්)

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

ConvMixer diagram from the paper

ConvMixer MLP-මික්සර්සමාන වේ. එම්එල්පී-මික්සර් අවකාශීය හා නාලිකා මානයන් මිශ්ර කිරීම වෙන් කරයි, අවකාශීය මානය හරහා එම්එල්පී යෙදීමෙන් සහ පසුව නාලිකා මානය හරහා එම්එල්පී යෙදීමෙන් (අවකාශීය එම්එල්පී වීඅයිටී අවධානය ප්රතිස්ථාපනය කරන අතර නාලිකාව එම්එල්පී යනු එෆ්එෆ්එන් වේ vit).

ConvMixerනාලිකාව මිශ්ර කිරීම සඳහා convvolution සහ අවකාශීය මිශ්ර කිරීම සඳහා ගැඹුර-wise convolution භාවිතා කරයි. එය අවකාශය හරහා සම්පූර්ණ එම්එල්පී වෙනුවට කැටි ගැස්වීමක් බැවින්, එය VIT හෝ MLP-මික්සර් වලට වඩා වෙනස්ව අසල ඇති කාණ්ඩ පමණක් මිශ්ර කරයි. එසේම, MLP-මික්සර් එක් එක් මිශ්රණය සඳහා ස්ථර දෙකක MLPs භාවිතා කරන අතර ConvMixer එක් එක් මිශ්රණය සඳහා තනි ස්ථරයක් භාවිතා කරයි.

කඩදාසිනිර්දේශ කරන්නේ නාලිකා මිශ්රණය හරහා ඇති අවශේෂ සම්බන්ධතාවය ඉවත් කිරීම (ලක්ෂ්ය-අනුව කැටි ගැන්විම) සහ අවකාශීය මිශ්රණයට වඩා අවශේෂ සම්බන්ධතාවයක් පමණක් තිබීම (ගැඹුර-wise convolution) ය. ස්ථර සාමාන්යකරණය වෙනුවට කණ්ඩායම් සාමාන්යකරණය ද ඔවුන් භාවිතා කරයි.

CIFRA-10 හි ConvMixer පුහුණු කරන අත්හදා බැලීමක් මෙන්න.

View Run

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

ConvMixer

මෙයපැච් කාවැද්දීම් බ්ලොක්, කොන්වීමික්සර් ස්ථර ගණනාවක් සහ වර්ගීකරණ හිසක් ඒකාබද්ධ කරයි.

174class ConvMixer(Module):
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