| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266 |
- """PyTorch ResNet
- This started as a copy of https://github.com/pytorch/vision 'resnet.py' (BSD-3-Clause) with
- additional dropout and dynamic global avg/max pool.
- ResNeXt, SE-ResNeXt, SENet, and MXNet Gluon stem/downsample variants, tiered stems added by Ross Wightman
- Copyright 2019, Ross Wightman
- """
- import math
- from functools import partial
- from typing import Any, Dict, List, Optional, Tuple, Type, Union
- import torch
- import torch.nn as nn
- import torch.nn.functional as F
- from timm.data import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD
- from timm.layers import DropBlock2d, DropPath, AvgPool2dSame, BlurPool2d, LayerType, create_attn, \
- get_attn, get_act_layer, get_norm_layer, create_classifier, create_aa, to_ntuple
- from ._builder import build_model_with_cfg
- from ._features import feature_take_indices
- from ._manipulate import checkpoint_seq
- from ._registry import register_model, generate_default_cfgs, register_model_deprecations
- __all__ = ['ResNet', 'BasicBlock', 'Bottleneck'] # model_registry will add each entrypoint fn to this
- def get_padding(kernel_size: int, stride: int, dilation: int = 1) -> int:
- padding = ((stride - 1) + dilation * (kernel_size - 1)) // 2
- return padding
- class BasicBlock(nn.Module):
- """Basic residual block for ResNet.
- This is the standard residual block used in ResNet-18 and ResNet-34.
- """
- expansion = 1
- def __init__(
- self,
- inplanes: int,
- planes: int,
- stride: int = 1,
- downsample: Optional[nn.Module] = None,
- cardinality: int = 1,
- base_width: int = 64,
- reduce_first: int = 1,
- dilation: int = 1,
- first_dilation: Optional[int] = None,
- act_layer: Type[nn.Module] = nn.ReLU,
- norm_layer: Type[nn.Module] = nn.BatchNorm2d,
- attn_layer: Optional[Type[nn.Module]] = None,
- aa_layer: Optional[Type[nn.Module]] = None,
- drop_block: Optional[Type[nn.Module]] = None,
- drop_path: Optional[nn.Module] = None,
- device=None,
- dtype=None,
- ) -> None:
- """
- Args:
- inplanes: Input channel dimensionality.
- planes: Used to determine output channel dimensionalities.
- stride: Stride used in convolution layers.
- downsample: Optional downsample layer for residual path.
- cardinality: Number of convolution groups.
- base_width: Base width used to determine output channel dimensionality.
- reduce_first: Reduction factor for first convolution output width of residual blocks.
- dilation: Dilation rate for convolution layers.
- first_dilation: Dilation rate for first convolution layer.
- act_layer: Activation layer class.
- norm_layer: Normalization layer class.
- attn_layer: Attention layer class.
- aa_layer: Anti-aliasing layer class.
- drop_block: DropBlock layer class.
- drop_path: Optional DropPath layer instance.
- """
- dd = {'device': device, 'dtype': dtype}
- super().__init__()
- assert cardinality == 1, 'BasicBlock only supports cardinality of 1'
- assert base_width == 64, 'BasicBlock does not support changing base width'
- first_planes = planes // reduce_first
- outplanes = planes * self.expansion
- first_dilation = first_dilation or dilation
- use_aa = aa_layer is not None and (stride == 2 or first_dilation != dilation)
- self.conv1 = nn.Conv2d(
- inplanes,
- first_planes,
- kernel_size=3,
- stride=1 if use_aa else stride,
- padding=first_dilation,
- dilation=first_dilation,
- bias=False,
- **dd,
- )
- self.bn1 = norm_layer(first_planes, **dd)
- self.drop_block = drop_block() if drop_block is not None else nn.Identity()
- self.act1 = act_layer(inplace=True)
- self.aa = create_aa(aa_layer, channels=first_planes, stride=stride, enable=use_aa, **dd)
- self.conv2 = nn.Conv2d(
- first_planes,
- outplanes,
- kernel_size=3,
- padding=dilation,
- dilation=dilation,
- bias=False,
- **dd,
- )
- self.bn2 = norm_layer(outplanes, **dd)
- self.se = create_attn(attn_layer, outplanes, **dd)
- self.act2 = act_layer(inplace=True)
- self.downsample = downsample
- self.stride = stride
- self.dilation = dilation
- self.drop_path = drop_path
- def zero_init_last(self) -> None:
- """Initialize the last batch norm layer weights to zero for better convergence."""
- if getattr(self.bn2, 'weight', None) is not None:
- nn.init.zeros_(self.bn2.weight)
- def forward(self, x: torch.Tensor) -> torch.Tensor:
- shortcut = x
- x = self.conv1(x)
- x = self.bn1(x)
- x = self.drop_block(x)
- x = self.act1(x)
- x = self.aa(x)
- x = self.conv2(x)
- x = self.bn2(x)
- if self.se is not None:
- x = self.se(x)
- if self.drop_path is not None:
- x = self.drop_path(x)
- if self.downsample is not None:
- shortcut = self.downsample(shortcut)
- x += shortcut
- x = self.act2(x)
- return x
- class Bottleneck(nn.Module):
- """Bottleneck residual block for ResNet.
- This is the bottleneck block used in ResNet-50, ResNet-101, and ResNet-152.
- """
- expansion = 4
- def __init__(
- self,
- inplanes: int,
- planes: int,
- stride: int = 1,
- downsample: Optional[nn.Module] = None,
- cardinality: int = 1,
- base_width: int = 64,
- reduce_first: int = 1,
- dilation: int = 1,
- first_dilation: Optional[int] = None,
- act_layer: Type[nn.Module] = nn.ReLU,
- norm_layer: Type[nn.Module] = nn.BatchNorm2d,
- attn_layer: Optional[Type[nn.Module]] = None,
- aa_layer: Optional[Type[nn.Module]] = None,
- drop_block: Optional[Type[nn.Module]] = None,
- drop_path: Optional[nn.Module] = None,
- device=None,
- dtype=None,
- ) -> None:
- """
- Args:
- inplanes: Input channel dimensionality.
- planes: Used to determine output channel dimensionalities.
- stride: Stride used in convolution layers.
- downsample: Optional downsample layer for residual path.
- cardinality: Number of convolution groups.
- base_width: Base width used to determine output channel dimensionality.
- reduce_first: Reduction factor for first convolution output width of residual blocks.
- dilation: Dilation rate for convolution layers.
- first_dilation: Dilation rate for first convolution layer.
- act_layer: Activation layer class.
- norm_layer: Normalization layer class.
- attn_layer: Attention layer class.
- aa_layer: Anti-aliasing layer class.
- drop_block: DropBlock layer class.
- drop_path: Optional DropPath layer instance.
- """
- dd = {'device': device, 'dtype': dtype}
- super().__init__()
- width = int(math.floor(planes * (base_width / 64)) * cardinality)
- first_planes = width // reduce_first
- outplanes = planes * self.expansion
- first_dilation = first_dilation or dilation
- use_aa = aa_layer is not None and (stride == 2 or first_dilation != dilation)
- self.conv1 = nn.Conv2d(inplanes, first_planes, kernel_size=1, bias=False, **dd)
- self.bn1 = norm_layer(first_planes, **dd)
- self.act1 = act_layer(inplace=True)
- self.conv2 = nn.Conv2d(
- first_planes,
- width,
- kernel_size=3,
- stride=1 if use_aa else stride,
- padding=first_dilation,
- dilation=first_dilation,
- groups=cardinality,
- bias=False,
- **dd,
- )
- self.bn2 = norm_layer(width, **dd)
- self.drop_block = drop_block() if drop_block is not None else nn.Identity()
- self.act2 = act_layer(inplace=True)
- self.aa = create_aa(aa_layer, channels=width, stride=stride, enable=use_aa, **dd)
- self.conv3 = nn.Conv2d(width, outplanes, kernel_size=1, bias=False, **dd)
- self.bn3 = norm_layer(outplanes, **dd)
- self.se = create_attn(attn_layer, outplanes, **dd)
- self.act3 = act_layer(inplace=True)
- self.downsample = downsample
- self.stride = stride
- self.dilation = dilation
- self.drop_path = drop_path
- def zero_init_last(self) -> None:
- """Initialize the last batch norm layer weights to zero for better convergence."""
- if getattr(self.bn3, 'weight', None) is not None:
- nn.init.zeros_(self.bn3.weight)
- def forward(self, x: torch.Tensor) -> torch.Tensor:
- shortcut = x
- x = self.conv1(x)
- x = self.bn1(x)
- x = self.act1(x)
- x = self.conv2(x)
- x = self.bn2(x)
- x = self.drop_block(x)
- x = self.act2(x)
- x = self.aa(x)
- x = self.conv3(x)
- x = self.bn3(x)
- if self.se is not None:
- x = self.se(x)
- if self.drop_path is not None:
- x = self.drop_path(x)
- if self.downsample is not None:
- shortcut = self.downsample(shortcut)
- x += shortcut
- x = self.act3(x)
- return x
- def downsample_conv(
- in_channels: int,
- out_channels: int,
- kernel_size: int,
- stride: int = 1,
- dilation: int = 1,
- first_dilation: Optional[int] = None,
- norm_layer: Optional[Type[nn.Module]] = None,
- device=None,
- dtype=None,
- ) -> nn.Module:
- dd = {'device': device, 'dtype': dtype}
- norm_layer = norm_layer or nn.BatchNorm2d
- kernel_size = 1 if stride == 1 and dilation == 1 else kernel_size
- first_dilation = (first_dilation or dilation) if kernel_size > 1 else 1
- p = get_padding(kernel_size, stride, first_dilation)
- return nn.Sequential(*[
- nn.Conv2d(
- in_channels,
- out_channels,
- kernel_size,
- stride=stride,
- padding=p,
- dilation=first_dilation,
- bias=False,
- **dd
- ),
- norm_layer(out_channels, **dd)
- ])
- def downsample_avg(
- in_channels: int,
- out_channels: int,
- kernel_size: int,
- stride: int = 1,
- dilation: int = 1,
- first_dilation: Optional[int] = None,
- norm_layer: Optional[Type[nn.Module]] = None,
- device=None,
- dtype=None,
- ) -> nn.Module:
- dd = {'device': device, 'dtype': dtype}
- norm_layer = norm_layer or nn.BatchNorm2d
- avg_stride = stride if dilation == 1 else 1
- if stride == 1 and dilation == 1:
- pool = nn.Identity()
- else:
- avg_pool_fn = AvgPool2dSame if avg_stride == 1 and dilation > 1 else nn.AvgPool2d
- pool = avg_pool_fn(2, avg_stride, ceil_mode=True, count_include_pad=False)
- return nn.Sequential(*[
- pool,
- nn.Conv2d(in_channels, out_channels, 1, stride=1, padding=0, bias=False, **dd),
- norm_layer(out_channels, **dd)
- ])
- def drop_blocks(drop_prob: float = 0.) -> List[Optional[partial]]:
- """Create DropBlock layer instances for each stage.
- Args:
- drop_prob: Drop probability for DropBlock.
- Returns:
- List of DropBlock partial instances or None for each stage.
- """
- return [
- None, None,
- partial(DropBlock2d, drop_prob=drop_prob, block_size=5, gamma_scale=0.25) if drop_prob else None,
- partial(DropBlock2d, drop_prob=drop_prob, block_size=3, gamma_scale=1.00) if drop_prob else None]
- def make_blocks(
- block_fns: Tuple[Union[Type[BasicBlock], Type[Bottleneck]], ...],
- channels: Tuple[int, ...],
- block_repeats: Tuple[int, ...],
- inplanes: int,
- reduce_first: int = 1,
- output_stride: int = 32,
- down_kernel_size: int = 1,
- avg_down: bool = False,
- drop_block_rate: float = 0.,
- drop_path_rate: float = 0.,
- device=None,
- dtype=None,
- **kwargs,
- ) -> Tuple[List[Tuple[str, nn.Module]], List[Dict[str, Any]]]:
- """Create ResNet stages with specified block configurations.
- Args:
- block_fns: Block class to use for each stage.
- channels: Number of channels for each stage.
- block_repeats: Number of blocks to repeat for each stage.
- inplanes: Number of input channels.
- reduce_first: Reduction factor for first convolution in each stage.
- output_stride: Target output stride of network.
- down_kernel_size: Kernel size for downsample layers.
- avg_down: Use average pooling for downsample.
- drop_block_rate: DropBlock drop rate.
- drop_path_rate: Drop path rate for stochastic depth.
- **kwargs: Additional arguments passed to block constructors.
- Returns:
- Tuple of stage modules list and feature info list.
- """
- dd = {'device': device, 'dtype': dtype}
- stages = []
- feature_info = []
- net_num_blocks = sum(block_repeats)
- net_block_idx = 0
- net_stride = 4
- dilation = prev_dilation = 1
- for stage_idx, (block_fn, planes, num_blocks, db) in enumerate(zip(block_fns, channels, block_repeats, drop_blocks(drop_block_rate))):
- stage_name = f'layer{stage_idx + 1}' # never liked this name, but weight compat requires it
- stride = 1 if stage_idx == 0 else 2
- if net_stride >= output_stride:
- dilation *= stride
- stride = 1
- else:
- net_stride *= stride
- downsample = None
- if stride != 1 or inplanes != planes * block_fn.expansion:
- down_kwargs = dict(
- in_channels=inplanes,
- out_channels=planes * block_fn.expansion,
- kernel_size=down_kernel_size,
- stride=stride,
- dilation=dilation,
- first_dilation=prev_dilation,
- norm_layer=kwargs.get('norm_layer'),
- **dd,
- )
- downsample = downsample_avg(**down_kwargs) if avg_down else downsample_conv(**down_kwargs)
- block_kwargs = dict(reduce_first=reduce_first, dilation=dilation, drop_block=db, **kwargs)
- blocks = []
- for block_idx in range(num_blocks):
- downsample = downsample if block_idx == 0 else None
- stride = stride if block_idx == 0 else 1
- block_dpr = drop_path_rate * net_block_idx / (net_num_blocks - 1) # stochastic depth linear decay rule
- blocks.append(block_fn(
- inplanes,
- planes,
- stride,
- downsample,
- first_dilation=prev_dilation,
- drop_path=DropPath(block_dpr) if block_dpr > 0. else None,
- **block_kwargs,
- **dd,
- ))
- prev_dilation = dilation
- inplanes = planes * block_fn.expansion
- net_block_idx += 1
- stages.append((stage_name, nn.Sequential(*blocks)))
- feature_info.append(dict(num_chs=inplanes, reduction=net_stride, module=stage_name))
- return stages, feature_info
- class ResNet(nn.Module):
- """ResNet / ResNeXt / SE-ResNeXt / SE-Net
- This class implements all variants of ResNet, ResNeXt, SE-ResNeXt, and SENet that
- * have > 1 stride in the 3x3 conv layer of bottleneck
- * have conv-bn-act ordering
- This ResNet impl supports a number of stem and downsample options based on the v1c, v1d, v1e, and v1s
- variants included in the MXNet Gluon ResNetV1b model. The C and D variants are also discussed in the
- 'Bag of Tricks' paper: https://arxiv.org/pdf/1812.01187. The B variant is equivalent to torchvision default.
- ResNet variants (the same modifications can be used in SE/ResNeXt models as well):
- * normal, b - 7x7 stem, stem_width = 64, same as torchvision ResNet, NVIDIA ResNet 'v1.5', Gluon v1b
- * c - 3 layer deep 3x3 stem, stem_width = 32 (32, 32, 64)
- * d - 3 layer deep 3x3 stem, stem_width = 32 (32, 32, 64), average pool in downsample
- * e - 3 layer deep 3x3 stem, stem_width = 64 (64, 64, 128), average pool in downsample
- * s - 3 layer deep 3x3 stem, stem_width = 64 (64, 64, 128)
- * t - 3 layer deep 3x3 stem, stem width = 32 (24, 48, 64), average pool in downsample
- * tn - 3 layer deep 3x3 stem, stem width = 32 (24, 32, 64), average pool in downsample
- ResNeXt
- * normal - 7x7 stem, stem_width = 64, standard cardinality and base widths
- * same c,d, e, s variants as ResNet can be enabled
- SE-ResNeXt
- * normal - 7x7 stem, stem_width = 64
- * same c, d, e, s variants as ResNet can be enabled
- SENet-154 - 3 layer deep 3x3 stem (same as v1c-v1s), stem_width = 64, cardinality=64,
- reduction by 2 on width of first bottleneck convolution, 3x3 downsample convs after first block
- """
- def __init__(
- self,
- block: Union[BasicBlock, Bottleneck],
- layers: Tuple[int, ...],
- num_classes: int = 1000,
- in_chans: int = 3,
- output_stride: int = 32,
- global_pool: str = 'avg',
- cardinality: int = 1,
- base_width: int = 64,
- stem_width: int = 64,
- stem_type: str = '',
- replace_stem_pool: bool = False,
- block_reduce_first: int = 1,
- down_kernel_size: int = 1,
- avg_down: bool = False,
- channels: Optional[Tuple[int, ...]] = (64, 128, 256, 512),
- act_layer: LayerType = nn.ReLU,
- norm_layer: LayerType = nn.BatchNorm2d,
- aa_layer: Optional[Type[nn.Module]] = None,
- drop_rate: float = 0.0,
- drop_path_rate: float = 0.,
- drop_block_rate: float = 0.,
- zero_init_last: bool = True,
- block_args: Optional[Dict[str, Any]] = None,
- device=None,
- dtype=None,
- ):
- """
- Args:
- block (nn.Module): class for the residual block. Options are BasicBlock, Bottleneck.
- layers (List[int]) : number of layers in each block
- num_classes (int): number of classification classes (default 1000)
- in_chans (int): number of input (color) channels. (default 3)
- output_stride (int): output stride of the network, 32, 16, or 8. (default 32)
- global_pool (str): Global pooling type. One of 'avg', 'max', 'avgmax', 'catavgmax' (default 'avg')
- cardinality (int): number of convolution groups for 3x3 conv in Bottleneck. (default 1)
- base_width (int): bottleneck channels factor. `planes * base_width / 64 * cardinality` (default 64)
- stem_width (int): number of channels in stem convolutions (default 64)
- stem_type (str): The type of stem (default ''):
- * '', default - a single 7x7 conv with a width of stem_width
- * 'deep' - three 3x3 convolution layers of widths stem_width, stem_width, stem_width * 2
- * 'deep_tiered' - three 3x3 conv layers of widths stem_width//4 * 3, stem_width, stem_width * 2
- replace_stem_pool (bool): replace stem max-pooling layer with a 3x3 stride-2 convolution
- block_reduce_first (int): Reduction factor for first convolution output width of residual blocks,
- 1 for all archs except senets, where 2 (default 1)
- down_kernel_size (int): kernel size of residual block downsample path,
- 1x1 for most, 3x3 for senets (default: 1)
- avg_down (bool): use avg pooling for projection skip connection between stages/downsample (default False)
- act_layer (str, nn.Module): activation layer
- norm_layer (str, nn.Module): normalization layer
- aa_layer (nn.Module): anti-aliasing layer
- drop_rate (float): Dropout probability before classifier, for training (default 0.)
- drop_path_rate (float): Stochastic depth drop-path rate (default 0.)
- drop_block_rate (float): Drop block rate (default 0.)
- zero_init_last (bool): zero-init the last weight in residual path (usually last BN affine weight)
- block_args (dict): Extra kwargs to pass through to block module
- """
- super().__init__()
- dd = {'device': device, 'dtype': dtype}
- block_args = block_args or dict()
- assert output_stride in (8, 16, 32)
- self.num_classes = num_classes
- self.in_chans = in_chans
- self.drop_rate = drop_rate
- self.grad_checkpointing = False
- act_layer = get_act_layer(act_layer)
- norm_layer = get_norm_layer(norm_layer)
- # Stem
- deep_stem = 'deep' in stem_type
- inplanes = stem_width * 2 if deep_stem else 64
- if deep_stem:
- stem_chs = (stem_width, stem_width)
- if 'tiered' in stem_type:
- stem_chs = (3 * (stem_width // 4), stem_width)
- self.conv1 = nn.Sequential(*[
- nn.Conv2d(in_chans, stem_chs[0], 3, stride=2, padding=1, bias=False, **dd),
- norm_layer(stem_chs[0], **dd),
- act_layer(inplace=True),
- nn.Conv2d(stem_chs[0], stem_chs[1], 3, stride=1, padding=1, bias=False, **dd),
- norm_layer(stem_chs[1], **dd),
- act_layer(inplace=True),
- nn.Conv2d(stem_chs[1], inplanes, 3, stride=1, padding=1, bias=False, **dd)])
- else:
- self.conv1 = nn.Conv2d(in_chans, inplanes, kernel_size=7, stride=2, padding=3, bias=False, **dd)
- self.bn1 = norm_layer(inplanes, **dd)
- self.act1 = act_layer(inplace=True)
- self.feature_info = [dict(num_chs=inplanes, reduction=2, module='act1')]
- # Stem pooling. The name 'maxpool' remains for weight compatibility.
- if replace_stem_pool:
- self.maxpool = nn.Sequential(*filter(None, [
- nn.Conv2d(inplanes, inplanes, 3, stride=1 if aa_layer else 2, padding=1, bias=False, **dd),
- create_aa(aa_layer, channels=inplanes, stride=2, **dd) if aa_layer is not None else None,
- norm_layer(inplanes, **dd),
- act_layer(inplace=True),
- ]))
- else:
- if aa_layer is not None:
- if issubclass(aa_layer, nn.AvgPool2d):
- self.maxpool = aa_layer(2)
- else:
- self.maxpool = nn.Sequential(*[
- nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
- aa_layer(channels=inplanes, stride=2, **dd)])
- else:
- self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
- # Feature Blocks
- block_fns = to_ntuple(len(channels))(block)
- stage_modules, stage_feature_info = make_blocks(
- block_fns,
- channels,
- layers,
- inplanes,
- cardinality=cardinality,
- base_width=base_width,
- output_stride=output_stride,
- reduce_first=block_reduce_first,
- avg_down=avg_down,
- down_kernel_size=down_kernel_size,
- act_layer=act_layer,
- norm_layer=norm_layer,
- aa_layer=aa_layer,
- drop_block_rate=drop_block_rate,
- drop_path_rate=drop_path_rate,
- **block_args,
- **dd,
- )
- for stage in stage_modules:
- self.add_module(*stage) # layer1, layer2, etc
- self.feature_info.extend(stage_feature_info)
- # Head (Pooling and Classifier)
- self.num_features = self.head_hidden_size = channels[-1] * block_fns[-1].expansion
- self.global_pool, self.fc = create_classifier(self.num_features, self.num_classes, pool_type=global_pool, **dd)
- self.init_weights(zero_init_last=zero_init_last)
- @torch.jit.ignore
- def init_weights(self, zero_init_last: bool = True) -> None:
- """Initialize model weights.
- Args:
- zero_init_last: Zero-initialize the last BN in each residual branch.
- """
- for n, m in self.named_modules():
- if isinstance(m, nn.Conv2d):
- nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
- if zero_init_last:
- for m in self.modules():
- if hasattr(m, 'zero_init_last'):
- m.zero_init_last()
- @torch.jit.ignore
- def group_matcher(self, coarse: bool = False) -> Dict[str, str]:
- """Create regex patterns for parameter grouping.
- Args:
- coarse: Use coarse (stage-level) or fine (block-level) grouping.
- Returns:
- Dictionary mapping group names to regex patterns.
- """
- matcher = dict(stem=r'^conv1|bn1|maxpool', blocks=r'^layer(\d+)' if coarse else r'^layer(\d+)\.(\d+)')
- return matcher
- @torch.jit.ignore
- def set_grad_checkpointing(self, enable: bool = True) -> None:
- """Enable or disable gradient checkpointing.
- Args:
- enable: Whether to enable gradient checkpointing.
- """
- self.grad_checkpointing = enable
- @torch.jit.ignore
- def get_classifier(self, name_only: bool = False) -> Union[str, nn.Module]:
- """Get the classifier module.
- Args:
- name_only: Return classifier module name instead of module.
- Returns:
- Classifier module or name.
- """
- return 'fc' if name_only else self.fc
- def reset_classifier(self, num_classes: int, global_pool: str = 'avg') -> None:
- """Reset the classifier head.
- Args:
- num_classes: Number of classes for new classifier.
- global_pool: Global pooling type.
- """
- self.num_classes = num_classes
- self.global_pool, self.fc = create_classifier(self.num_features, self.num_classes, pool_type=global_pool)
- def forward_intermediates(
- self,
- x: torch.Tensor,
- indices: Optional[Union[int, List[int]]] = None,
- norm: bool = False,
- stop_early: bool = False,
- output_fmt: str = 'NCHW',
- intermediates_only: bool = False,
- ) -> Union[List[torch.Tensor], Tuple[torch.Tensor, List[torch.Tensor]]]:
- """Forward features that returns intermediates.
- Args:
- x: Input image tensor.
- indices: Take last n blocks if int, all if None, select matching indices if sequence.
- norm: Apply norm layer to compatible intermediates.
- stop_early: Stop iterating over blocks when last desired intermediate hit.
- output_fmt: Shape of intermediate feature outputs.
- intermediates_only: Only return intermediate features.
- Returns:
- Features and list of intermediate features or just intermediate features.
- """
- assert output_fmt in ('NCHW',), 'Output shape must be NCHW.'
- intermediates = []
- take_indices, max_index = feature_take_indices(5, indices)
- # forward pass
- feat_idx = 0
- x = self.conv1(x)
- x = self.bn1(x)
- x = self.act1(x)
- if feat_idx in take_indices:
- intermediates.append(x)
- x = self.maxpool(x)
- layer_names = ('layer1', 'layer2', 'layer3', 'layer4')
- if stop_early:
- layer_names = layer_names[:max_index]
- for n in layer_names:
- feat_idx += 1
- x = getattr(self, n)(x) # won't work with torchscript, but keeps code reasonable, FML
- if feat_idx in take_indices:
- intermediates.append(x)
- if intermediates_only:
- return intermediates
- return x, intermediates
- def prune_intermediate_layers(
- self,
- indices: Union[int, List[int]] = 1,
- prune_norm: bool = False,
- prune_head: bool = True,
- ) -> List[int]:
- """Prune layers not required for specified intermediates.
- Args:
- indices: Indices of intermediate layers to keep.
- prune_norm: Whether to prune normalization layers.
- prune_head: Whether to prune the classifier head.
- Returns:
- List of indices that were kept.
- """
- take_indices, max_index = feature_take_indices(5, indices)
- layer_names = ('layer1', 'layer2', 'layer3', 'layer4')
- layer_names = layer_names[max_index:]
- for n in layer_names:
- setattr(self, n, nn.Identity())
- if prune_head:
- self.reset_classifier(0, '')
- return take_indices
- def forward_features(self, x: torch.Tensor) -> torch.Tensor:
- """Forward pass through feature extraction layers."""
- x = self.conv1(x)
- x = self.bn1(x)
- x = self.act1(x)
- x = self.maxpool(x)
- if self.grad_checkpointing and not torch.jit.is_scripting():
- x = checkpoint_seq([self.layer1, self.layer2, self.layer3, self.layer4], x, flatten=True)
- else:
- x = self.layer1(x)
- x = self.layer2(x)
- x = self.layer3(x)
- x = self.layer4(x)
- return x
- def forward_head(self, x: torch.Tensor, pre_logits: bool = False) -> torch.Tensor:
- """Forward pass through classifier head.
- Args:
- x: Feature tensor.
- pre_logits: Return features before final classifier layer.
- Returns:
- Output tensor.
- """
- x = self.global_pool(x)
- if self.drop_rate:
- x = F.dropout(x, p=float(self.drop_rate), training=self.training)
- return x if pre_logits else self.fc(x)
- def forward(self, x: torch.Tensor) -> torch.Tensor:
- """Forward pass."""
- x = self.forward_features(x)
- x = self.forward_head(x)
- return x
- def _create_resnet(variant: str, pretrained: bool = False, **kwargs) -> ResNet:
- """Create a ResNet model.
- Args:
- variant: Model variant name.
- pretrained: Load pretrained weights.
- **kwargs: Additional model arguments.
- Returns:
- ResNet model instance.
- """
- return build_model_with_cfg(ResNet, variant, pretrained, **kwargs)
- def _cfg(url: str = '', **kwargs) -> Dict[str, Any]:
- """Create a default configuration for ResNet models."""
- return {
- 'url': url,
- 'num_classes': 1000, 'input_size': (3, 224, 224), 'pool_size': (7, 7),
- 'crop_pct': 0.875, 'interpolation': 'bilinear',
- 'mean': IMAGENET_DEFAULT_MEAN, 'std': IMAGENET_DEFAULT_STD,
- 'first_conv': 'conv1', 'classifier': 'fc',
- 'license': 'apache-2.0',
- **kwargs
- }
- def _tcfg(url: str = '', **kwargs) -> Dict[str, Any]:
- """Create a configuration with bicubic interpolation."""
- return _cfg(url=url, **dict({'interpolation': 'bicubic'}, **kwargs))
- def _ttcfg(url: str = '', **kwargs) -> Dict[str, Any]:
- """Create a configuration for models trained with timm."""
- return _cfg(url=url, **dict({
- 'interpolation': 'bicubic', 'test_input_size': (3, 288, 288), 'test_crop_pct': 0.95,
- 'origin_url': 'https://github.com/huggingface/pytorch-image-models',
- }, **kwargs))
- def _rcfg(url: str = '', **kwargs) -> Dict[str, Any]:
- """Create a configuration for ResNet-RS models."""
- return _cfg(url=url, **dict({
- 'interpolation': 'bicubic', 'crop_pct': 0.95, 'test_input_size': (3, 288, 288), 'test_crop_pct': 1.0,
- 'origin_url': 'https://github.com/huggingface/pytorch-image-models', 'paper_ids': 'arXiv:2110.00476'
- }, **kwargs))
- def _r3cfg(url: str = '', **kwargs) -> Dict[str, Any]:
- """Create a configuration for ResNet-RS models with 160x160 input."""
- return _cfg(url=url, **dict({
- 'interpolation': 'bicubic', 'input_size': (3, 160, 160), 'pool_size': (5, 5),
- 'crop_pct': 0.95, 'test_input_size': (3, 224, 224), 'test_crop_pct': 0.95,
- 'origin_url': 'https://github.com/huggingface/pytorch-image-models', 'paper_ids': 'arXiv:2110.00476',
- }, **kwargs))
- def _gcfg(url: str = '', **kwargs) -> Dict[str, Any]:
- """Create a configuration for Gluon pretrained models."""
- return _cfg(url=url, **dict({
- 'interpolation': 'bicubic',
- 'origin_url': 'https://cv.gluon.ai/model_zoo/classification.html',
- }, **kwargs))
- default_cfgs = generate_default_cfgs({
- # ResNet and Wide ResNet trained w/ timm (RSB paper and others)
- 'resnet10t.c3_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet10t_176_c3-f3215ab1.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_crop_pct=0.95, test_input_size=(3, 224, 224),
- first_conv='conv1.0'),
- 'resnet14t.c3_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet14t_176_c3-c4ed2c37.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_crop_pct=0.95, test_input_size=(3, 224, 224),
- first_conv='conv1.0'),
- 'resnet18.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet18_a1_0-d63eafa0.pth'),
- 'resnet18.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet18_a2_0-b61bd467.pth'),
- 'resnet18.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet18_a3_0-40c531c8.pth'),
- 'resnet18d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet18d_ra2-48a79e06.pth',
- first_conv='conv1.0'),
- 'resnet18d.ra4_e3600_r224_in1k': _rcfg(
- hf_hub_id='timm/',
- mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=0.9, first_conv='conv1.0'),
- 'resnet34.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet34_a1_0-46f8f793.pth'),
- 'resnet34.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet34_a2_0-82d47d71.pth'),
- 'resnet34.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet34_a3_0-a20cabb6.pth',
- crop_pct=0.95),
- 'resnet34.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet34-43635321.pth'),
- 'resnet34.ra4_e3600_r224_in1k': _rcfg(
- hf_hub_id='timm/',
- mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=0.9),
- 'resnet34d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet34d_ra2-f8dcfcaf.pth',
- first_conv='conv1.0'),
- 'resnet26.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet26-9aa10e23.pth'),
- 'resnet26d.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet26d-69e92c46.pth',
- first_conv='conv1.0'),
- 'resnet26t.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/resnet26t_256_ra2-6f6fa748.pth',
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8),
- crop_pct=0.94, test_input_size=(3, 320, 320), test_crop_pct=1.0),
- 'resnet50.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_a1_0-14fe96d1.pth'),
- 'resnet50.a1h_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_a1h2_176-001a1197.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), crop_pct=0.9, test_input_size=(3, 224, 224), test_crop_pct=1.0),
- 'resnet50.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_a2_0-a2746f79.pth'),
- 'resnet50.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_a3_0-59cae1ef.pth'),
- 'resnet50.b1k_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_b1k-532a802a.pth'),
- 'resnet50.b2k_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_b2k-1ba180c1.pth'),
- 'resnet50.c1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_c1-5ba5e060.pth'),
- 'resnet50.c2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_c2-d01e05b2.pth'),
- 'resnet50.d_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_d-f39db8af.pth'),
- 'resnet50.ram_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/resnet50_ram-a26f946b.pth'),
- 'resnet50.am_in1k': _tcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/resnet50_am-6c502b37.pth'),
- 'resnet50.ra_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/resnet50_ra-85ebb6e5.pth'),
- 'resnet50.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/rw_resnet50-86acaeed.pth'),
- 'resnet50d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet50d_ra2-464e36ba.pth',
- first_conv='conv1.0'),
- 'resnet50d.ra4_e3600_r224_in1k': _rcfg(
- hf_hub_id='timm/',
- mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5),
- crop_pct=0.95, test_input_size=(3, 288, 288), test_crop_pct=1.0,
- first_conv='conv1.0'),
- 'resnet50d.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50d_a1_0-e20cff14.pth',
- first_conv='conv1.0'),
- 'resnet50d.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50d_a2_0-a3adc64d.pth',
- first_conv='conv1.0'),
- 'resnet50d.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50d_a3_0-403fdfad.pth',
- first_conv='conv1.0'),
- 'resnet50t.untrained': _ttcfg(first_conv='conv1.0'),
- 'resnet101.a1h_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet101_a1h-36d3f2aa.pth'),
- 'resnet101.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet101_a1_0-cdcb52a9.pth'),
- 'resnet101.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet101_a2_0-6edb36c7.pth'),
- 'resnet101.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet101_a3_0-1db14157.pth'),
- 'resnet101d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet101d_ra2-2803ffab.pth',
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8), crop_pct=0.95,
- test_crop_pct=1.0, test_input_size=(3, 320, 320)),
- 'resnet152.a1h_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet152_a1h-dc400468.pth'),
- 'resnet152.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet152_a1_0-2eee8a7a.pth'),
- 'resnet152.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet152_a2_0-b4c6978f.pth'),
- 'resnet152.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet152_a3_0-134d4688.pth'),
- 'resnet152d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet152d_ra2-5cac0439.pth',
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8), crop_pct=0.95,
- test_crop_pct=1.0, test_input_size=(3, 320, 320)),
- 'resnet200.untrained': _ttcfg(),
- 'resnet200d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnet200d_ra2-bdba9bf9.pth',
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8), crop_pct=0.95,
- test_crop_pct=1.0, test_input_size=(3, 320, 320)),
- 'wide_resnet50_2.racm_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/wide_resnet50_racm-8234f177.pth'),
- # torchvision resnet weights
- 'resnet18.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet18-f37072fd.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnet34.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet34-b627a593.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnet50.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet50-0676ba61.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnet50.tv2_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet50-11ad3fa6.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_input_size=(3, 224, 224), test_crop_pct=0.965,
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnet101.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet101-63fe2227.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnet101.tv2_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet101-cd907fc2.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_input_size=(3, 224, 224), test_crop_pct=0.965,
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnet152.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet152-394f9c45.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnet152.tv2_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnet152-f82ba261.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_input_size=(3, 224, 224), test_crop_pct=0.965,
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'wide_resnet50_2.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'wide_resnet50_2.tv2_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/wide_resnet50_2-9ba9bcbe.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_input_size=(3, 224, 224), test_crop_pct=0.965,
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'wide_resnet101_2.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'wide_resnet101_2.tv2_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/wide_resnet101_2-d733dc28.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_input_size=(3, 224, 224), test_crop_pct=0.965,
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- # ResNets w/ alternative norm layers
- 'resnet50_gn.a1h_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnet50_gn_a1h2-8fe6c4d0.pth',
- crop_pct=0.94),
- # ResNeXt trained in timm (RSB paper and others)
- 'resnext50_32x4d.a1h_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnext50_32x4d_a1h-0146ab0a.pth'),
- 'resnext50_32x4d.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnext50_32x4d_a1_0-b5a91a1d.pth'),
- 'resnext50_32x4d.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnext50_32x4d_a2_0-efc76add.pth'),
- 'resnext50_32x4d.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/resnext50_32x4d_a3_0-3e450271.pth'),
- 'resnext50_32x4d.ra_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/resnext50_32x4d_ra-d733960d.pth'),
- 'resnext50d_32x4d.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnext50d_32x4d-103e99f8.pth',
- first_conv='conv1.0'),
- 'resnext101_32x4d.untrained': _ttcfg(),
- 'resnext101_64x4d.c1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/resnext101_64x4d_c-0d0e0cc0.pth'),
- # torchvision ResNeXt weights
- 'resnext50_32x4d.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnext101_32x8d.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnext101_64x4d.tv_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnext101_64x4d-173b62eb.pth',
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnext50_32x4d.tv2_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnext50_32x4d-1a0047aa.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_input_size=(3, 224, 224), test_crop_pct=0.965,
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- 'resnext101_32x8d.tv2_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/resnext101_32x8d-110c445d.pth',
- input_size=(3, 176, 176), pool_size=(6, 6), test_input_size=(3, 224, 224), test_crop_pct=0.965,
- license='bsd-3-clause', origin_url='https://github.com/pytorch/vision'),
- # ResNeXt models - Weakly Supervised Pretraining on Instagram Hashtags
- # from https://github.com/facebookresearch/WSL-Images
- # Please note the CC-BY-NC 4.0 license on these weights, non-commercial use only.
- 'resnext101_32x8d.fb_wsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/ig_resnext101_32x8-c38310e5.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/WSL-Images'),
- 'resnext101_32x16d.fb_wsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/ig_resnext101_32x16-c6f796b0.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/WSL-Images'),
- 'resnext101_32x32d.fb_wsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/ig_resnext101_32x32-e4b90b00.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/WSL-Images'),
- 'resnext101_32x48d.fb_wsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://download.pytorch.org/models/ig_resnext101_32x48-3e41cc8a.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/WSL-Images'),
- # Semi-Supervised ResNe*t models from https://github.com/facebookresearch/semi-supervised-ImageNet1K-models
- # Please note the CC-BY-NC 4.0 license on theses weights, non-commercial use only.
- 'resnet18.fb_ssl_yfcc100m_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_supervised_resnet18-d92f0530.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnet50.fb_ssl_yfcc100m_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_supervised_resnet50-08389792.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext50_32x4d.fb_ssl_yfcc100m_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_supervised_resnext50_32x4-ddb3e555.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext101_32x4d.fb_ssl_yfcc100m_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_supervised_resnext101_32x4-dc43570a.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext101_32x8d.fb_ssl_yfcc100m_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_supervised_resnext101_32x8-2cfe2f8b.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext101_32x16d.fb_ssl_yfcc100m_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_supervised_resnext101_32x16-15fffa57.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- # Semi-Weakly Supervised ResNe*t models from https://github.com/facebookresearch/semi-supervised-ImageNet1K-models
- # Please note the CC-BY-NC 4.0 license on theses weights, non-commercial use only.
- 'resnet18.fb_swsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnet18-118f1556.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnet50.fb_swsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnet50-16a12f1b.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext50_32x4d.fb_swsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnext50_32x4-72679e44.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext101_32x4d.fb_swsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnext101_32x4-3f87e46b.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext101_32x8d.fb_swsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnext101_32x8-b4712904.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- 'resnext101_32x16d.fb_swsl_ig1b_ft_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnext101_32x16-f3559a9c.pth',
- license='cc-by-nc-4.0', origin_url='https://github.com/facebookresearch/semi-supervised-ImageNet1K-models'),
- # Efficient Channel Attention ResNets
- 'ecaresnet26t.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/ecaresnet26t_ra2-46609757.pth',
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8),
- test_crop_pct=0.95, test_input_size=(3, 320, 320)),
- 'ecaresnetlight.miil_in1k': _tcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/ecaresnetlight-75a9c627.pth',
- test_crop_pct=0.95, test_input_size=(3, 288, 288)),
- 'ecaresnet50d.miil_in1k': _tcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/ecaresnet50d-93c81e3b.pth',
- first_conv='conv1.0', test_crop_pct=0.95, test_input_size=(3, 288, 288)),
- 'ecaresnet50d_pruned.miil_in1k': _tcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/ecaresnet50d_p-e4fa23c2.pth',
- first_conv='conv1.0', test_crop_pct=0.95, test_input_size=(3, 288, 288)),
- 'ecaresnet50t.ra2_in1k': _tcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/ecaresnet50t_ra2-f7ac63c4.pth',
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8),
- test_crop_pct=0.95, test_input_size=(3, 320, 320)),
- 'ecaresnet50t.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/ecaresnet50t_a1_0-99bd76a8.pth',
- first_conv='conv1.0'),
- 'ecaresnet50t.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/ecaresnet50t_a2_0-b1c7b745.pth',
- first_conv='conv1.0'),
- 'ecaresnet50t.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/ecaresnet50t_a3_0-8cc311f1.pth',
- first_conv='conv1.0'),
- 'ecaresnet101d.miil_in1k': _tcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/ecaresnet101d-153dad65.pth',
- first_conv='conv1.0', test_crop_pct=0.95, test_input_size=(3, 288, 288)),
- 'ecaresnet101d_pruned.miil_in1k': _tcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/ecaresnet101d_p-9e74cb91.pth',
- first_conv='conv1.0', test_crop_pct=0.95, test_input_size=(3, 288, 288)),
- 'ecaresnet200d.untrained': _ttcfg(
- first_conv='conv1.0', input_size=(3, 256, 256), crop_pct=0.95, pool_size=(8, 8)),
- 'ecaresnet269d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/ecaresnet269d_320_ra2-7baa55cb.pth',
- first_conv='conv1.0', input_size=(3, 320, 320), pool_size=(10, 10), crop_pct=0.95,
- test_crop_pct=1.0, test_input_size=(3, 352, 352)),
- # Efficient Channel Attention ResNeXts
- 'ecaresnext26t_32x4d.untrained': _tcfg(first_conv='conv1.0'),
- 'ecaresnext50t_32x4d.untrained': _tcfg(first_conv='conv1.0'),
- # Squeeze-Excitation ResNets, to eventually replace the models in senet.py
- 'seresnet18.untrained': _ttcfg(),
- 'seresnet34.untrained': _ttcfg(),
- 'seresnet50.a1_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/seresnet50_a1_0-ffa00869.pth',
- crop_pct=0.95),
- 'seresnet50.a2_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/seresnet50_a2_0-850de0d9.pth',
- crop_pct=0.95),
- 'seresnet50.a3_in1k': _r3cfg(
- hf_hub_id='timm/',
- url='https://github.com/huggingface/pytorch-image-models/releases/download/v0.1-rsb-weights/seresnet50_a3_0-317ecd56.pth',
- crop_pct=0.95),
- 'seresnet50.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet50_ra_224-8efdb4bb.pth'),
- 'seresnet50t.untrained': _ttcfg(
- first_conv='conv1.0'),
- 'seresnet101.untrained': _ttcfg(),
- 'seresnet152.untrained': _ttcfg(),
- 'seresnet152d.ra2_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet152d_ra2-04464dd2.pth',
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8), crop_pct=0.95,
- test_crop_pct=1.0, test_input_size=(3, 320, 320)
- ),
- 'seresnet200d.untrained': _ttcfg(
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8)),
- 'seresnet269d.untrained': _ttcfg(
- first_conv='conv1.0', input_size=(3, 256, 256), pool_size=(8, 8)),
- # Squeeze-Excitation ResNeXts, to eventually replace the models in senet.py
- 'seresnext26d_32x4d.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext26d_32x4d-80fa48a3.pth',
- first_conv='conv1.0'),
- 'seresnext26t_32x4d.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext26tn_32x4d-569cb627.pth',
- first_conv='conv1.0'),
- 'seresnext50_32x4d.racm_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext50_32x4d_racm-a304a460.pth'),
- 'seresnext101_32x4d.untrained': _ttcfg(),
- 'seresnext101_32x8d.ah_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/seresnext101_32x8d_ah-e6bc4c0a.pth'),
- 'seresnext101d_32x8d.ah_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/seresnext101d_32x8d_ah-191d7b94.pth',
- first_conv='conv1.0'),
- # ResNets with anti-aliasing / blur pool
- 'resnetaa50d.sw_in12k_ft_in1k': _ttcfg(
- hf_hub_id='timm/',
- first_conv='conv1.0', crop_pct=0.95, test_crop_pct=1.0),
- 'resnetaa101d.sw_in12k_ft_in1k': _ttcfg(
- hf_hub_id='timm/',
- first_conv='conv1.0', crop_pct=0.95, test_crop_pct=1.0),
- 'seresnextaa101d_32x8d.sw_in12k_ft_in1k_288': _ttcfg(
- hf_hub_id='timm/',
- crop_pct=0.95, input_size=(3, 288, 288), pool_size=(9, 9), test_input_size=(3, 320, 320), test_crop_pct=1.0,
- first_conv='conv1.0'),
- 'seresnextaa101d_32x8d.sw_in12k_ft_in1k': _ttcfg(
- hf_hub_id='timm/',
- first_conv='conv1.0', test_crop_pct=1.0),
- 'seresnextaa201d_32x8d.sw_in12k_ft_in1k_384': _cfg(
- hf_hub_id='timm/',
- interpolation='bicubic', first_conv='conv1.0', pool_size=(12, 12), input_size=(3, 384, 384), crop_pct=1.0),
- 'seresnextaa201d_32x8d.sw_in12k': _cfg(
- hf_hub_id='timm/',
- num_classes=11821, interpolation='bicubic', first_conv='conv1.0',
- crop_pct=0.95, input_size=(3, 320, 320), pool_size=(10, 10), test_input_size=(3, 384, 384), test_crop_pct=1.0),
- 'resnetaa50d.sw_in12k': _ttcfg(
- hf_hub_id='timm/',
- num_classes=11821, first_conv='conv1.0', crop_pct=0.95, test_crop_pct=1.0),
- 'resnetaa50d.d_in12k': _ttcfg(
- hf_hub_id='timm/',
- num_classes=11821, first_conv='conv1.0', crop_pct=0.95, test_crop_pct=1.0),
- 'resnetaa101d.sw_in12k': _ttcfg(
- hf_hub_id='timm/',
- num_classes=11821, first_conv='conv1.0', crop_pct=0.95, test_crop_pct=1.0),
- 'seresnextaa101d_32x8d.sw_in12k': _ttcfg(
- hf_hub_id='timm/',
- num_classes=11821, first_conv='conv1.0', crop_pct=0.95, test_crop_pct=1.0),
- 'resnetblur18.untrained': _ttcfg(),
- 'resnetblur50.bt_in1k': _ttcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/resnetblur50-84f4748f.pth'),
- 'resnetblur50d.untrained': _ttcfg(first_conv='conv1.0'),
- 'resnetblur101d.untrained': _ttcfg(first_conv='conv1.0'),
- 'resnetaa34d.untrained': _ttcfg(first_conv='conv1.0'),
- 'resnetaa50.a1h_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rsb-weights/resnetaa50_a1h-4cf422b3.pth'),
- 'seresnetaa50d.untrained': _ttcfg(first_conv='conv1.0'),
- 'seresnextaa101d_32x8d.ah_in1k': _rcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/seresnextaa101d_32x8d_ah-83c8ae12.pth',
- first_conv='conv1.0'),
- # ResNet-RS models
- 'resnetrs50.tf_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rs-weights/resnetrs50_ema-6b53758b.pth',
- input_size=(3, 160, 160), pool_size=(5, 5), crop_pct=0.91, test_input_size=(3, 224, 224),
- interpolation='bicubic', first_conv='conv1.0'),
- 'resnetrs101.tf_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rs-weights/resnetrs101_i192_ema-1509bbf6.pth',
- input_size=(3, 192, 192), pool_size=(6, 6), crop_pct=0.94, test_input_size=(3, 288, 288),
- interpolation='bicubic', first_conv='conv1.0'),
- 'resnetrs152.tf_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rs-weights/resnetrs152_i256_ema-a9aff7f9.pth',
- input_size=(3, 256, 256), pool_size=(8, 8), crop_pct=1.0, test_input_size=(3, 320, 320),
- interpolation='bicubic', first_conv='conv1.0'),
- 'resnetrs200.tf_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tpu-weights/resnetrs200_c-6b698b88.pth',
- input_size=(3, 256, 256), pool_size=(8, 8), crop_pct=1.0, test_input_size=(3, 320, 320),
- interpolation='bicubic', first_conv='conv1.0'),
- 'resnetrs270.tf_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rs-weights/resnetrs270_ema-b40e674c.pth',
- input_size=(3, 256, 256), pool_size=(8, 8), crop_pct=1.0, test_input_size=(3, 352, 352),
- interpolation='bicubic', first_conv='conv1.0'),
- 'resnetrs350.tf_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rs-weights/resnetrs350_i256_ema-5a1aa8f1.pth',
- input_size=(3, 288, 288), pool_size=(9, 9), crop_pct=1.0, test_input_size=(3, 384, 384),
- interpolation='bicubic', first_conv='conv1.0'),
- 'resnetrs420.tf_in1k': _cfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-rs-weights/resnetrs420_ema-972dee69.pth',
- input_size=(3, 320, 320), pool_size=(10, 10), crop_pct=1.0, test_input_size=(3, 416, 416),
- interpolation='bicubic', first_conv='conv1.0'),
- # gluon resnet weights
- 'resnet18.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet18_v1b-0757602b.pth'),
- 'resnet34.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet34_v1b-c6d82d59.pth'),
- 'resnet50.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet50_v1b-0ebe02e2.pth'),
- 'resnet101.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet101_v1b-3b017079.pth'),
- 'resnet152.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet152_v1b-c1edb0dd.pth'),
- 'resnet50c.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet50_v1c-48092f55.pth',
- first_conv='conv1.0'),
- 'resnet101c.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet101_v1c-1f26822a.pth',
- first_conv='conv1.0'),
- 'resnet152c.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet152_v1c-a3bb0b98.pth',
- first_conv='conv1.0'),
- 'resnet50d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet50_v1d-818a1b1b.pth',
- first_conv='conv1.0'),
- 'resnet101d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet101_v1d-0f9c8644.pth',
- first_conv='conv1.0'),
- 'resnet152d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet152_v1d-bd354e12.pth',
- first_conv='conv1.0'),
- 'resnet50s.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet50_v1s-1762acc0.pth',
- first_conv='conv1.0'),
- 'resnet101s.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet101_v1s-60fe0cc1.pth',
- first_conv='conv1.0'),
- 'resnet152s.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnet152_v1s-dcc41b81.pth',
- first_conv='conv1.0'),
- 'resnext50_32x4d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnext50_32x4d-e6a097c1.pth'),
- 'resnext101_32x4d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnext101_32x4d-b253c8c4.pth'),
- 'resnext101_64x4d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_resnext101_64x4d-f9a8e184.pth'),
- 'seresnext50_32x4d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_seresnext50_32x4d-90cf2d6e.pth'),
- 'seresnext101_32x4d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_seresnext101_32x4d-cf52900d.pth'),
- 'seresnext101_64x4d.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_seresnext101_64x4d-f9926f93.pth'),
- 'senet154.gluon_in1k': _gcfg(
- hf_hub_id='timm/',
- url='https://github.com/rwightman/pytorch-pretrained-gluonresnet/releases/download/v0.1/gluon_senet154-70a1a3c0.pth',
- first_conv='conv1.0'),
- 'test_resnet.r160_in1k': _cfg(
- hf_hub_id='timm/',
- mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), crop_pct=0.95,
- input_size=(3, 160, 160), pool_size=(5, 5), first_conv='conv1.0'),
- })
- @register_model
- def resnet10t(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-10-T model.
- """
- model_args = dict(block=BasicBlock, layers=(1, 1, 1, 1), stem_width=32, stem_type='deep_tiered', avg_down=True)
- return _create_resnet('resnet10t', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet14t(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-14-T model.
- """
- model_args = dict(block=Bottleneck, layers=(1, 1, 1, 1), stem_width=32, stem_type='deep_tiered', avg_down=True)
- return _create_resnet('resnet14t', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet18(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-18 model.
- """
- model_args = dict(block=BasicBlock, layers=(2, 2, 2, 2))
- return _create_resnet('resnet18', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet18d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-18-D model.
- """
- model_args = dict(block=BasicBlock, layers=(2, 2, 2, 2), stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnet18d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet34(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-34 model.
- """
- model_args = dict(block=BasicBlock, layers=(3, 4, 6, 3))
- return _create_resnet('resnet34', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet34d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-34-D model.
- """
- model_args = dict(block=BasicBlock, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnet34d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet26(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-26 model.
- """
- model_args = dict(block=Bottleneck, layers=(2, 2, 2, 2))
- return _create_resnet('resnet26', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet26t(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-26-T model.
- """
- model_args = dict(block=Bottleneck, layers=(2, 2, 2, 2), stem_width=32, stem_type='deep_tiered', avg_down=True)
- return _create_resnet('resnet26t', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet26d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-26-D model.
- """
- model_args = dict(block=Bottleneck, layers=(2, 2, 2, 2), stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnet26d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet50(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50 model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3))
- return _create_resnet('resnet50', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet50c(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-C model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep')
- return _create_resnet('resnet50c', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet50d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-D model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnet50d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet50s(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-S model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), stem_width=64, stem_type='deep')
- return _create_resnet('resnet50s', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet50t(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-T model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep_tiered', avg_down=True)
- return _create_resnet('resnet50t', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet101(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101 model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3))
- return _create_resnet('resnet101', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet101c(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101-C model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), stem_width=32, stem_type='deep')
- return _create_resnet('resnet101c', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet101d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101-D model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnet101d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet101s(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101-S model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), stem_width=64, stem_type='deep')
- return _create_resnet('resnet101s', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet152(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-152 model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 8, 36, 3))
- return _create_resnet('resnet152', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet152c(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-152-C model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 8, 36, 3), stem_width=32, stem_type='deep')
- return _create_resnet('resnet152c', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet152d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-152-D model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 8, 36, 3), stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnet152d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet152s(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-152-S model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 8, 36, 3), stem_width=64, stem_type='deep')
- return _create_resnet('resnet152s', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet200(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-200 model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 24, 36, 3))
- return _create_resnet('resnet200', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet200d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-200-D model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 24, 36, 3), stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnet200d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def wide_resnet50_2(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a Wide ResNet-50-2 model.
- The model is the same as ResNet except for the bottleneck number of channels
- which is twice larger in every block. The number of channels in outer 1x1
- convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048
- channels, and in Wide ResNet-50-2 has 2048-1024-2048.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), base_width=128)
- return _create_resnet('wide_resnet50_2', pretrained, **dict(model_args, **kwargs))
- @register_model
- def wide_resnet101_2(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a Wide ResNet-101-2 model.
- The model is the same as ResNet except for the bottleneck number of channels
- which is twice larger in every block. The number of channels in outer 1x1
- convolutions is the same.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), base_width=128)
- return _create_resnet('wide_resnet101_2', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnet50_gn(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50 model w/ GroupNorm
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), norm_layer='groupnorm')
- return _create_resnet('resnet50_gn', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnext50_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNeXt50-32x4d model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), cardinality=32, base_width=4)
- return _create_resnet('resnext50_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnext50d_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNeXt50d-32x4d model. ResNext50 w/ deep stem & avg pool downsample
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), cardinality=32, base_width=4,
- stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnext50d_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnext101_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNeXt-101 32x4d model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=4)
- return _create_resnet('resnext101_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnext101_32x8d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNeXt-101 32x8d model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=8)
- return _create_resnet('resnext101_32x8d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnext101_32x16d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNeXt-101 32x16d model
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=16)
- return _create_resnet('resnext101_32x16d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnext101_32x32d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNeXt-101 32x32d model
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=32)
- return _create_resnet('resnext101_32x32d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnext101_64x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNeXt101-64x4d model.
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), cardinality=64, base_width=4)
- return _create_resnet('resnext101_64x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet26t(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs an ECA-ResNeXt-26-T 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 and ECA attn.
- """
- model_args = dict(
- block=Bottleneck, layers=(2, 2, 2, 2), stem_width=32,
- stem_type='deep_tiered', avg_down=True, block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet26t', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet50d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-D model with eca.
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep', avg_down=True,
- block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet50d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet50d_pruned(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-D model pruned with eca.
- The pruning has been obtained using https://arxiv.org/pdf/2002.08258.pdf
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep', avg_down=True,
- block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet50d_pruned', pretrained, pruned=True, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet50t(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs an ECA-ResNet-50-T model.
- Like a 'D' bag-of-tricks model but with tiered 24, 32, 64 channels in the deep stem and ECA attn.
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32,
- stem_type='deep_tiered', avg_down=True, block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet50t', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnetlight(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-D light model with eca.
- """
- model_args = dict(
- block=Bottleneck, layers=(1, 1, 11, 3), stem_width=32, avg_down=True,
- block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnetlight', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet101d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101-D model with eca.
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), stem_width=32, stem_type='deep', avg_down=True,
- block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet101d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet101d_pruned(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101-D model pruned with eca.
- The pruning has been obtained using https://arxiv.org/pdf/2002.08258.pdf
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), stem_width=32, stem_type='deep', avg_down=True,
- block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet101d_pruned', pretrained, pruned=True, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet200d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-200-D model with ECA.
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 24, 36, 3), stem_width=32, stem_type='deep', avg_down=True,
- block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet200d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnet269d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-269-D model with ECA.
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 30, 48, 8), stem_width=32, stem_type='deep', avg_down=True,
- block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnet269d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnext26t_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs an ECA-ResNeXt-26-T 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. This model replaces SE module with the ECA module
- """
- model_args = dict(
- block=Bottleneck, layers=(2, 2, 2, 2), cardinality=32, base_width=4, stem_width=32,
- stem_type='deep_tiered', avg_down=True, block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnext26t_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def ecaresnext50t_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs an ECA-ResNeXt-50-T 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. This model replaces SE module with the ECA module
- """
- model_args = dict(
- block=Bottleneck, layers=(2, 2, 2, 2), cardinality=32, base_width=4, stem_width=32,
- stem_type='deep_tiered', avg_down=True, block_args=dict(attn_layer='eca'))
- return _create_resnet('ecaresnext50t_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet18(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(block=BasicBlock, layers=(2, 2, 2, 2), block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet18', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet34(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(block=BasicBlock, layers=(3, 4, 6, 3), block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet34', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet50(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet50', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet50t(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep_tiered',
- avg_down=True, block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet50t', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet101(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(block=Bottleneck, layers=(3, 4, 23, 3), block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet101', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet152(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(block=Bottleneck, layers=(3, 8, 36, 3), block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet152', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet152d(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 8, 36, 3), stem_width=32, stem_type='deep',
- avg_down=True, block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet152d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet200d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-200-D model with SE attn.
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 24, 36, 3), stem_width=32, stem_type='deep',
- avg_down=True, block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet200d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnet269d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-269-D model with SE attn.
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 30, 48, 8), stem_width=32, stem_type='deep',
- avg_down=True, block_args=dict(attn_layer='se'))
- return _create_resnet('seresnet269d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnext26d_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a SE-ResNeXt-26-D model.`
- 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.
- """
- model_args = dict(
- block=Bottleneck, layers=(2, 2, 2, 2), cardinality=32, base_width=4, stem_width=32,
- stem_type='deep', avg_down=True, block_args=dict(attn_layer='se'))
- return _create_resnet('seresnext26d_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnext26t_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- """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, 32, 64 channels
- in the deep stem.
- """
- model_args = dict(
- block=Bottleneck, layers=(2, 2, 2, 2), cardinality=32, base_width=4, stem_width=32,
- stem_type='deep_tiered', avg_down=True, block_args=dict(attn_layer='se'))
- return _create_resnet('seresnext26t_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnext50_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), cardinality=32, base_width=4,
- block_args=dict(attn_layer='se'))
- return _create_resnet('seresnext50_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnext101_32x4d(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=4,
- block_args=dict(attn_layer='se'))
- return _create_resnet('seresnext101_32x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnext101_32x8d(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=8,
- block_args=dict(attn_layer='se'))
- return _create_resnet('seresnext101_32x8d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnext101d_32x8d(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=8,
- stem_width=32, stem_type='deep', avg_down=True,
- block_args=dict(attn_layer='se'))
- return _create_resnet('seresnext101d_32x8d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnext101_64x4d(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), cardinality=64, base_width=4,
- block_args=dict(attn_layer='se'))
- return _create_resnet('seresnext101_64x4d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def senet154(pretrained: bool = False, **kwargs) -> ResNet:
- model_args = dict(
- block=Bottleneck, layers=(3, 8, 36, 3), cardinality=64, base_width=4, stem_type='deep',
- down_kernel_size=3, block_reduce_first=2, block_args=dict(attn_layer='se'))
- return _create_resnet('senet154', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetblur18(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-18 model with blur anti-aliasing
- """
- model_args = dict(block=BasicBlock, layers=(2, 2, 2, 2), aa_layer=BlurPool2d)
- return _create_resnet('resnetblur18', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetblur50(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50 model with blur anti-aliasing
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), aa_layer=BlurPool2d)
- return _create_resnet('resnetblur50', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetblur50d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-D model with blur anti-aliasing
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), aa_layer=BlurPool2d,
- stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnetblur50d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetblur101d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101-D model with blur anti-aliasing
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), aa_layer=BlurPool2d,
- stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnetblur101d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetaa34d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-34-D model w/ avgpool anti-aliasing
- """
- model_args = dict(
- block=BasicBlock, layers=(3, 4, 6, 3), aa_layer=nn.AvgPool2d, stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnetaa34d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetaa50(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50 model with avgpool anti-aliasing
- """
- model_args = dict(block=Bottleneck, layers=(3, 4, 6, 3), aa_layer=nn.AvgPool2d)
- return _create_resnet('resnetaa50', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetaa50d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-50-D model with avgpool anti-aliasing
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), aa_layer=nn.AvgPool2d,
- stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnetaa50d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetaa101d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-101-D model with avgpool anti-aliasing
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), aa_layer=nn.AvgPool2d,
- stem_width=32, stem_type='deep', avg_down=True)
- return _create_resnet('resnetaa101d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnetaa50d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a SE=ResNet-50-D model with avgpool anti-aliasing
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), aa_layer=nn.AvgPool2d,
- stem_width=32, stem_type='deep', avg_down=True, block_args=dict(attn_layer='se'))
- return _create_resnet('seresnetaa50d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnextaa101d_32x8d(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a SE=ResNeXt-101-D 32x8d model with avgpool anti-aliasing
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), cardinality=32, base_width=8,
- stem_width=32, stem_type='deep', avg_down=True, aa_layer=nn.AvgPool2d,
- block_args=dict(attn_layer='se'))
- return _create_resnet('seresnextaa101d_32x8d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def seresnextaa201d_32x8d(pretrained: bool = False, **kwargs):
- """Constructs a SE=ResNeXt-101-D 32x8d model with avgpool anti-aliasing
- """
- model_args = dict(
- block=Bottleneck, layers=(3, 24, 36, 4), cardinality=32, base_width=8,
- stem_width=64, stem_type='deep', avg_down=True, aa_layer=nn.AvgPool2d,
- block_args=dict(attn_layer='se'))
- return _create_resnet('seresnextaa201d_32x8d', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetrs50(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-RS-50 model.
- Paper: Revisiting ResNets - https://arxiv.org/abs/2103.07579
- Pretrained weights from https://github.com/tensorflow/tpu/tree/bee9c4f6/models/official/resnet/resnet_rs
- """
- attn_layer = partial(get_attn('se'), rd_ratio=0.25)
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 6, 3), stem_width=32, stem_type='deep', replace_stem_pool=True,
- avg_down=True, block_args=dict(attn_layer=attn_layer))
- return _create_resnet('resnetrs50', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetrs101(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-RS-101 model.
- Paper: Revisiting ResNets - https://arxiv.org/abs/2103.07579
- Pretrained weights from https://github.com/tensorflow/tpu/tree/bee9c4f6/models/official/resnet/resnet_rs
- """
- attn_layer = partial(get_attn('se'), rd_ratio=0.25)
- model_args = dict(
- block=Bottleneck, layers=(3, 4, 23, 3), stem_width=32, stem_type='deep', replace_stem_pool=True,
- avg_down=True, block_args=dict(attn_layer=attn_layer))
- return _create_resnet('resnetrs101', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetrs152(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-RS-152 model.
- Paper: Revisiting ResNets - https://arxiv.org/abs/2103.07579
- Pretrained weights from https://github.com/tensorflow/tpu/tree/bee9c4f6/models/official/resnet/resnet_rs
- """
- attn_layer = partial(get_attn('se'), rd_ratio=0.25)
- model_args = dict(
- block=Bottleneck, layers=(3, 8, 36, 3), stem_width=32, stem_type='deep', replace_stem_pool=True,
- avg_down=True, block_args=dict(attn_layer=attn_layer))
- return _create_resnet('resnetrs152', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetrs200(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-RS-200 model.
- Paper: Revisiting ResNets - https://arxiv.org/abs/2103.07579
- Pretrained weights from https://github.com/tensorflow/tpu/tree/bee9c4f6/models/official/resnet/resnet_rs
- """
- attn_layer = partial(get_attn('se'), rd_ratio=0.25)
- model_args = dict(
- block=Bottleneck, layers=(3, 24, 36, 3), stem_width=32, stem_type='deep', replace_stem_pool=True,
- avg_down=True, block_args=dict(attn_layer=attn_layer))
- return _create_resnet('resnetrs200', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetrs270(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-RS-270 model.
- Paper: Revisiting ResNets - https://arxiv.org/abs/2103.07579
- Pretrained weights from https://github.com/tensorflow/tpu/tree/bee9c4f6/models/official/resnet/resnet_rs
- """
- attn_layer = partial(get_attn('se'), rd_ratio=0.25)
- model_args = dict(
- block=Bottleneck, layers=(4, 29, 53, 4), stem_width=32, stem_type='deep', replace_stem_pool=True,
- avg_down=True, block_args=dict(attn_layer=attn_layer))
- return _create_resnet('resnetrs270', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetrs350(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-RS-350 model.
- Paper: Revisiting ResNets - https://arxiv.org/abs/2103.07579
- Pretrained weights from https://github.com/tensorflow/tpu/tree/bee9c4f6/models/official/resnet/resnet_rs
- """
- attn_layer = partial(get_attn('se'), rd_ratio=0.25)
- model_args = dict(
- block=Bottleneck, layers=(4, 36, 72, 4), stem_width=32, stem_type='deep', replace_stem_pool=True,
- avg_down=True, block_args=dict(attn_layer=attn_layer))
- return _create_resnet('resnetrs350', pretrained, **dict(model_args, **kwargs))
- @register_model
- def resnetrs420(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a ResNet-RS-420 model
- Paper: Revisiting ResNets - https://arxiv.org/abs/2103.07579
- Pretrained weights from https://github.com/tensorflow/tpu/tree/bee9c4f6/models/official/resnet/resnet_rs
- """
- attn_layer = partial(get_attn('se'), rd_ratio=0.25)
- model_args = dict(
- block=Bottleneck, layers=(4, 44, 87, 4), stem_width=32, stem_type='deep', replace_stem_pool=True,
- avg_down=True, block_args=dict(attn_layer=attn_layer))
- return _create_resnet('resnetrs420', pretrained, **dict(model_args, **kwargs))
- @register_model
- def test_resnet(pretrained: bool = False, **kwargs) -> ResNet:
- """Constructs a tiny ResNet test model.
- """
- model_args = dict(
- block=[BasicBlock, BasicBlock, Bottleneck, BasicBlock], layers=(1, 1, 1, 1),
- stem_width=16, stem_type='deep', avg_down=True, channels=(32, 48, 48, 96))
- return _create_resnet('test_resnet', pretrained, **dict(model_args, **kwargs))
- register_model_deprecations(__name__, {
- 'tv_resnet34': 'resnet34.tv_in1k',
- 'tv_resnet50': 'resnet50.tv_in1k',
- 'tv_resnet101': 'resnet101.tv_in1k',
- 'tv_resnet152': 'resnet152.tv_in1k',
- 'tv_resnext50_32x4d' : 'resnext50_32x4d.tv_in1k',
- 'ig_resnext101_32x8d': 'resnext101_32x8d.fb_wsl_ig1b_ft_in1k',
- 'ig_resnext101_32x16d': 'resnext101_32x8d.fb_wsl_ig1b_ft_in1k',
- 'ig_resnext101_32x32d': 'resnext101_32x8d.fb_wsl_ig1b_ft_in1k',
- 'ig_resnext101_32x48d': 'resnext101_32x8d.fb_wsl_ig1b_ft_in1k',
- 'ssl_resnet18': 'resnet18.fb_ssl_yfcc100m_ft_in1k',
- 'ssl_resnet50': 'resnet50.fb_ssl_yfcc100m_ft_in1k',
- 'ssl_resnext50_32x4d': 'resnext50_32x4d.fb_ssl_yfcc100m_ft_in1k',
- 'ssl_resnext101_32x4d': 'resnext101_32x4d.fb_ssl_yfcc100m_ft_in1k',
- 'ssl_resnext101_32x8d': 'resnext101_32x8d.fb_ssl_yfcc100m_ft_in1k',
- 'ssl_resnext101_32x16d': 'resnext101_32x16d.fb_ssl_yfcc100m_ft_in1k',
- 'swsl_resnet18': 'resnet18.fb_swsl_ig1b_ft_in1k',
- 'swsl_resnet50': 'resnet50.fb_swsl_ig1b_ft_in1k',
- 'swsl_resnext50_32x4d': 'resnext50_32x4d.fb_swsl_ig1b_ft_in1k',
- 'swsl_resnext101_32x4d': 'resnext101_32x4d.fb_swsl_ig1b_ft_in1k',
- 'swsl_resnext101_32x8d': 'resnext101_32x8d.fb_swsl_ig1b_ft_in1k',
- 'swsl_resnext101_32x16d': 'resnext101_32x16d.fb_swsl_ig1b_ft_in1k',
- 'gluon_resnet18_v1b': 'resnet18.gluon_in1k',
- 'gluon_resnet34_v1b': 'resnet34.gluon_in1k',
- 'gluon_resnet50_v1b': 'resnet50.gluon_in1k',
- 'gluon_resnet101_v1b': 'resnet101.gluon_in1k',
- 'gluon_resnet152_v1b': 'resnet152.gluon_in1k',
- 'gluon_resnet50_v1c': 'resnet50c.gluon_in1k',
- 'gluon_resnet101_v1c': 'resnet101c.gluon_in1k',
- 'gluon_resnet152_v1c': 'resnet152c.gluon_in1k',
- 'gluon_resnet50_v1d': 'resnet50d.gluon_in1k',
- 'gluon_resnet101_v1d': 'resnet101d.gluon_in1k',
- 'gluon_resnet152_v1d': 'resnet152d.gluon_in1k',
- 'gluon_resnet50_v1s': 'resnet50s.gluon_in1k',
- 'gluon_resnet101_v1s': 'resnet101s.gluon_in1k',
- 'gluon_resnet152_v1s': 'resnet152s.gluon_in1k',
- 'gluon_resnext50_32x4d': 'resnext50_32x4d.gluon_in1k',
- 'gluon_resnext101_32x4d': 'resnext101_32x4d.gluon_in1k',
- 'gluon_resnext101_64x4d': 'resnext101_64x4d.gluon_in1k',
- 'gluon_seresnext50_32x4d': 'seresnext50_32x4d.gluon_in1k',
- 'gluon_seresnext101_32x4d': 'seresnext101_32x4d.gluon_in1k',
- 'gluon_seresnext101_64x4d': 'seresnext101_64x4d.gluon_in1k',
- 'gluon_senet154': 'senet154.gluon_in1k',
- 'seresnext26tn_32x4d': 'seresnext26t_32x4d',
- })
|