from torch import nn from torch.nn.utils.parametrize import remove_parametrizations # pylint: disable=dangerous-default-value class ResStack(nn.Module): def __init__(self, kernel, channel, padding, dilations=[1, 3, 5]): super().__init__() resstack = [] for dilation in dilations: resstack += [ nn.LeakyReLU(0.2), nn.ReflectionPad1d(dilation), nn.utils.parametrizations.weight_norm( nn.Conv1d(channel, channel, kernel_size=kernel, dilation=dilation) ), nn.LeakyReLU(0.2), nn.ReflectionPad1d(padding), nn.utils.parametrizations.weight_norm(nn.Conv1d(channel, channel, kernel_size=1)), ] self.resstack = nn.Sequential(*resstack) self.shortcut = nn.utils.parametrizations.weight_norm(nn.Conv1d(channel, channel, kernel_size=1)) def forward(self, x): x1 = self.shortcut(x) x2 = self.resstack(x) return x1 + x2 def remove_weight_norm(self): remove_parametrizations(self.shortcut, "weight") remove_parametrizations(self.resstack[2], "weight") remove_parametrizations(self.resstack[5], "weight") remove_parametrizations(self.resstack[8], "weight") remove_parametrizations(self.resstack[11], "weight") remove_parametrizations(self.resstack[14], "weight") remove_parametrizations(self.resstack[17], "weight") class MRF(nn.Module): def __init__(self, kernels, channel, dilations=[1, 3, 5]): # # pylint: disable=dangerous-default-value super().__init__() self.resblock1 = ResStack(kernels[0], channel, 0, dilations) self.resblock2 = ResStack(kernels[1], channel, 6, dilations) self.resblock3 = ResStack(kernels[2], channel, 12, dilations) def forward(self, x): x1 = self.resblock1(x) x2 = self.resblock2(x) x3 = self.resblock3(x) return x1 + x2 + x3 def remove_weight_norm(self): self.resblock1.remove_weight_norm() self.resblock2.remove_weight_norm() self.resblock3.remove_weight_norm()