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