123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- from fastai.layers import *
- from fastai.torch_core import *
- from torch.nn.parameter import Parameter
- from torch.autograd import Variable
- # The code below is meant to be merged into fastaiv1 ideally
- def custom_conv_layer(
- ni: int,
- nf: int,
- ks: int = 3,
- stride: int = 1,
- padding: int = None,
- bias: bool = None,
- is_1d: bool = False,
- norm_type: Optional[NormType] = NormType.Batch,
- use_activ: bool = True,
- leaky: float = None,
- transpose: bool = False,
- init: Callable = nn.init.kaiming_normal_,
- self_attention: bool = False,
- extra_bn: bool = False,
- ):
- "Create a sequence of convolutional (`ni` to `nf`), ReLU (if `use_activ`) and batchnorm (if `bn`) layers."
- if padding is None:
- padding = (ks - 1) // 2 if not transpose else 0
- bn = norm_type in (NormType.Batch, NormType.BatchZero) or extra_bn == True
- if bias is None:
- bias = not bn
- conv_func = nn.ConvTranspose2d if transpose else nn.Conv1d if is_1d else nn.Conv2d
- conv = init_default(
- conv_func(ni, nf, kernel_size=ks, bias=bias, stride=stride, padding=padding),
- init,
- )
- if norm_type == NormType.Weight:
- conv = weight_norm(conv)
- elif norm_type == NormType.Spectral:
- conv = spectral_norm(conv)
- layers = [conv]
- if use_activ:
- layers.append(relu(True, leaky=leaky))
- if bn:
- layers.append((nn.BatchNorm1d if is_1d else nn.BatchNorm2d)(nf))
- if self_attention:
- layers.append(SelfAttention(nf))
- return nn.Sequential(*layers)
|