මෙය PyTorch ක්රියාත්මක කිරීමකි කණ්ඩායම-නාලිකා සාමාන්යකරණය සහ බර ප්රමිතිකරණය සමඟ කඩදාසි මයික්රෝ-කණ්ඩායම් පුහුණුව වෙතින් කණ්ඩායම්-නාලිකා සාමාන්යකරණය . බර ප්රමිතිකරණය පිළිබඳ විකෘත ක්රියාත්මක කිරීමක්ද අප සතුව ඇත.
කණ්ඩායම්-නාලිකාසාමාන්යකරණය කණ්ඩායම් සාමාන්යකරණය සිදු කරන අතර පසුව නාලිකා සාමාන්යකරණය ( කණ්ඩායම් සාමාන්යකරණයටසමාන වේ. කණ්ඩායම් ප්රමාණය කුඩා වන විට කණ්ඩායම් සාමාන්යකරණය සඳහා ධාවන මධ්යන්යයක් සහ විචලතාව භාවිතා කරයි.
CIFA-10දත්ත වර්ගීකරණය කිරීම සඳහා බර ප්රමිතිකරණය භාවිතා කරන VGG ජාලයක් පුහුණු කිරීම සඳහා පුහුණු කේතය මෙන්න.
26import torch
27from torch import nn
28
29from labml_helpers.module import Module
30from labml_nn.normalization.batch_norm import BatchNormමෙයමුලින්ම කණ්ඩායම් සාමාන්යකරණය සිදු කරයි - එක්කෝ සාමාන්ය කණ්ඩායම් සම්මතය හෝ ඇස්තමේන්තුගත මධ්යන්ය හා විචලතාව සහිත කණ්ඩායම් නියමයක් (බහු කාණ්ඩවලට වඩා on ාතීය අර්ථය/විචලතාව). එවිට නාලිකා සාමාන්යකරණය සිදු කරන ලදී.
33class BatchChannelNorm(Module):channels
යනු ආදානයේ ඇති විශේෂාංග ගණන groups
යනු කණ්ඩායම් ගණන විශේෂාංග වලට බෙදා ඇත eps
සංඛ්යාත්මක ස්ථායිතාව සඳහා භාවිතා වේ momentum
ඝාතීය වෙනස්වන සාමාන්යය ගනිමින් ගම්යතාව වේ estimate
කණ්ඩායම් සම්මතය සඳහා ධාවන මධ්යන්යය සහ විචලතාව භාවිතා කළ යුතුද යන්නයි43 def __init__(self, channels: int, groups: int,
44 eps: float = 1e-5, momentum: float = 0.1, estimate: bool = True):52 super().__init__()ඇස්තමේන්තුගතකණ්ඩායම් සම්මතය හෝ සාමාන්ය කණ්ඩායම් සම්මතය භාවිතා කරන්න.
55 if estimate:
56 self.batch_norm = EstimatedBatchNorm(channels,
57 eps=eps, momentum=momentum)
58 else:
59 self.batch_norm = BatchNorm(channels,
60 eps=eps, momentum=momentum)නාලිකාසාමාන්යකරණය
63 self.channel_norm = ChannelNorm(channels, groups, eps)65 def forward(self, x):
66 x = self.batch_norm(x)
67 return self.channel_norm(x)ආදානය රූප නිරූපණ සමූහයක් වන විට, කණ්ඩායම් ප්රමාණය කොතැනද, නාලිකා ගණන, උස සහ පළල වේ. සහ .
කොහෙද,
ධාවනමධ්යන්යය සහ විචල්යයන් වේ. ඝාතීය මධ්යන්යය ගණනය කිරීම සඳහා ගම්යතාව වේ.
70class EstimatedBatchNorm(Module):channels
යනු ආදානයේ ඇති විශේෂාංග ගණන eps
සංඛ්යාත්මක ස්ථායිතාව සඳහා භාවිතා වේ momentum
ඝාතීය වෙනස්වන සාමාන්යය ගනිමින් ගම්යතාව වේ estimate
කණ්ඩායම් සම්මතය සඳහා ධාවන මධ්යන්යය සහ විචලතාව භාවිතා කළ යුතුද යන්නයි91 def __init__(self, channels: int,
92 eps: float = 1e-5, momentum: float = 0.1, affine: bool = True):99 super().__init__()
100
101 self.eps = eps
102 self.momentum = momentum
103 self.affine = affine
104 self.channels = channelsනාලිකානැණවත් පරිවර්තන පරාමිතීන්
107 if self.affine:
108 self.scale = nn.Parameter(torch.ones(channels))
109 self.shift = nn.Parameter(torch.zeros(channels))සඳහාටෙන්සර්ස් සහ
112 self.register_buffer('exp_mean', torch.zeros(channels))
113 self.register_buffer('exp_var', torch.ones(channels)) x
හැඩයේ ආතන්ය [batch_size, channels, *]
වේ. *
ඕනෑම සංඛ්යාවක් (සමහරවිට 0) මානයන් දක්වයි. උදාහරණයක් ලෙස, රූපයක් (2D) සංකෝචනය තුළ මෙය වනු ඇත [batch_size, channels, height, width]
115 def forward(self, x: torch.Tensor):පැරණිහැඩය තබා ගන්න
123 x_shape = x.shapeකණ්ඩායම්ප්රමාණය ලබා ගන්න
125 batch_size = x_shape[0]විශේෂාංගගණන නිවැරදි බව තහවුරු කර ගැනීම සඳහා සනීපාරක්ෂාව පරීක්ෂා කරන්න
128 assert self.channels == x.shape[1]නැවතහැඩගස්වා ගන්න [batch_size, channels, n]
131 x = x.view(batch_size, self.channels, -1)යාවත්කාලීනකිරීම සහ පුහුණු ප්රකාරයේදී පමණි
134 if self.training:හරහා පසුගාමී ප්රචාරණයක් නොමැත
136 with torch.no_grad():පළමුහා අවසාන මානයන් හරහා මධ්යන්යය ගණනය කරන්න;
139 mean = x.mean(dim=[0, 2])පළමුහා අවසාන මානයන් හරහා චතුරස්රාකාර මධ්යන්යය ගණනය කරන්න;
142 mean_x2 = (x ** 2).mean(dim=[0, 2])එක්එක් ලක්ෂණය සඳහා විචලතාව
145 var = mean_x2 - mean ** 2153 self.exp_mean = (1 - self.momentum) * self.exp_mean + self.momentum * mean
154 self.exp_var = (1 - self.momentum) * self.exp_var + self.momentum * varසාමාන්යකරන්න
158 x_norm = (x - self.exp_mean.view(1, -1, 1)) / torch.sqrt(self.exp_var + self.eps).view(1, -1, 1)පරිමාණයසහ මාරුව
163 if self.affine:
164 x_norm = self.scale.view(1, -1, 1) * x_norm + self.shift.view(1, -1, 1)මුල්පිටපතට නැවත හැඩගස්වා නැවත පැමිණීම
167 return x_norm.view(x_shape)මෙය සමූහ සාමාන්යකරණයට සමාන වන නමුත් ඇෆයින් පරිණාමනය කණ්ඩායම් නැණවත් ලෙස සිදු කෙරේ.
170class ChannelNorm(Module):groups
යනු කණ්ඩායම් ගණන විශේෂාංග වලට බෙදා ඇත channels
යනු ආදානයේ ඇති විශේෂාංග ගණන eps
සංඛ්යාත්මක ස්ථායිතාව සඳහා භාවිතා වේ affine
සාමාන්යකරණය කළ අගය පරිමාණය කර මාරු කළ යුතුද යන්නයි177 def __init__(self, channels, groups,
178 eps: float = 1e-5, affine: bool = True):185 super().__init__()
186 self.channels = channels
187 self.groups = groups
188 self.eps = eps
189 self.affine = affineඇෆයින්පරිවර්තනය සඳහා පරාමිතීන්.
මෙමපරිවර්තනයන් එක් කණ්ඩායමකට බව සලකන්න, කණ්ඩායම් සම්මතයේ මෙන් නොව, ඒවා පරිවර්තනය කරන නාලිකා අනුව පරිවර්තනය වේ.
194 if self.affine:
195 self.scale = nn.Parameter(torch.ones(groups))
196 self.shift = nn.Parameter(torch.zeros(groups)) x
හැඩයේ ආතන්ය [batch_size, channels, *]
වේ. *
ඕනෑම සංඛ්යාවක් (සමහරවිට 0) මානයන් දක්වයි. උදාහරණයක් ලෙස, රූපයක් (2D) සංකෝචනය තුළ මෙය වනු ඇත [batch_size, channels, height, width]
198 def forward(self, x: torch.Tensor):මුල්හැඩය තබා ගන්න
207 x_shape = x.shapeකණ්ඩායම්ප්රමාණය ලබා ගන්න
209 batch_size = x_shape[0]විශේෂාංගගණන සමාන බව තහවුරු කර ගැනීම සඳහා සනීපාරක්ෂාව පරීක්ෂා කරන්න
211 assert self.channels == x.shape[1]නැවතහැඩගස්වා ගන්න [batch_size, groups, n]
214 x = x.view(batch_size, self.groups, -1)අවසානමානය හරහා මධ්යන්යය ගණනය කරන්න; එනම් එක් එක් නියැදිය සහ නාලිකා කණ්ඩායම සඳහා මාධ්යයන්
218 mean = x.mean(dim=[-1], keepdim=True)අවසානමානය හරහා වර්ග කළ මධ්යන්යය ගණනය කරන්න; එනම් එක් එක් නියැදිය සහ නාලිකා කණ්ඩායම සඳහා මාධ්යයන්
221 mean_x2 = (x ** 2).mean(dim=[-1], keepdim=True)එක්එක් නියැදිය සහ විශේෂාංග කණ්ඩායම සඳහා විචලතාව
224 var = mean_x2 - mean ** 2සාමාන්යකරන්න
229 x_norm = (x - mean) / torch.sqrt(var + self.eps)කණ්ඩායම්අනුව පරිමාණය සහ මාරුව
233 if self.affine:
234 x_norm = self.scale.view(1, -1, 1) * x_norm + self.shift.view(1, -1, 1)මුල්පිටපතට නැවත හැඩගස්වා නැවත පැමිණීම
237 return x_norm.view(x_shape)