|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import torch |
|
import torch.nn as nn |
|
|
|
from RepCodec.repcodec.layers.conv_layer import Conv1d |
|
from RepCodec.repcodec.modules.residual_unit import ResidualUnit |
|
|
|
|
|
class EncoderBlock(nn.Module): |
|
def __init__( |
|
self, |
|
in_channels: int, |
|
out_channels: int, |
|
stride: int, |
|
dilations=(1, 1), |
|
unit_kernel_size=3, |
|
bias=True |
|
): |
|
super().__init__() |
|
self.res_units = torch.nn.ModuleList() |
|
for dilation in dilations: |
|
self.res_units += [ |
|
ResidualUnit(in_channels, in_channels, |
|
kernel_size=unit_kernel_size, |
|
dilation=dilation) |
|
] |
|
self.num_res = len(self.res_units) |
|
|
|
self.conv = Conv1d( |
|
in_channels=in_channels, |
|
out_channels=out_channels, |
|
kernel_size=3 if stride == 1 else (2 * stride), |
|
stride=stride, |
|
bias=bias, |
|
) |
|
|
|
def forward(self, x): |
|
for idx in range(self.num_res): |
|
x = self.res_units[idx](x) |
|
x = self.conv(x) |
|
return x |
|
|
|
|
|
class Encoder(nn.Module): |
|
def __init__( |
|
self, |
|
input_channels: int, |
|
encode_channels: int, |
|
channel_ratios=(1, 1), |
|
strides=(1, 1), |
|
kernel_size=3, |
|
bias=True, |
|
block_dilations=(1, 1), |
|
unit_kernel_size=3 |
|
): |
|
super().__init__() |
|
assert len(channel_ratios) == len(strides) |
|
|
|
self.conv = Conv1d( |
|
in_channels=input_channels, |
|
out_channels=encode_channels, |
|
kernel_size=kernel_size, |
|
stride=1, |
|
bias=False |
|
) |
|
self.conv_blocks = torch.nn.ModuleList() |
|
in_channels = encode_channels |
|
for idx, stride in enumerate(strides): |
|
out_channels = int(encode_channels * channel_ratios[idx]) |
|
self.conv_blocks += [ |
|
EncoderBlock(in_channels, out_channels, stride, |
|
dilations=block_dilations, unit_kernel_size=unit_kernel_size, |
|
bias=bias) |
|
] |
|
in_channels = out_channels |
|
self.num_blocks = len(self.conv_blocks) |
|
self.out_channels = out_channels |
|
|
|
def forward(self, x): |
|
x = self.conv(x) |
|
for i in range(self.num_blocks): |
|
x = self.conv_blocks[i](x) |
|
return x |
|
|