|
import torch |
|
import torch.nn as nn |
|
import torch.nn.functional as F |
|
from mGPT.models.notused import AdaptiveInstanceNorm1d |
|
|
|
|
|
class MLP(nn.Module): |
|
|
|
def __init__(self, cfg, out_dim, is_init): |
|
super(MLP, self).__init__() |
|
dims = cfg.MODEL.MOTION_DECODER.MLP_DIM |
|
n_blk = len(dims) |
|
norm = 'none' |
|
acti = 'lrelu' |
|
|
|
layers = [] |
|
for i in range(n_blk - 1): |
|
layers += LinearBlock(dims[i], dims[i + 1], norm=norm, acti=acti) |
|
layers += LinearBlock(dims[-1], out_dim, norm='none', acti='none') |
|
self.model = nn.Sequential(*layers) |
|
|
|
if is_init: |
|
for m in self.modules(): |
|
if isinstance(m, nn.Linear): |
|
|
|
nn.init.constant_(m.weight, 1) |
|
elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): |
|
nn.init.constant_(m.weight, 1) |
|
nn.init.constant_(m.bias, 0) |
|
|
|
def forward(self, x): |
|
return self.model(x.view(x.size(0), -1)) |
|
|
|
|
|
def ZeroPad1d(sizes): |
|
return nn.ConstantPad1d(sizes, 0) |
|
|
|
|
|
def get_acti_layer(acti='relu', inplace=True): |
|
|
|
if acti == 'relu': |
|
return [nn.ReLU(inplace=inplace)] |
|
elif acti == 'lrelu': |
|
return [nn.LeakyReLU(0.2, inplace=inplace)] |
|
elif acti == 'tanh': |
|
return [nn.Tanh()] |
|
elif acti == 'none': |
|
return [] |
|
else: |
|
assert 0, "Unsupported activation: {}".format(acti) |
|
|
|
|
|
def get_norm_layer(norm='none', norm_dim=None): |
|
|
|
if norm == 'bn': |
|
return [nn.BatchNorm1d(norm_dim)] |
|
elif norm == 'in': |
|
|
|
return [nn.InstanceNorm1d(norm_dim, affine=True)] |
|
elif norm == 'adain': |
|
return [AdaptiveInstanceNorm1d(norm_dim)] |
|
elif norm == 'none': |
|
return [] |
|
else: |
|
assert 0, "Unsupported normalization: {}".format(norm) |
|
|
|
|
|
def get_dropout_layer(dropout=None): |
|
if dropout is not None: |
|
return [nn.Dropout(p=dropout)] |
|
else: |
|
return [] |
|
|
|
|
|
def ConvLayers(kernel_size, |
|
in_channels, |
|
out_channels, |
|
stride=1, |
|
pad_type='reflect', |
|
use_bias=True): |
|
""" |
|
returns a list of [pad, conv] => should be += to some list, then apply sequential |
|
""" |
|
|
|
if pad_type == 'reflect': |
|
pad = nn.ReflectionPad1d |
|
elif pad_type == 'replicate': |
|
pad = nn.ReplicationPad1d |
|
elif pad_type == 'zero': |
|
pad = ZeroPad1d |
|
else: |
|
assert 0, "Unsupported padding type: {}".format(pad_type) |
|
|
|
pad_l = (kernel_size - 1) // 2 |
|
pad_r = kernel_size - 1 - pad_l |
|
return [ |
|
pad((pad_l, pad_r)), |
|
nn.Conv1d(in_channels, |
|
out_channels, |
|
kernel_size=kernel_size, |
|
stride=stride, |
|
bias=use_bias) |
|
] |
|
|
|
|
|
def ConvBlock(kernel_size, |
|
in_channels, |
|
out_channels, |
|
stride=1, |
|
pad_type='reflect', |
|
dropout=None, |
|
norm='none', |
|
acti='lrelu', |
|
acti_first=False, |
|
use_bias=True, |
|
inplace=True): |
|
""" |
|
returns a list of [pad, conv, norm, acti] or [acti, pad, conv, norm] |
|
""" |
|
|
|
layers = ConvLayers(kernel_size, |
|
in_channels, |
|
out_channels, |
|
stride=stride, |
|
pad_type=pad_type, |
|
use_bias=use_bias) |
|
layers += get_dropout_layer(dropout) |
|
layers += get_norm_layer(norm, norm_dim=out_channels) |
|
acti_layers = get_acti_layer(acti, inplace=inplace) |
|
|
|
if acti_first: |
|
return acti_layers + layers |
|
else: |
|
return layers + acti_layers |
|
|
|
|
|
def LinearBlock(in_dim, out_dim, dropout=None, norm='none', acti='relu'): |
|
|
|
use_bias = True |
|
layers = [] |
|
layers.append(nn.Linear(in_dim, out_dim, bias=use_bias)) |
|
layers += get_dropout_layer(dropout) |
|
layers += get_norm_layer(norm, norm_dim=out_dim) |
|
layers += get_acti_layer(acti) |
|
|
|
return layers |
|
|