Spaces:
Running
Running
| import torch | |
| import torch.nn as nn | |
| from torch.nn import Conv1d | |
| from torch.nn.utils import weight_norm, remove_weight_norm | |
| from .alias.act import SnakeAlias | |
| def init_weights(m, mean=0.0, std=0.01): | |
| classname = m.__class__.__name__ | |
| if classname.find("Conv") != -1: | |
| m.weight.data.normal_(mean, std) | |
| def get_padding(kernel_size, dilation=1): | |
| return int((kernel_size*dilation - dilation)/2) | |
| class AMPBlock(torch.nn.Module): | |
| def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): | |
| super(AMPBlock, self).__init__() | |
| self.convs1 = nn.ModuleList([ | |
| weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[0], | |
| padding=get_padding(kernel_size, dilation[0]))), | |
| weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[1], | |
| padding=get_padding(kernel_size, dilation[1]))), | |
| weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[2], | |
| padding=get_padding(kernel_size, dilation[2]))) | |
| ]) | |
| self.convs1.apply(init_weights) | |
| self.convs2 = nn.ModuleList([ | |
| weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, | |
| padding=get_padding(kernel_size, 1))), | |
| weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, | |
| padding=get_padding(kernel_size, 1))), | |
| weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, | |
| padding=get_padding(kernel_size, 1))) | |
| ]) | |
| self.convs2.apply(init_weights) | |
| # total number of conv layers | |
| self.num_layers = len(self.convs1) + len(self.convs2) | |
| # periodic nonlinearity with snakebeta function and anti-aliasing | |
| self.activations = nn.ModuleList([ | |
| SnakeAlias(channels) for _ in range(self.num_layers) | |
| ]) | |
| def forward(self, x): | |
| acts1, acts2 = self.activations[::2], self.activations[1::2] | |
| for c1, c2, a1, a2 in zip(self.convs1, self.convs2, acts1, acts2): | |
| xt = a1(x) | |
| xt = c1(xt) | |
| xt = a2(xt) | |
| xt = c2(xt) | |
| x = xt + x | |
| return x | |
| def remove_weight_norm(self): | |
| for l in self.convs1: | |
| remove_weight_norm(l) | |
| for l in self.convs2: | |
| remove_weight_norm(l) |