Skip to content

Commit 07d952c

Browse files
authored
Merge pull request huggingface#637 from rwightman/levit_visformer_rednet
LeVit, Visformer, RedNet/Involution models and layers
2 parents 7f36878 + 5db7452 commit 07d952c

28 files changed

+1511
-245
lines changed

.github/workflows/tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ jobs:
1717
matrix:
1818
os: [ubuntu-latest, macOS-latest]
1919
python: ['3.8']
20-
torch: ['1.8.0']
21-
torchvision: ['0.9.0']
20+
torch: ['1.8.1']
21+
torchvision: ['0.9.1']
2222
runs-on: ${{ matrix.os }}
2323

2424
steps:

README.md

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ I'm fortunate to be able to dedicate significant time and money of my own suppor
2323

2424
## What's New
2525

26+
### May 25, 2021
27+
* Add LeViT, Visformer, ConViT (PR by Aman Arora), Twins (PR by paper authors) transformer models
28+
* Add ResMLP and gMLP MLP vision models to the existing MLP Mixer impl
29+
* Fix a number of torchscript issues with various vision transformer models
30+
* Cleanup input_size/img_size override handling and improve testing / test coverage for all vision transformer and MLP models
31+
* More flexible pos embedding resize (non-square) for ViT and TnT. Thanks [Alexander Soare](https://github.com/alexander-soare)
32+
* Add `efficientnetv2_rw_m` model and weights (started training before official code). 84.8 top-1, 53M params.
33+
2634
### May 14, 2021
2735
* Add EfficientNet-V2 official model defs w/ ported weights from official [Tensorflow/Keras](https://github.com/google/automl/tree/master/efficientnetv2) impl.
2836
* 1k trained variants: `tf_efficientnetv2_s/m/l`
@@ -166,30 +174,6 @@ I'm fortunate to be able to dedicate significant time and money of my own suppor
166174
* Misc fixes for SiLU ONNX export, default_cfg missing from Feature extraction models, Linear layer w/ AMP + torchscript
167175
* PyPi release @ 0.3.2 (needed by EfficientDet)
168176

169-
### Oct 30, 2020
170-
* Test with PyTorch 1.7 and fix a small top-n metric view vs reshape issue.
171-
* Convert newly added 224x224 Vision Transformer weights from official JAX repo. 81.8 top-1 for B/16, 83.1 L/16.
172-
* Support PyTorch 1.7 optimized, native SiLU (aka Swish) activation. Add mapping to 'silu' name, custom swish will eventually be deprecated.
173-
* Fix regression for loading pretrained classifier via direct model entrypoint functions. Didn't impact create_model() factory usage.
174-
* PyPi release @ 0.3.0 version!
175-
176-
### Oct 26, 2020
177-
* Update Vision Transformer models to be compatible with official code release at https://github.com/google-research/vision_transformer
178-
* Add Vision Transformer weights (ImageNet-21k pretrain) for 384x384 base and large models converted from official jax impl
179-
* ViT-B/16 - 84.2
180-
* ViT-B/32 - 81.7
181-
* ViT-L/16 - 85.2
182-
* ViT-L/32 - 81.5
183-
184-
### Oct 21, 2020
185-
* Weights added for Vision Transformer (ViT) models. 77.86 top-1 for 'small' and 79.35 for 'base'. Thanks to [Christof](https://www.kaggle.com/christofhenkel) for training the base model w/ lots of GPUs.
186-
187-
### Oct 13, 2020
188-
* Initial impl of Vision Transformer models. Both patch and hybrid (CNN backbone) variants. Currently trying to train...
189-
* Adafactor and AdaHessian (FP32 only, no AMP) optimizers
190-
* EdgeTPU-M (`efficientnet_em`) model trained in PyTorch, 79.3 top-1
191-
* Pip release, doc updates pending a few more changes...
192-
193177

194178
## Introduction
195179

@@ -207,6 +191,7 @@ A full version of the list below with source links can be found in the [document
207191
* Bottleneck Transformers - https://arxiv.org/abs/2101.11605
208192
* CaiT (Class-Attention in Image Transformers) - https://arxiv.org/abs/2103.17239
209193
* CoaT (Co-Scale Conv-Attentional Image Transformers) - https://arxiv.org/abs/2104.06399
194+
* ConViT (Soft Convolutional Inductive Biases Vision Transformers)- https://arxiv.org/abs/2103.10697
210195
* CspNet (Cross-Stage Partial Networks) - https://arxiv.org/abs/1911.11929
211196
* DeiT (Vision Transformer) - https://arxiv.org/abs/2012.12877
212197
* DenseNet - https://arxiv.org/abs/1608.06993
@@ -224,13 +209,15 @@ A full version of the list below with source links can be found in the [document
224209
* MobileNet-V2 - https://arxiv.org/abs/1801.04381
225210
* Single-Path NAS - https://arxiv.org/abs/1904.02877
226211
* GhostNet - https://arxiv.org/abs/1911.11907
212+
* gMLP - https://arxiv.org/abs/2105.08050
227213
* GPU-Efficient Networks - https://arxiv.org/abs/2006.14090
228214
* Halo Nets - https://arxiv.org/abs/2103.12731
229215
* HardCoRe-NAS - https://arxiv.org/abs/2102.11646
230216
* HRNet - https://arxiv.org/abs/1908.07919
231217
* Inception-V3 - https://arxiv.org/abs/1512.00567
232218
* Inception-ResNet-V2 and Inception-V4 - https://arxiv.org/abs/1602.07261
233219
* Lambda Networks - https://arxiv.org/abs/2102.08602
220+
* LeViT (Vision Transformer in ConvNet's Clothing) - https://arxiv.org/abs/2104.01136
234221
* MLP-Mixer - https://arxiv.org/abs/2105.01601
235222
* MobileNet-V3 (MBConvNet w/ Efficient Head) - https://arxiv.org/abs/1905.02244
236223
* NASNet-A - https://arxiv.org/abs/1707.07012
@@ -240,6 +227,7 @@ A full version of the list below with source links can be found in the [document
240227
* Pooling-based Vision Transformer (PiT) - https://arxiv.org/abs/2103.16302
241228
* RegNet - https://arxiv.org/abs/2003.13678
242229
* RepVGG - https://arxiv.org/abs/2101.03697
230+
* ResMLP - https://arxiv.org/abs/2105.03404
243231
* ResNet/ResNeXt
244232
* ResNet (v1b/v1.5) - https://arxiv.org/abs/1512.03385
245233
* ResNeXt - https://arxiv.org/abs/1611.05431
@@ -257,6 +245,7 @@ A full version of the list below with source links can be found in the [document
257245
* Swin Transformer - https://arxiv.org/abs/2103.14030
258246
* Transformer-iN-Transformer (TNT) - https://arxiv.org/abs/2103.00112
259247
* TResNet - https://arxiv.org/abs/2003.13630
248+
* Twins (Spatial Attention in Vision Transformers) - https://arxiv.org/pdf/2104.13840.pdf
260249
* Vision Transformer - https://arxiv.org/abs/2010.11929
261250
* VovNet V2 and V1 - https://arxiv.org/abs/1911.06667
262251
* Xception - https://arxiv.org/abs/1610.02357

docs/archived_changes.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
11
# Archived Changes
22

3+
### Oct 30, 2020
4+
* Test with PyTorch 1.7 and fix a small top-n metric view vs reshape issue.
5+
* Convert newly added 224x224 Vision Transformer weights from official JAX repo. 81.8 top-1 for B/16, 83.1 L/16.
6+
* Support PyTorch 1.7 optimized, native SiLU (aka Swish) activation. Add mapping to 'silu' name, custom swish will eventually be deprecated.
7+
* Fix regression for loading pretrained classifier via direct model entrypoint functions. Didn't impact create_model() factory usage.
8+
* PyPi release @ 0.3.0 version!
9+
10+
### Oct 26, 2020
11+
* Update Vision Transformer models to be compatible with official code release at https://github.com/google-research/vision_transformer
12+
* Add Vision Transformer weights (ImageNet-21k pretrain) for 384x384 base and large models converted from official jax impl
13+
* ViT-B/16 - 84.2
14+
* ViT-B/32 - 81.7
15+
* ViT-L/16 - 85.2
16+
* ViT-L/32 - 81.5
17+
18+
### Oct 21, 2020
19+
* Weights added for Vision Transformer (ViT) models. 77.86 top-1 for 'small' and 79.35 for 'base'. Thanks to [Christof](https://www.kaggle.com/christofhenkel) for training the base model w/ lots of GPUs.
20+
21+
### Oct 13, 2020
22+
* Initial impl of Vision Transformer models. Both patch and hybrid (CNN backbone) variants. Currently trying to train...
23+
* Adafactor and AdaHessian (FP32 only, no AMP) optimizers
24+
* EdgeTPU-M (`efficientnet_em`) model trained in PyTorch, 79.3 top-1
25+
* Pip release, doc updates pending a few more changes...
26+
327
### Sept 18, 2020
428
* New ResNet 'D' weights. 72.7 (top-1) ResNet-18-D, 77.1 ResNet-34-D, 80.5 ResNet-50-D
529
* Added a few untrained defs for other ResNet models (66D, 101D, 152D, 200/200D)

docs/changes.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# Recent Changes
22

3+
### May 25, 2021
4+
* Add LeViT, Visformer, Convit (PR by Aman Arora), Twins (PR by paper authors) transformer models
5+
* Cleanup input_size/img_size override handling and testing for all vision transformer models
6+
* Add `efficientnetv2_rw_m` model and weights (started training before official code). 84.8 top-1, 53M params.
7+
8+
### May 14, 2021
9+
* Add EfficientNet-V2 official model defs w/ ported weights from official [Tensorflow/Keras](https://github.com/google/automl/tree/master/efficientnetv2) impl.
10+
* 1k trained variants: `tf_efficientnetv2_s/m/l`
11+
* 21k trained variants: `tf_efficientnetv2_s/m/l_in21k`
12+
* 21k pretrained -> 1k fine-tuned: `tf_efficientnetv2_s/m/l_in21ft1k`
13+
* v2 models w/ v1 scaling: `tf_efficientnetv2_b0` through `b3`
14+
* Rename my prev V2 guess `efficientnet_v2s` -> `efficientnetv2_rw_s`
15+
* Some blank `efficientnetv2_*` models in-place for future native PyTorch training
16+
17+
### May 5, 2021
18+
* Add MLP-Mixer models and port pretrained weights from [Google JAX impl](https://github.com/google-research/vision_transformer/tree/linen)
19+
* Add CaiT models and pretrained weights from [FB](https://github.com/facebookresearch/deit)
20+
* Add ResNet-RS models and weights from [TF](https://github.com/tensorflow/tpu/tree/master/models/official/resnet/resnet_rs). Thanks [Aman Arora](https://github.com/amaarora)
21+
* Add CoaT models and weights. Thanks [Mohammed Rizin](https://github.com/morizin)
22+
* Add new ImageNet-21k weights & finetuned weights for TResNet, MobileNet-V3, ViT models. Thanks [mrT](https://github.com/mrT23)
23+
* Add GhostNet models and weights. Thanks [Kai Han](https://github.com/iamhankai)
24+
* Update ByoaNet attention modles
25+
* Improve SA module inits
26+
* Hack together experimental stand-alone Swin based attn module and `swinnet`
27+
* Consistent '26t' model defs for experiments.
28+
* Add improved Efficientnet-V2S (prelim model def) weights. 83.8 top-1.
29+
* WandB logging support
30+
331
### April 13, 2021
432
* Add Swin Transformer models and weights from https://github.com/microsoft/Swin-Transformer
533

tests/test_models.py

Lines changed: 63 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
# transformer models don't support many of the spatial / feature based model functionalities
1818
NON_STD_FILTERS = [
19-
'vit_*', 'tnt_*', 'pit_*', 'swin_*', 'coat_*', 'cait_*', '*mixer_*', 'gmlp_*', 'resmlp_*', 'twins_*', 'convit_*']
19+
'vit_*', 'tnt_*', 'pit_*', 'swin_*', 'coat_*', 'cait_*', '*mixer_*', 'gmlp_*', 'resmlp_*', 'twins_*',
20+
'convit_*', 'levit*', 'visformer*']
2021
NUM_NON_STD = len(NON_STD_FILTERS)
2122

2223
# exclude models that cause specific test failures
@@ -25,29 +26,56 @@
2526
EXCLUDE_FILTERS = [
2627
'*efficientnet_l2*', '*resnext101_32x48d', '*in21k', '*152x4_bitm', '*101x3_bitm',
2728
'*nfnet_f3*', '*nfnet_f4*', '*nfnet_f5*', '*nfnet_f6*', '*nfnet_f7*',
28-
'*resnetrs350*', '*resnetrs420*'] + NON_STD_FILTERS
29+
'*resnetrs350*', '*resnetrs420*']
2930
else:
30-
EXCLUDE_FILTERS = NON_STD_FILTERS
31+
EXCLUDE_FILTERS = []
3132

32-
MAX_FWD_SIZE = 384
33-
MAX_BWD_SIZE = 128
34-
MAX_FWD_FEAT_SIZE = 448
33+
TARGET_FWD_SIZE = MAX_FWD_SIZE = 384
34+
TARGET_BWD_SIZE = 128
35+
MAX_BWD_SIZE = 320
36+
MAX_FWD_OUT_SIZE = 448
37+
TARGET_JIT_SIZE = 128
38+
MAX_JIT_SIZE = 320
39+
TARGET_FFEAT_SIZE = 96
40+
MAX_FFEAT_SIZE = 256
41+
42+
43+
def _get_input_size(model=None, model_name='', target=None):
44+
if model is None:
45+
assert model_name, "One of model or model_name must be provided"
46+
input_size = get_model_default_value(model_name, 'input_size')
47+
fixed_input_size = get_model_default_value(model_name, 'fixed_input_size')
48+
min_input_size = get_model_default_value(model_name, 'min_input_size')
49+
else:
50+
default_cfg = model.default_cfg
51+
input_size = default_cfg['input_size']
52+
fixed_input_size = default_cfg.get('fixed_input_size', None)
53+
min_input_size = default_cfg.get('min_input_size', None)
54+
assert input_size is not None
55+
56+
if fixed_input_size:
57+
return input_size
58+
59+
if min_input_size:
60+
if target and max(input_size) > target:
61+
input_size = min_input_size
62+
else:
63+
if target and max(input_size) > target:
64+
input_size = tuple([min(x, target) for x in input_size])
65+
return input_size
3566

3667

3768
@pytest.mark.timeout(120)
38-
@pytest.mark.parametrize('model_name', list_models(exclude_filters=EXCLUDE_FILTERS[:-NUM_NON_STD]))
69+
@pytest.mark.parametrize('model_name', list_models(exclude_filters=EXCLUDE_FILTERS))
3970
@pytest.mark.parametrize('batch_size', [1])
4071
def test_model_forward(model_name, batch_size):
4172
"""Run a single forward pass with each model"""
4273
model = create_model(model_name, pretrained=False)
4374
model.eval()
4475

45-
input_size = model.default_cfg['input_size']
46-
if any([x > MAX_FWD_SIZE for x in input_size]):
47-
if is_model_default_key(model_name, 'fixed_input_size'):
48-
pytest.skip("Fixed input size model > limit.")
49-
# cap forward test at max res 384 * 384 to keep resource down
50-
input_size = tuple([min(x, MAX_FWD_SIZE) for x in input_size])
76+
input_size = _get_input_size(model=model, target=TARGET_FWD_SIZE)
77+
if max(input_size) > MAX_FWD_SIZE:
78+
pytest.skip("Fixed input size model > limit.")
5179
inputs = torch.randn((batch_size, *input_size))
5280
outputs = model(inputs)
5381

@@ -56,26 +84,22 @@ def test_model_forward(model_name, batch_size):
5684

5785

5886
@pytest.mark.timeout(120)
59-
@pytest.mark.parametrize('model_name', list_models(exclude_filters=EXCLUDE_FILTERS))
87+
@pytest.mark.parametrize('model_name', list_models(exclude_filters=EXCLUDE_FILTERS, name_matches_cfg=True))
6088
@pytest.mark.parametrize('batch_size', [2])
6189
def test_model_backward(model_name, batch_size):
6290
"""Run a single forward pass with each model"""
91+
input_size = _get_input_size(model_name=model_name, target=TARGET_BWD_SIZE)
92+
if max(input_size) > MAX_BWD_SIZE:
93+
pytest.skip("Fixed input size model > limit.")
94+
6395
model = create_model(model_name, pretrained=False, num_classes=42)
6496
num_params = sum([x.numel() for x in model.parameters()])
65-
model.eval()
66-
67-
input_size = model.default_cfg['input_size']
68-
if not is_model_default_key(model_name, 'fixed_input_size'):
69-
min_input_size = get_model_default_value(model_name, 'min_input_size')
70-
if min_input_size is not None:
71-
input_size = min_input_size
72-
else:
73-
if any([x > MAX_BWD_SIZE for x in input_size]):
74-
# cap backward test at 128 * 128 to keep resource usage down
75-
input_size = tuple([min(x, MAX_BWD_SIZE) for x in input_size])
97+
model.train()
7698

7799
inputs = torch.randn((batch_size, *input_size))
78100
outputs = model(inputs)
101+
if isinstance(outputs, tuple):
102+
outputs = torch.cat(outputs)
79103
outputs.mean().backward()
80104
for n, x in model.named_parameters():
81105
assert x.grad is not None, f'No gradient for {n}'
@@ -100,10 +124,10 @@ def test_model_default_cfgs(model_name, batch_size):
100124
pool_size = cfg['pool_size']
101125
input_size = model.default_cfg['input_size']
102126

103-
if all([x <= MAX_FWD_FEAT_SIZE for x in input_size]) and \
127+
if all([x <= MAX_FWD_OUT_SIZE for x in input_size]) and \
104128
not any([fnmatch.fnmatch(model_name, x) for x in EXCLUDE_FILTERS]):
105129
# output sizes only checked if default res <= 448 * 448 to keep resource down
106-
input_size = tuple([min(x, MAX_FWD_FEAT_SIZE) for x in input_size])
130+
input_size = tuple([min(x, MAX_FWD_OUT_SIZE) for x in input_size])
107131
input_tensor = torch.randn((batch_size, *input_size))
108132

109133
# test forward_features (always unpooled)
@@ -154,26 +178,25 @@ def test_model_features_pretrained(model_name, batch_size):
154178

155179
EXCLUDE_JIT_FILTERS = [
156180
'*iabn*', 'tresnet*', # models using inplace abn unlikely to ever be scriptable
157-
'dla*', 'hrnet*', 'ghostnet*', # hopefully fix at some point
181+
'dla*', 'hrnet*', 'ghostnet*', # hopefully fix at some point
182+
'vit_large_*', 'vit_huge_*',
158183
]
159184

160185

161186
@pytest.mark.timeout(120)
162-
@pytest.mark.parametrize('model_name', list_models(exclude_filters=EXCLUDE_FILTERS + EXCLUDE_JIT_FILTERS))
187+
@pytest.mark.parametrize(
188+
'model_name', list_models(exclude_filters=EXCLUDE_FILTERS + EXCLUDE_JIT_FILTERS, name_matches_cfg=True))
163189
@pytest.mark.parametrize('batch_size', [1])
164190
def test_model_forward_torchscript(model_name, batch_size):
165191
"""Run a single forward pass with each model"""
192+
input_size = _get_input_size(model_name=model_name, target=TARGET_JIT_SIZE)
193+
if max(input_size) > MAX_JIT_SIZE:
194+
pytest.skip("Fixed input size model > limit.")
195+
166196
with set_scriptable(True):
167197
model = create_model(model_name, pretrained=False)
168198
model.eval()
169199

170-
if has_model_default_key(model_name, 'fixed_input_size'):
171-
input_size = get_model_default_value(model_name, 'input_size')
172-
elif has_model_default_key(model_name, 'min_input_size'):
173-
input_size = get_model_default_value(model_name, 'min_input_size')
174-
else:
175-
input_size = (3, 128, 128) # jit compile is already a bit slow and we've tested normal res already...
176-
177200
model = torch.jit.script(model)
178201
outputs = model(torch.randn((batch_size, *input_size)))
179202

@@ -183,7 +206,7 @@ def test_model_forward_torchscript(model_name, batch_size):
183206

184207
EXCLUDE_FEAT_FILTERS = [
185208
'*pruned*', # hopefully fix at some point
186-
]
209+
] + NON_STD_FILTERS
187210
if 'GITHUB_ACTIONS' in os.environ: # and 'Linux' in platform.system():
188211
# GitHub Linux runner is slower and hits memory limits sooner than MacOS, exclude bigger models
189212
EXCLUDE_FEAT_FILTERS += ['*resnext101_32x32d', '*resnext101_32x16d']
@@ -199,12 +222,9 @@ def test_model_forward_features(model_name, batch_size):
199222
expected_channels = model.feature_info.channels()
200223
assert len(expected_channels) >= 4 # all models here should have at least 4 feature levels by default, some 5 or 6
201224

202-
if has_model_default_key(model_name, 'fixed_input_size'):
203-
input_size = get_model_default_value(model_name, 'input_size')
204-
elif has_model_default_key(model_name, 'min_input_size'):
205-
input_size = get_model_default_value(model_name, 'min_input_size')
206-
else:
207-
input_size = (3, 96, 96) # jit compile is already a bit slow and we've tested normal res already...
225+
input_size = _get_input_size(model=model, target=TARGET_FFEAT_SIZE)
226+
if max(input_size) > MAX_FFEAT_SIZE:
227+
pytest.skip("Fixed input size model > limit.")
208228

209229
outputs = model(torch.randn((batch_size, *input_size)))
210230
assert len(expected_channels) == len(outputs)

timm/data/parsers/parser_tfds.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525

2626

2727
MAX_TP_SIZE = 8 # maximum TF threadpool size, only doing jpeg decodes and queuing activities
28-
SHUFFLE_SIZE = 16834 # samples to shuffle in DS queue
29-
PREFETCH_SIZE = 4096 # samples to prefetch
28+
SHUFFLE_SIZE = 20480 # samples to shuffle in DS queue
29+
PREFETCH_SIZE = 2048 # samples to prefetch
3030

3131

3232
def even_split_indices(split, n, num_samples):
@@ -144,14 +144,16 @@ def _lazy_init(self):
144144
ds = self.builder.as_dataset(
145145
split=self.subsplit or self.split, shuffle_files=self.shuffle, read_config=read_config)
146146
# avoid overloading threading w/ combo fo TF ds threads + PyTorch workers
147-
ds.options().experimental_threading.private_threadpool_size = max(1, MAX_TP_SIZE // num_workers)
148-
ds.options().experimental_threading.max_intra_op_parallelism = 1
147+
options = tf.data.Options()
148+
options.experimental_threading.private_threadpool_size = max(1, MAX_TP_SIZE // num_workers)
149+
options.experimental_threading.max_intra_op_parallelism = 1
150+
ds = ds.with_options(options)
149151
if self.is_training or self.repeats > 1:
150152
# to prevent excessive drop_last batch behaviour w/ IterableDatasets
151153
# see warnings at https://pytorch.org/docs/stable/data.html#multi-process-data-loading
152154
ds = ds.repeat() # allow wrap around and break iteration manually
153155
if self.shuffle:
154-
ds = ds.shuffle(min(self.num_samples // self._num_pipelines, SHUFFLE_SIZE), seed=0)
156+
ds = ds.shuffle(min(self.num_samples, SHUFFLE_SIZE) // self._num_pipelines, seed=0)
155157
ds = ds.prefetch(min(self.num_samples // self._num_pipelines, PREFETCH_SIZE))
156158
self.ds = tfds.as_numpy(ds)
157159

timm/models/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
from .inception_resnet_v2 import *
1717
from .inception_v3 import *
1818
from .inception_v4 import *
19+
from .levit import *
20+
#from .levit import *
1921
from .mlp_mixer import *
2022
from .mobilenetv3 import *
2123
from .nasnet import *
@@ -35,6 +37,7 @@
3537
from .tnt import *
3638
from .tresnet import *
3739
from .vgg import *
40+
from .visformer import *
3841
from .vision_transformer import *
3942
from .vision_transformer_hybrid import *
4043
from .vovnet import *

0 commit comments

Comments
 (0)