# Contents
- [TinyNet Description ](#tinynet-description )
- [Model Architecture ](#model-architecture )
- [Dataset ](#dataset )
- [Environment Requirements ](#environment-requirements )
- [Script Description ](#script-description )
- [Script and Sample Code ](#script-and-sample-code )
- [Training Process ](#training-process )
- [Evaluation Process ](#evaluation-process )
- [Model Description ](#model-description )
- [Performance ](#performance )
- [Evaluation Performance ](#evaluation-performance )
- [Description of Random Situation ](#description-of-random-situation )
- [ModelZoo Homepage ](#modelzoo-homepage )
# [TinyNet Description](#contents)
TinyNets are a series of lightweight models obtained by twisting resolution, depth and width with a data-driven tiny formula. TinyNet outperforms EfficientNet and MobileNetV3.
[Paper ](https://arxiv.org/abs/2010.14819 ): Kai Han, Yunhe Wang, Qiulin Zhang, Wei Zhang, Chunjing Xu, Tong Zhang. Model Rubik's Cube: Twisting Resolution, Depth and Width for TinyNets. In NeurIPS 2020.
# [Model architecture](#contents)
The overall network architecture of TinyNet is show below:
[Link ](https://arxiv.org/abs/2010.14819 )
# [Dataset](#contents)
Dataset used: [ImageNet 2012 ](http://image-net.org/challenges/LSVRC/2012/ )
- Dataset size:
- Train: 1.2 million images in 1,000 classes
- Test: 50,000 validation images in 1,000 classes
- Data format: RGB images.
- Note: Data will be processed in src/dataset/dataset.py
# [Environment Requirements](#contents)
- Hardware (GPU)
- Framework
- [MindSpore ](https://www.mindspore.cn/install/en )
- For more information, please check the resources below:
- [MindSpore Tutorials ](https://www.mindspore.cn/tutorial/training/en/master/index.html )
- [MindSpore Python API ](https://www.mindspore.cn/doc/api_python/en/master/index.html )
# [Script Description](#contents)
## [Script and Sample Code](#contents)
```markdown
.tinynet
├── README.md # descriptions about tinynet
├── script
│ ├── eval.sh # evaluation script
│ ├── train_1p_gpu.sh # training script on single GPU
│ └── train_distributed_gpu.sh # distributed training script on multiple GPUs
├── src
│ ├── callback.py # loss, ema, and checkpoint callbacks
│ ├── dataset.py # data preprocessing
│ ├── loss.py # label-smoothing cross-entropy loss function
│ ├── tinynet.py # tinynet architecture
│ └── utils.py # utility functions
├── eval.py # evaluation interface
└── train.py # training interface
```
### [Training process](#contents)
#### Launch
```bash
# training on single GPU
sh train_1p_gpu.sh
# training on multiple GPUs, the number after -n indicates how many GPUs will be used for training
sh train_distributed_gpu.sh -n 8
```
Inside train.sh, there are hyperparameters that can be adjusted during training, for example:
```python
--model tinynet_c model to be used for training
--drop 0.2 dropout rate
--drop-connect 0 drop connect rate
--num-classes 1000 number of classes for training
--opt-eps 0.001 optimizer's epsilon
--lr 0.048 learning rate
--batch-size 128 batch size
--decay-epochs 2.4 learning rate decays every 2.4 epoch
--warmup-lr 1e-6 warm up learning rate
--warmup-epochs 3 learning rate warm up epoch
--decay-rate 0.97 learning rate decay rate
--ema-decay 0.9999 decay factor for model weights moving average
--weight-decay 1e-5 optimizer's weight decay
--epochs 450 number of epochs to be trained
--ckpt_save_epoch 1 checkpoint saving interval
--workers 8 number of processes for loading data
--amp_level O0 training auto-mixed precision
--opt rmsprop optimizers, currently we support SGD and RMSProp
--data_path /path_to_ImageNet/
--GPU using GPU for training
--dataset_sink using sink mode
```
The config above was used to train tinynets on ImageNet (change drop-connect to 0.1 for training tinynet_b)
> checkpoints will be saved in the ./device_{rank_id} folder (single GPU)
or ./device_parallel folder (multiple GPUs)
### [Evaluation Process](#contents)
#### Launch
```bash
# infer example
sh eval.sh
```
Inside the eval.sh, there are configs that can be adjusted during inference, for example:
```python
--num-classes 1000
--batch-size 128
--workers 8
--data_path /path_to_ImageNet/
--GPU
--ckpt /path_to_EMA_checkpoint/
--dataset_sink > tinynet_c_eval.log 2>& 1 &
```
> checkpoint can be produced in training process.
# [Model Description](#contents)
## [Performance](#contents)
### Evaluation Performance
| Model | FLOPs | Latency* | ImageNet Top-1 |
| ------------------- | ----- | -------- | -------------- |
| EfficientNet-B0 | 387M | 99.85 ms | 76.7% |
| TinyNet-A | 339M | 81.30 ms | 76.8% |
| EfficientNet-B^{-4} | 24M | 11.54 ms | 56.7% |
| TinyNet-E | 24M | 9.18 ms | 59.9% |
*Latency is measured using MS Lite on Huawei P40 smartphone.
*More details in [Paper ](https://arxiv.org/abs/2010.14819 ).
# [Description of Random Situation](#contents)
We set the seed inside dataset.py. We also use random seed in train.py.
# [ModelZoo Homepage](#contents)
Please check the official [homepage ](https://gitee.com/mindspore/mindspore/tree/master/model_zoo ).