diff --git a/timm/models/resnet.py b/timm/models/resnet.py index abde4063..9e05f278 100644 --- a/timm/models/resnet.py +++ b/timm/models/resnet.py @@ -97,6 +97,9 @@ default_cfgs = { 'seresnext26t_32x4d': _cfg( url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext26t_32x4d-361bc1c4.pth', interpolation='bicubic'), + 'seresnext26tn_32x4d': _cfg( + url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext26tn_32x4d-569cb627.pth', + interpolation='bicubic'), } @@ -318,7 +321,7 @@ class ResNet(nn.Module): stem_chs_1 = stem_chs_2 = stem_width if 'tiered' in stem_type: stem_chs_1 = 3 * (stem_width // 4) - stem_chs_2 = 6 * (stem_width // 4) + stem_chs_2 = stem_width if 'narrow' in stem_type else 6 * (stem_width // 4) self.conv1 = nn.Sequential(*[ nn.Conv2d(in_chans, stem_chs_1, 3, stride=2, padding=1, bias=False), norm_layer(stem_chs_1), @@ -893,7 +896,8 @@ def swsl_resnext101_32x16d(pretrained=True, **kwargs): @register_model def seresnext26d_32x4d(pretrained=False, num_classes=1000, in_chans=3, **kwargs): """Constructs a SE-ResNeXt-26-D model. - This is technically a 28 layer ResNet, sticking with 'D' modifier from Gluon / bag-of-tricks. + This is technically a 28 layer ResNet, using the 'D' modifier from Gluon / bag-of-tricks for + combination of deep stem and avg_pool in downsample. """ default_cfg = default_cfgs['seresnext26d_32x4d'] model = ResNet( @@ -910,7 +914,7 @@ def seresnext26d_32x4d(pretrained=False, num_classes=1000, in_chans=3, **kwargs) def seresnext26t_32x4d(pretrained=False, num_classes=1000, in_chans=3, **kwargs): """Constructs a SE-ResNet-26-T model. This is technically a 28 layer ResNet, like a 'D' bag-of-tricks model but with tiered 24, 48, 64 channels - in the deep stem. Stem channel counts suggested by Jeremy Howard. + in the deep stem. """ default_cfg = default_cfgs['seresnext26t_32x4d'] model = ResNet( @@ -921,3 +925,20 @@ def seresnext26t_32x4d(pretrained=False, num_classes=1000, in_chans=3, **kwargs) if pretrained: load_pretrained(model, default_cfg, num_classes, in_chans) return model + + +@register_model +def seresnext26tn_32x4d(pretrained=False, num_classes=1000, in_chans=3, **kwargs): + """Constructs a SE-ResNeXt-26-TN model. + This is technically a 28 layer ResNet, like a 'D' bag-of-tricks model but with tiered 24, 32, 64 channels + in the deep stem. The channel number of the middle stem conv is narrower than the 'T' variant. + """ + default_cfg = default_cfgs['seresnext26tn_32x4d'] + model = ResNet( + Bottleneck, [2, 2, 2, 2], cardinality=32, base_width=4, + stem_width=32, stem_type='deep_tiered_narrow', avg_down=True, use_se=True, + num_classes=num_classes, in_chans=in_chans, **kwargs) + model.default_cfg = default_cfg + if pretrained: + load_pretrained(model, default_cfg, num_classes, in_chans) + return model