Skip to content

Commit 560eae3

Browse files
authored
[WIP] Add ResNet-RS models (huggingface#554)
* Add ResNet-RS models * Only include resnet-rs changes * remove whitespace diff * EOF newline * Update time * increase time * Add first conv * Try running only resnetv2_101x1_bitm on Linux runner * Add to exclude filter * Run test_model_forward_features for all * Add to exclude ftrs * back to defaults * only run test_forward_features * run all tests * Run all tests * Add bigger resnetrs to model filters to fix Github CLI * Remove resnetv2_101x1_bitm from exclude feat features * Remove hardcoded values * Make sure reduction ratio in resnetrs is 0.25 * There is no bias in replaced maxpool so remove it
1 parent 9cc7dda commit 560eae3

File tree

2 files changed

+93
-11
lines changed

2 files changed

+93
-11
lines changed

tests/test_models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
if 'GITHUB_ACTIONS' in os.environ: # and 'Linux' in platform.system():
2323
# GitHub Linux runner is slower and hits memory limits sooner than MacOS, exclude bigger models
2424
EXCLUDE_FILTERS = [
25-
'*efficientnet_l2*', '*resnext101_32x48d', '*in21k', '*152x4_bitm', '*101x3_bitm',
26-
'*nfnet_f3*', '*nfnet_f4*', '*nfnet_f5*', '*nfnet_f6*', '*nfnet_f7*'] + NON_STD_FILTERS
25+
'*efficientnet_l2*', '*resnext101_32x48d', '*in21k', '*152x4_bitm',
26+
'*nfnet_f3*', '*nfnet_f4*', '*nfnet_f5*', '*nfnet_f6*', '*nfnet_f7*',
27+
'*resnetrs200*', '*resnetrs270*', '*resnetrs350*', '*resnetrs420*'] + NON_STD_FILTERS
2728
else:
2829
EXCLUDE_FILTERS = NON_STD_FILTERS
2930

timm/models/resnet.py

Lines changed: 90 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,23 @@ def _cfg(url='', **kwargs):
236236
interpolation='bicubic'),
237237
'resnetblur50': _cfg(
238238
url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnetblur50-84f4748f.pth',
239-
interpolation='bicubic')
239+
interpolation='bicubic'),
240+
241+
# ResNet-RS models
242+
'resnetrs50': _cfg(
243+
interpolation='bicubic', first_conv='conv1.0'),
244+
'resnetrs101': _cfg(
245+
interpolation='bicubic', first_conv='conv1.0'),
246+
'resnetrs152': _cfg(
247+
interpolation='bicubic', first_conv='conv1.0'),
248+
'resnetrs200': _cfg(
249+
interpolation='bicubic', first_conv='conv1.0'),
250+
'resnetrs270': _cfg(
251+
interpolation='bicubic', first_conv='conv1.0'),
252+
'resnetrs350': _cfg(
253+
interpolation='bicubic', first_conv='conv1.0'),
254+
'resnetrs420': _cfg(
255+
interpolation='bicubic', first_conv='conv1.0'),
240256
}
241257

242258

@@ -318,7 +334,7 @@ class Bottleneck(nn.Module):
318334

319335
def __init__(self, inplanes, planes, stride=1, downsample=None, cardinality=1, base_width=64,
320336
reduce_first=1, dilation=1, first_dilation=None, act_layer=nn.ReLU, norm_layer=nn.BatchNorm2d,
321-
attn_layer=None, aa_layer=None, drop_block=None, drop_path=None):
337+
attn_layer=None, aa_layer=None, drop_block=None, drop_path=None, **kwargs):
322338
super(Bottleneck, self).__init__()
323339

324340
width = int(math.floor(planes * (base_width / 64)) * cardinality)
@@ -341,7 +357,7 @@ def __init__(self, inplanes, planes, stride=1, downsample=None, cardinality=1, b
341357
self.conv3 = nn.Conv2d(width, outplanes, kernel_size=1, bias=False)
342358
self.bn3 = norm_layer(outplanes)
343359

344-
self.se = create_attn(attn_layer, outplanes)
360+
self.se = create_attn(attn_layer, outplanes, **kwargs)
345361

346362
self.act3 = act_layer(inplace=True)
347363
self.downsample = downsample
@@ -545,11 +561,12 @@ def __init__(self, block, layers, num_classes=1000, in_chans=3,
545561
cardinality=1, base_width=64, stem_width=64, stem_type='',
546562
output_stride=32, block_reduce_first=1, down_kernel_size=1, avg_down=False,
547563
act_layer=nn.ReLU, norm_layer=nn.BatchNorm2d, aa_layer=None, drop_rate=0.0, drop_path_rate=0.,
548-
drop_block_rate=0., global_pool='avg', zero_init_last_bn=True, block_args=None):
564+
drop_block_rate=0., global_pool='avg', zero_init_last_bn=True, block_args=None, replace_stem_max_pool=False):
549565
block_args = block_args or dict()
550566
assert output_stride in (8, 16, 32)
551567
self.num_classes = num_classes
552568
self.drop_rate = drop_rate
569+
self.replace_stem_max_pool = replace_stem_max_pool
553570
super(ResNet, self).__init__()
554571

555572
# Stem
@@ -574,12 +591,19 @@ def __init__(self, block, layers, num_classes=1000, in_chans=3,
574591
self.feature_info = [dict(num_chs=inplanes, reduction=2, module='act1')]
575592

576593
# Stem Pooling
577-
if aa_layer is not None:
578-
self.maxpool = nn.Sequential(*[
579-
nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
580-
aa_layer(channels=inplanes, stride=2)])
594+
if not self.replace_stem_max_pool:
595+
if aa_layer is not None:
596+
self.maxpool = nn.Sequential(*[
597+
nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
598+
aa_layer(channels=inplanes, stride=2)])
599+
else:
600+
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
581601
else:
582-
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
602+
self.maxpool = nn.Sequential(*[
603+
nn.Conv2d(inplanes, inplanes, 3, stride=2, padding=1, bias=False),
604+
norm_layer(inplanes),
605+
act_layer(inplace=True)
606+
])
583607

584608
# Feature Blocks
585609
channels = [64, 128, 256, 512]
@@ -1065,6 +1089,63 @@ def ecaresnet50d(pretrained=False, **kwargs):
10651089
return _create_resnet('ecaresnet50d', pretrained, **model_args)
10661090

10671091

1092+
@register_model
1093+
def resnetrs50(pretrained=False, **kwargs):
1094+
model_args = dict(
1095+
block=Bottleneck, layers=[3, 4, 6, 3], stem_width=32, stem_type='deep', replace_stem_max_pool=True,
1096+
avg_down=True, block_args=dict(attn_layer='se', reduction_ratio=0.25), **kwargs)
1097+
return _create_resnet('resnetrs50', pretrained, **model_args)
1098+
1099+
1100+
@register_model
1101+
def resnetrs101(pretrained=False, **kwargs):
1102+
model_args = dict(
1103+
block=Bottleneck, layers=[3, 4, 23, 3], stem_width=32, stem_type='deep', replace_stem_max_pool=True,
1104+
avg_down=True, block_args=dict(attn_layer='se', reduction_ratio=0.25), **kwargs)
1105+
return _create_resnet('resnetrs101', pretrained, **model_args)
1106+
1107+
1108+
@register_model
1109+
def resnetrs152(pretrained=False, **kwargs):
1110+
model_args = dict(
1111+
block=Bottleneck, layers=[3, 8, 36, 3], stem_width=32, stem_type='deep', replace_stem_max_pool=True,
1112+
avg_down=True, block_args=dict(attn_layer='se', reduction_ratio=0.25), **kwargs)
1113+
return _create_resnet('resnetrs152', pretrained, **model_args)
1114+
1115+
1116+
@register_model
1117+
def resnetrs200(pretrained=False, **kwargs):
1118+
model_args = dict(
1119+
block=Bottleneck, layers=[3, 24, 36, 3], stem_width=32, stem_type='deep', replace_stem_max_pool=True,
1120+
avg_down=True, block_args=dict(attn_layer='se', reduction_ratio=0.25), **kwargs)
1121+
return _create_resnet('resnetrs200', pretrained, **model_args)
1122+
1123+
1124+
@register_model
1125+
def resnetrs270(pretrained=False, **kwargs):
1126+
model_args = dict(
1127+
block=Bottleneck, layers=[4, 29, 53, 4], stem_width=32, stem_type='deep', replace_stem_max_pool=True,
1128+
avg_down=True, block_args=dict(attn_layer='se', reduction_ratio=0.25), **kwargs)
1129+
return _create_resnet('resnetrs270', pretrained, **model_args)
1130+
1131+
1132+
1133+
@register_model
1134+
def resnetrs350(pretrained=False, **kwargs):
1135+
model_args = dict(
1136+
block=Bottleneck, layers=[4, 36, 72, 4], stem_width=32, stem_type='deep', replace_stem_max_pool=True,
1137+
avg_down=True, block_args=dict(attn_layer='se', reduction_ratio=0.25), **kwargs)
1138+
return _create_resnet('resnetrs350', pretrained, **model_args)
1139+
1140+
1141+
@register_model
1142+
def resnetrs420(pretrained=False, **kwargs):
1143+
model_args = dict(
1144+
block=Bottleneck, layers=[4, 44, 87, 4], stem_width=32, stem_type='deep', replace_stem_max_pool=True,
1145+
avg_down=True, block_args=dict(attn_layer='se', reduction_ratio=0.25), **kwargs)
1146+
return _create_resnet('resnetrs420', pretrained, **model_args)
1147+
1148+
10681149
@register_model
10691150
def ecaresnet50d_pruned(pretrained=False, **kwargs):
10701151
"""Constructs a ResNet-50-D model pruned with eca.

0 commit comments

Comments
 (0)