This is an unofficial PyTorch implementation by Ignacio Oguiza - oguiza@gmail.com based on:
class ResBlockPlus[source]
ResBlockPlus(ni,nf,ks=[7, 5, 3],coord=False,separable=False,bn_1st=True,zero_norm=False,sa=False,se=None,act=ReLU,act_kwargs={}) ::Module
Same as nn.Module, but no need for subclasses to call super().__init__
class ResNetPlus[source]
ResNetPlus(c_in,c_out,seq_len=None,nf=64,sa=False,se=None,fc_dropout=0.0,concat_pool=False,flatten=False,custom_head=None,y_range=None,ks=[7, 5, 3],coord=False,separable=False,bn_1st=True,zero_norm=False,act=ReLU,act_kwargs={}) ::Sequential
A sequential container. Modules will be added to it in the order they are passed in the constructor. Alternatively, an ordered dict of modules can also be passed in.
To make it easier to understand, here is a small example::
# Example of using Sequential
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
# Example of using Sequential with OrderedDict
model = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1,20,5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20,64,5)),
('relu2', nn.ReLU())
]))
xb = torch.rand(2, 3, 4)
test_eq(ResNetPlus(3,2)(xb).shape, [xb.shape[0], 2])
test_eq(ResNetPlus(3,2,coord=True, separable=True, bn_1st=False, zero_norm=True, act=Swish, act_kwargs={}, fc_dropout=0.5)(xb).shape, [xb.shape[0], 2])
test_eq(total_params(ResNetPlus(3, 2))[0], 479490) # for (3,2)
from tsai.models.ResNet import *
test_eq(total_params(ResNet(3, 2))[0], total_params(ResNetPlus(3, 2))[0]) # for (3,2)
m = ResNetPlus(3, 2, zero_norm=True, coord=True, separable=True)
print('n_params:', total_params(m)[0])
print(m)
print(check_weight(m, is_bn)[0])
n_params: 114820
ResNetPlus(
(backbone): Sequential(
(0): ResBlockPlus(
(convblock1): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(4, 4, kernel_size=(7,), stride=(1,), padding=(3,), groups=4, bias=False)
(pointwise_conv): Conv1d(4, 64, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): ReLU()
)
(convblock2): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(65, 65, kernel_size=(5,), stride=(1,), padding=(2,), groups=65, bias=False)
(pointwise_conv): Conv1d(65, 64, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): ReLU()
)
(convblock3): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(65, 65, kernel_size=(3,), stride=(1,), padding=(1,), groups=65, bias=False)
(pointwise_conv): Conv1d(65, 64, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(shortcut): ConvBlock(
(0): AddCoords1d()
(1): Conv1d(4, 64, kernel_size=(1,), stride=(1,), bias=False)
(2): BatchNorm1d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(add): Add
(act): ReLU()
)
(1): ResBlockPlus(
(convblock1): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(65, 65, kernel_size=(7,), stride=(1,), padding=(3,), groups=65, bias=False)
(pointwise_conv): Conv1d(65, 128, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): ReLU()
)
(convblock2): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(129, 129, kernel_size=(5,), stride=(1,), padding=(2,), groups=129, bias=False)
(pointwise_conv): Conv1d(129, 128, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): ReLU()
)
(convblock3): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(129, 129, kernel_size=(3,), stride=(1,), padding=(1,), groups=129, bias=False)
(pointwise_conv): Conv1d(129, 128, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(shortcut): ConvBlock(
(0): AddCoords1d()
(1): Conv1d(65, 128, kernel_size=(1,), stride=(1,), bias=False)
(2): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(add): Add
(act): ReLU()
)
(2): ResBlockPlus(
(convblock1): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(129, 129, kernel_size=(7,), stride=(1,), padding=(3,), groups=129, bias=False)
(pointwise_conv): Conv1d(129, 128, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): ReLU()
)
(convblock2): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(129, 129, kernel_size=(5,), stride=(1,), padding=(2,), groups=129, bias=False)
(pointwise_conv): Conv1d(129, 128, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(3): ReLU()
)
(convblock3): ConvBlock(
(0): AddCoords1d()
(1): SeparableConv1d(
(depthwise_conv): Conv1d(129, 129, kernel_size=(3,), stride=(1,), padding=(1,), groups=129, bias=False)
(pointwise_conv): Conv1d(129, 128, kernel_size=(1,), stride=(1,), bias=False)
)
(2): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(shortcut): BatchNorm1d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(add): Add
(act): ReLU()
)
)
(head): Sequential(
(0): GAP1d(
(gap): AdaptiveAvgPool1d(output_size=1)
(flatten): Flatten(full=False)
)
(1): Linear(in_features=128, out_features=2, bias=True)
)
)
[1. 1. 0. 1. 1. 1. 0. 1. 1. 1. 0. 1.]