Update SK network configs, add weights for skresnet8 and skresnext50

pull/87/head^2
Ross Wightman 5 years ago
parent 5e6dbbaf30
commit fa38f24967

@ -13,7 +13,7 @@ def _cfg(url='', **kwargs):
return { return {
'url': url, 'url': url,
'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': (7, 7), 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': (7, 7),
'crop_pct': 0.875, 'interpolation': 'bilinear', 'crop_pct': 0.875, 'interpolation': 'bicubic',
'mean': IMAGENET_DEFAULT_MEAN, 'std': IMAGENET_DEFAULT_STD, 'mean': IMAGENET_DEFAULT_MEAN, 'std': IMAGENET_DEFAULT_STD,
'first_conv': 'conv1', 'classifier': 'fc', 'first_conv': 'conv1', 'classifier': 'fc',
**kwargs **kwargs
@ -21,11 +21,13 @@ def _cfg(url='', **kwargs):
default_cfgs = { default_cfgs = {
'skresnet18': _cfg(url=''), 'skresnet18': _cfg(
'skresnet26d': _cfg(), url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/skresnet18_ra-4eec2804.pth'),
'skresnet34': _cfg(url=''),
'skresnet50': _cfg(), 'skresnet50': _cfg(),
'skresnet50d': _cfg(), 'skresnet50d': _cfg(),
'skresnext50_32x4d': _cfg(), 'skresnext50_32x4d': _cfg(
url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/skresnext50_ra-f40e40bf.pth'),
} }
@ -134,24 +136,10 @@ class SelectiveKernelBottleneck(nn.Module):
@register_model @register_model
def skresnet18(pretrained=False, num_classes=1000, in_chans=3, **kwargs): def skresnet18(pretrained=False, num_classes=1000, in_chans=3, **kwargs):
"""Constructs a ResNet-18 model. """Constructs a Selective Kernel ResNet-18 model.
"""
default_cfg = default_cfgs['skresnet18']
sk_kwargs = dict(
min_attn_channels=16,
)
model = ResNet(
SelectiveKernelBasic, [2, 2, 2, 2], num_classes=num_classes, in_chans=in_chans,
block_args=dict(sk_kwargs=sk_kwargs), **kwargs)
model.default_cfg = default_cfg
if pretrained:
load_pretrained(model, default_cfg, num_classes, in_chans)
return model
@register_model Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
def sksresnet18(pretrained=False, num_classes=1000, in_chans=3, **kwargs): variation splits the input channels to the selective convolutions to keep param count down.
"""Constructs a ResNet-18 model.
""" """
default_cfg = default_cfgs['skresnet18'] default_cfg = default_cfgs['skresnet18']
sk_kwargs = dict( sk_kwargs = dict(
@ -169,17 +157,21 @@ def sksresnet18(pretrained=False, num_classes=1000, in_chans=3, **kwargs):
@register_model @register_model
def skresnet26d(pretrained=False, num_classes=1000, in_chans=3, **kwargs): def skresnet34(pretrained=False, num_classes=1000, in_chans=3, **kwargs):
"""Constructs a ResNet-26 model. """Constructs a Selective Kernel ResNet-34 model.
Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
variation splits the input channels to the selective convolutions to keep param count down.
""" """
default_cfg = default_cfgs['skresnet26d'] default_cfg = default_cfgs['skresnet34']
sk_kwargs = dict( sk_kwargs = dict(
keep_3x3=False, min_attn_channels=16,
attn_reduction=8,
split_input=True
) )
model = ResNet( model = ResNet(
SelectiveKernelBottleneck, [2, 2, 2, 2], stem_width=32, stem_type='deep', avg_down=True, SelectiveKernelBasic, [3, 4, 6, 3], num_classes=num_classes, in_chans=in_chans,
num_classes=num_classes, in_chans=in_chans, block_args=dict(sk_kwargs=sk_kwargs), zero_init_last_bn=False block_args=dict(sk_kwargs=sk_kwargs), zero_init_last_bn=False, **kwargs)
**kwargs)
model.default_cfg = default_cfg model.default_cfg = default_cfg
if pretrained: if pretrained:
load_pretrained(model, default_cfg, num_classes, in_chans) load_pretrained(model, default_cfg, num_classes, in_chans)
@ -189,11 +181,12 @@ def skresnet26d(pretrained=False, num_classes=1000, in_chans=3, **kwargs):
@register_model @register_model
def skresnet50(pretrained=False, num_classes=1000, in_chans=3, **kwargs): def skresnet50(pretrained=False, num_classes=1000, in_chans=3, **kwargs):
"""Constructs a Select Kernel ResNet-50 model. """Constructs a Select Kernel ResNet-50 model.
Based on config in "Compounding the Performance Improvements of Assembled Techniques in a
Convolutional Neural Network" Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
variation splits the input channels to the selective convolutions to keep param count down.
""" """
sk_kwargs = dict( sk_kwargs = dict(
attn_reduction=2, split_input=True,
) )
default_cfg = default_cfgs['skresnet50'] default_cfg = default_cfgs['skresnet50']
model = ResNet( model = ResNet(
@ -208,11 +201,12 @@ def skresnet50(pretrained=False, num_classes=1000, in_chans=3, **kwargs):
@register_model @register_model
def skresnet50d(pretrained=False, num_classes=1000, in_chans=3, **kwargs): def skresnet50d(pretrained=False, num_classes=1000, in_chans=3, **kwargs):
"""Constructs a Select Kernel ResNet-50-D model. """Constructs a Select Kernel ResNet-50-D model.
Based on config in "Compounding the Performance Improvements of Assembled Techniques in a
Convolutional Neural Network" Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
variation splits the input channels to the selective convolutions to keep param count down.
""" """
sk_kwargs = dict( sk_kwargs = dict(
attn_reduction=2, split_input=True,
) )
default_cfg = default_cfgs['skresnet50d'] default_cfg = default_cfgs['skresnet50d']
model = ResNet( model = ResNet(

Loading…
Cancel
Save