|
# regnetx_006 |
|
Implementation of RegNet proposed in [Designing Network Design |
|
Spaces](https://arxiv.org/abs/2003.13678) |
|
|
|
The main idea is to start with a high dimensional search space and |
|
iteratively reduce the search space by empirically apply constrains |
|
based on the best performing models sampled by the current search |
|
space. |
|
|
|
The resulting models are light, accurate, and faster than |
|
EfficientNets (up to 5x times!) |
|
|
|
For example, to go from $AnyNet_A$ to $AnyNet_B$ they fixed the |
|
bottleneck ratio $b_i$ for all stage $i$. The following table shows |
|
all the restrictions applied from one search space to the next one. |
|
|
|
![image](https://github.com/FrancescoSaverioZuppichini/glasses/blob/develop/docs/_static/images/RegNetDesignSpaceTable.png?raw=true) |
|
|
|
The paper is really well written and very interesting, I highly |
|
recommended read it. |
|
|
|
``` python |
|
ResNet.regnetx_002() |
|
ResNet.regnetx_004() |
|
ResNet.regnetx_006() |
|
ResNet.regnetx_008() |
|
ResNet.regnetx_016() |
|
ResNet.regnetx_040() |
|
ResNet.regnetx_064() |
|
ResNet.regnetx_080() |
|
ResNet.regnetx_120() |
|
ResNet.regnetx_160() |
|
ResNet.regnetx_320() |
|
# Y variants (with SE) |
|
ResNet.regnety_002() |
|
# ... |
|
ResNet.regnetx_320() |
|
|
|
You can easily customize your model |
|
``` |
|
|
|
Examples: |
|
|
|
``` python |
|
# change activation |
|
RegNet.regnetx_004(activation = nn.SELU) |
|
# change number of classes (default is 1000 ) |
|
RegNet.regnetx_004(n_classes=100) |
|
# pass a different block |
|
RegNet.regnetx_004(block=RegNetYBotteneckBlock) |
|
# change the steam |
|
model = RegNet.regnetx_004(stem=ResNetStemC) |
|
change shortcut |
|
model = RegNet.regnetx_004(block=partial(RegNetYBotteneckBlock, shortcut=ResNetShorcutD)) |
|
# store each feature |
|
x = torch.rand((1, 3, 224, 224)) |
|
# get features |
|
model = RegNet.regnetx_004() |
|
# first call .features, this will activate the forward hooks and tells the model you'll like to get the features |
|
model.encoder.features |
|
model(torch.randn((1,3,224,224))) |
|
# get the features from the encoder |
|
features = model.encoder.features |
|
print([x.shape for x in features]) |
|
#[torch.Size([1, 32, 112, 112]), torch.Size([1, 32, 56, 56]), torch.Size([1, 64, 28, 28]), torch.Size([1, 160, 14, 14])] |
|
``` |
|
|
|
|