කණ්ඩායම-නාලිකාසාමාන්යකරණය

මෙය PyTorch ක්රියාත්මක කිරීමකි කණ්ඩායම-නාලිකා සාමාන්යකරණය සහ බර ප්රමිතිකරණය සමඟ කඩදාසි මයික්රෝ-කණ්ඩායම් පුහුණුව වෙතින් කණ්ඩායම්-නාලිකා සාමාන්යකරණය . බර ප්රමිතිකරණය පිළිබඳ විකෘත ක්රියාත්මක කිරීමක්ද අප සතුව ඇත.

කණ්ඩායම්-නාලිකාසාමාන්යකරණය කණ්ඩායම් සාමාන්යකරණය සිදු කරන අතර පසුව නාලිකා සාමාන්යකරණය ( කණ්ඩායම් සාමාන්යකරණයටසමාන වේ. කණ්ඩායම් ප්රමාණය කුඩා වන විට කණ්ඩායම් සාමාන්යකරණය සඳහා ධාවන මධ්යන්යයක් සහ විචලතාව භාවිතා කරයි.

CIFA-10දත්ත වර්ගීකරණය කිරීම සඳහා බර ප්රමිතිකරණය භාවිතා කරන VGG ජාලයක් පුහුණු කිරීම සඳහා පුහුණු කේතය මෙන්න.

Open In Colab View Run

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 ** 2

ඝාතීයවෙනස්වන සාමාන්යය යාවත්කාලීන

153                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)