|
import torch.nn as nn |
|
|
|
|
|
def build_act_layer(act_layer): |
|
if act_layer == 'ReLU': |
|
return nn.ReLU(inplace=True) |
|
elif act_layer == 'SiLU': |
|
return nn.SiLU(inplace=True) |
|
elif act_layer == 'GELU': |
|
return nn.GELU() |
|
|
|
raise NotImplementedError(f'build_act_layer does not support {act_layer}') |
|
|
|
|
|
def build_norm_layer(dim, |
|
norm_layer, |
|
in_format='channels_last', |
|
out_format='channels_last', |
|
eps=1e-6): |
|
layers = [] |
|
if norm_layer == 'BN': |
|
if in_format == 'channels_last': |
|
layers.append(to_channels_first()) |
|
layers.append(nn.BatchNorm2d(dim)) |
|
if out_format == 'channels_last': |
|
layers.append(to_channels_last()) |
|
elif norm_layer == 'LN': |
|
if in_format == 'channels_first': |
|
layers.append(to_channels_last()) |
|
layers.append(nn.LayerNorm(dim, eps=eps)) |
|
if out_format == 'channels_first': |
|
layers.append(to_channels_first()) |
|
else: |
|
raise NotImplementedError( |
|
f'build_norm_layer does not support {norm_layer}') |
|
return nn.Sequential(*layers) |
|
|
|
|
|
class to_channels_first(nn.Module): |
|
|
|
def __init__(self): |
|
super().__init__() |
|
|
|
def forward(self, x): |
|
return x.permute(0, 3, 1, 2) |
|
|
|
|
|
class to_channels_last(nn.Module): |
|
|
|
def __init__(self): |
|
super().__init__() |
|
|
|
def forward(self, x): |
|
return x.permute(0, 2, 3, 1) |
|
|