未验证 提交 7ef47416 编写于 作者: L littletomatodonkey 提交者: GitHub

polish api to Paddle2.0-rc (#346)

polish codes and docs to adapt Paddle2.0-rc
上级 abc8ac5c
...@@ -292,7 +292,7 @@ Accuracy and inference time metrics of ResNeSt and RegNet series models are show ...@@ -292,7 +292,7 @@ Accuracy and inference time metrics of ResNeSt and RegNet series models are show
| Model | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | Download Address | | Model | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | Download Address |
|------------------------|-----------|-----------|------------------|------------------|----------|-----------|------------------------------------------------------------------------------------------------------| |------------------------|-----------|-----------|------------------|------------------|----------|-----------|------------------------------------------------------------------------------------------------------|
| ResNeSt50_<br>fast_1s1x64d | 0.8035 | 0.9528 | 3.45405 | 8.72680 | 8.68 | 26.3 | [Download link](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_fast_1s1x64d_pretrained.pdparams) | | ResNeSt50_<br>fast_1s1x64d | 0.8035 | 0.9528 | 3.45405 | 8.72680 | 8.68 | 26.3 | [Download link](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_fast_1s1x64d_pretrained.pdparams) |
| ResNeSt50 | 0.8102 | 0.9542 | 6.69042 | 8.01664 | 10.78 | 27.5 | [Download link](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_pretrained.pdparams) | | ResNeSt50 | 0.8083 | 0.9542 | 6.69042 | 8.01664 | 10.78 | 27.5 | [Download link](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_pretrained.pdparams) |
| RegNetX_4GF | 0.785 | 0.9416 | 6.46478 | 11.19862 | 8 | 22.1 | [Download link](https://paddle-imagenet-models-name.bj.bcebos.com/RegNetX_4GF_pretrained.pdparams) | | RegNetX_4GF | 0.785 | 0.9416 | 6.46478 | 11.19862 | 8 | 22.1 | [Download link](https://paddle-imagenet-models-name.bj.bcebos.com/RegNetX_4GF_pretrained.pdparams) |
......
...@@ -295,7 +295,7 @@ ResNeSt与RegNet系列模型的精度、速度指标如下表所示,更多关 ...@@ -295,7 +295,7 @@ ResNeSt与RegNet系列模型的精度、速度指标如下表所示,更多关
| 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 | | 模型 | Top-1 Acc | Top-5 Acc | time(ms)<br>bs=1 | time(ms)<br>bs=4 | Flops(G) | Params(M) | 下载地址 |
|------------------------|-----------|-----------|------------------|------------------|----------|-----------|------------------------------------------------------------------------------------------------------| |------------------------|-----------|-----------|------------------|------------------|----------|-----------|------------------------------------------------------------------------------------------------------|
| ResNeSt50_<br>fast_1s1x64d | 0.8035 | 0.9528 | 3.45405 | 8.72680 | 8.68 | 26.3 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_fast_1s1x64d_pretrained.pdparams) | | ResNeSt50_<br>fast_1s1x64d | 0.8035 | 0.9528 | 3.45405 | 8.72680 | 8.68 | 26.3 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_fast_1s1x64d_pretrained.pdparams) |
| ResNeSt50 | 0.8102 | 0.9542 | 6.69042 | 8.01664 | 10.78 | 27.5 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_pretrained.pdparams) | | ResNeSt50 | 0.8083 | 0.9542 | 6.69042 | 8.01664 | 10.78 | 27.5 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_pretrained.pdparams) |
| RegNetX_4GF | 0.785 | 0.9416 | 6.46478 | 11.19862 | 8 | 22.1 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/RegNetX_4GF_pretrained.pdparams) | | RegNetX_4GF | 0.785 | 0.9416 | 6.46478 | 11.19862 | 8 | 22.1 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/RegNetX_4GF_pretrained.pdparams) |
......
mode: 'train'
ARCHITECTURE:
name: 'RegNetX_4GF'
pretrained_model: ""
model_save_dir: "./output/"
classes_num: 1000
total_images: 1281167
save_interval: 1
validate: True
valid_interval: 1
epochs: 100
topk: 5
image_shape: [3, 224, 224]
use_mix: False
ls_epsilon: -1
LEARNING_RATE:
function: 'CosineWarmup'
params:
lr: 0.4
warmup_epoch: 5
OPTIMIZER:
function: 'Momentum'
params:
momentum: 0.9
regularizer:
function: 'L2'
factor: 0.000050
TRAIN:
batch_size: 512
num_workers: 4
file_list: "./dataset/ILSVRC2012/train_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- RandCropImage:
size: 224
- RandFlipImage:
flip_code: 1
- NormalizeImage:
scale: 1./255.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
VALID:
batch_size: 256
num_workers: 4
file_list: "./dataset/ILSVRC2012/val_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
resize_short: 256
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
mode: 'train'
ARCHITECTURE:
name: 'ResNeSt50'
pretrained_model: ""
model_save_dir: "./output/"
classes_num: 1000
total_images: 1281167
save_interval: 1
validate: True
valid_interval: 1
epochs: 300
topk: 5
image_shape: [3, 224, 224]
use_mix: True
ls_epsilon: 0.1
LEARNING_RATE:
function: 'CosineWarmup'
params:
lr: 0.1
OPTIMIZER:
function: 'Momentum'
params:
momentum: 0.9
regularizer:
function: 'L2'
factor: 0.000070
TRAIN:
batch_size: 256
num_workers: 4
file_list: "./dataset/ILSVRC2012/train_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- RandCropImage:
size: 224
- RandFlipImage:
flip_code: 1
- AutoAugment:
- NormalizeImage:
scale: 1./255.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
mix:
- CutmixOperator:
alpha: 0.2
VALID:
batch_size: 64
num_workers: 4
file_list: "./dataset/ILSVRC2012/val_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
resize_short: 256
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
mode: 'train'
ARCHITECTURE:
name: 'ResNeSt50_fast_1s1x64d'
pretrained_model: ""
model_save_dir: "./output/"
classes_num: 1000
total_images: 1281167
save_interval: 1
validate: True
valid_interval: 1
epochs: 300
topk: 5
image_shape: [3, 224, 224]
use_mix: True
ls_epsilon: 0.1
LEARNING_RATE:
function: 'CosineWarmup'
params:
lr: 0.1
OPTIMIZER:
function: 'Momentum'
params:
momentum: 0.9
regularizer:
function: 'L2'
factor: 0.000070
TRAIN:
batch_size: 256
num_workers: 4
file_list: "./dataset/ILSVRC2012/train_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- RandCropImage:
size: 224
- RandFlipImage:
flip_code: 1
- AutoAugment:
- NormalizeImage:
scale: 1./255.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
mix:
- CutmixOperator:
alpha: 0.2
VALID:
batch_size: 64
num_workers: 4
file_list: "./dataset/ILSVRC2012/val_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
resize_short: 256
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
mode: 'valid'
ARCHITECTURE:
name: 'ResNeXt101_32x8d_wsl'
pretrained_model: ""
model_save_dir: "./output/"
classes_num: 1000
total_images: 1281167
save_interval: 1
validate: True
valid_interval: 1
epochs: 120
topk: 5
image_shape: [3, 224, 224]
VALID:
batch_size: 64
num_workers: 4
file_list: "./dataset/ILSVRC2012/val_list.txt"
data_dir: "./dataset/ILSVRC2012/"
shuffle_seed: 0
transforms:
- DecodeImage:
to_rgb: True
to_np: False
channel_first: False
- ResizeImage:
resize_short: 224
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
...@@ -9,7 +9,7 @@ RegNet was proposed in 2020 by Facebook to deepen the concept of design space. B ...@@ -9,7 +9,7 @@ RegNet was proposed in 2020 by Facebook to deepen the concept of design space. B
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| ResNeSt50_fast_1s1x64d | 0.8035 | 0.9528| 0.8035 | -| 8.68 | 26.3 | | ResNeSt50_fast_1s1x64d | 0.8035 | 0.9528| 0.8035 | -| 8.68 | 26.3 |
| ResNeSt50 | 0.8102 | 0.9542| 0.8113 | -| 10.78 | 27.5 | | ResNeSt50 | 0.8083 | 0.9542| 0.8113 | -| 10.78 | 27.5 |
| RegNetX_4GF | 0.7850 | 0.9416| 0.7860 | -| 8.0 | 22.1 | | RegNetX_4GF | 0.7850 | 0.9416| 0.7860 | -| 8.0 | 22.1 |
......
...@@ -221,12 +221,14 @@ Firstly, you should export inference model using `tools/export_model.py`. ...@@ -221,12 +221,14 @@ Firstly, you should export inference model using `tools/export_model.py`.
python tools/export_model.py \ python tools/export_model.py \
--model=MobileNetV3_large_x1_0 \ --model=MobileNetV3_large_x1_0 \
--pretrained_model=./output/MobileNetV3_large_x1_0/best_model/ppcls \ --pretrained_model=./output/MobileNetV3_large_x1_0/best_model/ppcls \
--output_path=./exported_model --output_path=./inference/cls_infer
``` ```
Among them, the `--model` parameter is used to specify the model name, `--pretrained_model` parameter is used to specify the model file path, the path does not need to include the model file suffix name, and `--output_path` is used to specify the storage path of the converted model . Among them, the `--model` parameter is used to specify the model name, `--pretrained_model` parameter is used to specify the model file path, the path does not need to include the model file suffix name, and `--output_path` is used to specify the storage path of the converted model.
**Note**: In the file `export_model.py:line53`, the `shape` parameter is the shape of the model input image, the default is `224*224`. Please modify it according to the actual situation, as shown below: **Note**:
1. File prefix must be assigned in `--output_path`. If `--output_path=./inference/cls_infer`, then three files will be generated in the folder `inference`, they are `cls_infer.pdiparams`, `cls_infer.pdmodel` and `cls_infer.pdiparams.info`.
2. In the file `export_model.py:line53`, the `shape` parameter is the shape of the model input image, the default is `224*224`. Please modify it according to the actual situation, as shown below:
```python ```python
50 # Please modify the 'shape' according to actual needs 50 # Please modify the 'shape' according to actual needs
...@@ -236,7 +238,7 @@ Among them, the `--model` parameter is used to specify the model name, `--pretra ...@@ -236,7 +238,7 @@ Among them, the `--model` parameter is used to specify the model name, `--pretra
54 ]) 54 ])
``` ```
The above command will generate the model structure file (`__model__`) and the model weight file (`__variables__`), and then the inference engine can be used for inference: The above command will generate the model structure file (`cls_infer.pdmodel`) and the model weight file (`cls_infer.pdiparams`), and then the inference engine can be used for inference:
```bash ```bash
python tools/infer/predict.py \ python tools/infer/predict.py \
...@@ -248,8 +250,8 @@ python tools/infer/predict.py \ ...@@ -248,8 +250,8 @@ python tools/infer/predict.py \
``` ```
Among them: Among them:
+ `image_file`(i): The path of the image file to be predicted, such as `./test.jpeg`; + `image_file`(i): The path of the image file to be predicted, such as `./test.jpeg`;
+ `model_file`(m): Model file path, such as `./MobileNetV3_large_x1_0/__model__`; + `model_file`(m): Model file path, such as `./MobileNetV3_large_x1_0/cls_infer.pdmodel`;
+ `params_file`(p): Weight file path, such as `./MobileNetV3_large_x1_0/__variables__`; + `params_file`(p): Weight file path, such as `./MobileNetV3_large_x1_0/cls_infer.pdiparams`;
+ `use_tensorrt`: Whether to use the TesorRT, default by `True`; + `use_tensorrt`: Whether to use the TesorRT, default by `True`;
+ `use_gpu`: Whether to use the GPU, default by `True`. + `use_gpu`: Whether to use the GPU, default by `True`.
......
...@@ -12,7 +12,7 @@ RegNet是由facebook于2020年提出,旨在深化设计空间理念的概念 ...@@ -12,7 +12,7 @@ RegNet是由facebook于2020年提出,旨在深化设计空间理念的概念
| Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) | | Models | Top1 | Top5 | Reference<br>top1 | Reference<br>top5 | FLOPS<br>(G) | Parameters<br>(M) |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| ResNeSt50_fast_1s1x64d | 0.8035 | 0.9528| 0.8035 | -| 8.68 | 26.3 | | ResNeSt50_fast_1s1x64d | 0.8035 | 0.9528| 0.8035 | -| 8.68 | 26.3 |
| ResNeSt50 | 0.8102 | 0.9542| 0.8113 | -| 10.78 | 27.5 | | ResNeSt50 | 0.8083 | 0.9542| 0.8113 | -| 10.78 | 27.5 |
| RegNetX_4GF | 0.7850 | 0.9416| 0.7860 | -| 8.0 | 22.1 | | RegNetX_4GF | 0.7850 | 0.9416| 0.7860 | -| 8.0 | 22.1 |
......
...@@ -235,12 +235,14 @@ python tools/infer/infer.py \ ...@@ -235,12 +235,14 @@ python tools/infer/infer.py \
python tools/export_model.py \ python tools/export_model.py \
--model=MobileNetV3_large_x1_0 \ --model=MobileNetV3_large_x1_0 \
--pretrained_model=./output/MobileNetV3_large_x1_0/best_model/ppcls \ --pretrained_model=./output/MobileNetV3_large_x1_0/best_model/ppcls \
--output_path=./exported_model --output_path=./inference/cls_infer
``` ```
其中,参数`--model`用于指定模型名称,`--pretrained_model`用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[1.3 模型恢复训练](#1.3)),`--output_path`用于指定转换后模型的存储路径。 其中,参数`--model`用于指定模型名称,`--pretrained_model`用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[1.3 模型恢复训练](#1.3)),`--output_path`用于指定转换后模型的存储路径。
**注意**:文件`export_model.py:line53`中,`shape`参数为模型输入图像的`shape`,默认为`224*224`,请根据实际情况修改,如下所示: **注意**
1. `--output_path`中必须指定文件名的前缀,若`--output_path=./inference/cls_infer`,则会在`inference`文件夹下生成`cls_infer.pdiparams``cls_infer.pdmodel``cls_infer.pdiparams.info`文件。
2. 文件`export_model.py:line53`中,`shape`参数为模型输入图像的`shape`,默认为`224*224`,请根据实际情况修改,如下所示:
```python ```python
50 # Please modify the 'shape' according to actual needs 50 # Please modify the 'shape' according to actual needs
51 @to_static(input_spec=[ 51 @to_static(input_spec=[
...@@ -248,8 +250,9 @@ python tools/export_model.py \ ...@@ -248,8 +250,9 @@ python tools/export_model.py \
53 shape=[None, 3, 224, 224], dtype='float32') 53 shape=[None, 3, 224, 224], dtype='float32')
54 ]) 54 ])
``` ```
2.
上述命令将生成模型结构文件(`__model__`)和模型权重文件(`__variables__`),然后可以使用预测引擎进行推理: 上述命令将生成模型结构文件(`cls_infer.pdmodel`)和模型权重文件(`cls_infer.pdiparams`),然后可以使用预测引擎进行推理:
```bash ```bash
python tools/infer/predict.py \ python tools/infer/predict.py \
...@@ -261,8 +264,8 @@ python tools/infer/predict.py \ ...@@ -261,8 +264,8 @@ python tools/infer/predict.py \
``` ```
其中: 其中:
+ `image_file`(简写 i):待预测的图片文件路径,如 `./test.jpeg` + `image_file`(简写 i):待预测的图片文件路径,如 `./test.jpeg`
+ `model_file`(简写 m):模型文件路径,如 `./MobileNetV3_large_x1_0/__model__` + `model_file`(简写 m):模型文件路径,如 `./MobileNetV3_large_x1_0/cls_infer.pdmodel`
+ `params_file`(简写 p):权重文件路径,如 `./MobileNetV3_large_x1_0/__variables__` + `params_file`(简写 p):权重文件路径,如 `./MobileNetV3_large_x1_0/cls_infer.pdiparams`
+ `use_tensorrt`:是否使用 TesorRT 预测引擎,默认值:`True` + `use_tensorrt`:是否使用 TesorRT 预测引擎,默认值:`True`
+ `use_gpu`:是否使用 GPU 预测,默认值:`True` + `use_gpu`:是否使用 GPU 预测,默认值:`True`
......
...@@ -22,7 +22,7 @@ from .res2net_vd import Res2Net50_vd_48w_2s, Res2Net50_vd_26w_4s, Res2Net50_vd_1 ...@@ -22,7 +22,7 @@ from .res2net_vd import Res2Net50_vd_48w_2s, Res2Net50_vd_26w_4s, Res2Net50_vd_1
from .se_resnet_vd import SE_ResNet18_vd, SE_ResNet34_vd, SE_ResNet50_vd, SE_ResNet101_vd, SE_ResNet152_vd, SE_ResNet200_vd from .se_resnet_vd import SE_ResNet18_vd, SE_ResNet34_vd, SE_ResNet50_vd, SE_ResNet101_vd, SE_ResNet152_vd, SE_ResNet200_vd
from .se_resnext_vd import SE_ResNeXt50_vd_32x4d, SE_ResNeXt50_vd_32x4d, SENet154_vd from .se_resnext_vd import SE_ResNeXt50_vd_32x4d, SE_ResNeXt50_vd_32x4d, SENet154_vd
from .se_resnext import SE_ResNeXt50_32x4d, SE_ResNeXt101_32x4d, SE_ResNeXt152_64x4d from .se_resnext import SE_ResNeXt50_32x4d, SE_ResNeXt101_32x4d, SE_ResNeXt152_64x4d
from .dpn import DPN68 from .dpn import DPN68, DPN92, DPN98, DPN107, DPN131
from .densenet import DenseNet121 from .densenet import DenseNet121
from .hrnet import HRNet_W18_C, HRNet_W30_C, HRNet_W32_C, HRNet_W40_C, HRNet_W44_C, HRNet_W48_C, HRNet_W60_C, HRNet_W64_C, SE_HRNet_W18_C, SE_HRNet_W30_C, SE_HRNet_W32_C, SE_HRNet_W40_C, SE_HRNet_W44_C, SE_HRNet_W48_C, SE_HRNet_W60_C, SE_HRNet_W64_C from .hrnet import HRNet_W18_C, HRNet_W30_C, HRNet_W32_C, HRNet_W40_C, HRNet_W44_C, HRNet_W48_C, HRNet_W60_C, HRNet_W64_C, SE_HRNet_W18_C, SE_HRNet_W30_C, SE_HRNet_W32_C, SE_HRNet_W40_C, SE_HRNet_W44_C, SE_HRNet_W48_C, SE_HRNet_W60_C, SE_HRNet_W64_C
from .efficientnet import EfficientNetB0, EfficientNetB1, EfficientNetB2, EfficientNetB3, EfficientNetB4, EfficientNetB5, EfficientNetB6, EfficientNetB7 from .efficientnet import EfficientNetB0, EfficientNetB1, EfficientNetB2, EfficientNetB3, EfficientNetB4, EfficientNetB5, EfficientNetB6, EfficientNetB7
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout, ReLU from paddle.nn import Conv2D, BatchNorm, Linear, Dropout, ReLU
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -25,7 +25,7 @@ class ConvPoolLayer(nn.Layer): ...@@ -25,7 +25,7 @@ class ConvPoolLayer(nn.Layer):
self.relu = ReLU() if act == "relu" else None self.relu = ReLU() if act == "relu" else None
self._conv = Conv2d( self._conv = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -36,7 +36,7 @@ class ConvPoolLayer(nn.Layer): ...@@ -36,7 +36,7 @@ class ConvPoolLayer(nn.Layer):
name=name + "_weights", initializer=Uniform(-stdv, stdv)), name=name + "_weights", initializer=Uniform(-stdv, stdv)),
bias_attr=ParamAttr( bias_attr=ParamAttr(
name=name + "_offset", initializer=Uniform(-stdv, stdv))) name=name + "_offset", initializer=Uniform(-stdv, stdv)))
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=0) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=0)
def forward(self, inputs): def forward(self, inputs):
x = self._conv(inputs) x = self._conv(inputs)
...@@ -57,7 +57,7 @@ class AlexNetDY(nn.Layer): ...@@ -57,7 +57,7 @@ class AlexNetDY(nn.Layer):
self._conv2 = ConvPoolLayer( self._conv2 = ConvPoolLayer(
64, 192, 5, 1, 2, stdv, act="relu", name="conv2") 64, 192, 5, 1, 2, stdv, act="relu", name="conv2")
stdv = 1.0 / math.sqrt(192 * 3 * 3) stdv = 1.0 / math.sqrt(192 * 3 * 3)
self._conv3 = Conv2d( self._conv3 = Conv2D(
192, 192,
384, 384,
3, 3,
...@@ -68,7 +68,7 @@ class AlexNetDY(nn.Layer): ...@@ -68,7 +68,7 @@ class AlexNetDY(nn.Layer):
bias_attr=ParamAttr( bias_attr=ParamAttr(
name="conv3_offset", initializer=Uniform(-stdv, stdv))) name="conv3_offset", initializer=Uniform(-stdv, stdv)))
stdv = 1.0 / math.sqrt(384 * 3 * 3) stdv = 1.0 / math.sqrt(384 * 3 * 3)
self._conv4 = Conv2d( self._conv4 = Conv2D(
384, 384,
256, 256,
3, 3,
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -20,7 +20,7 @@ class ConvBNLayer(nn.Layer): ...@@ -20,7 +20,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -56,7 +56,7 @@ class BasicBlock(nn.Layer): ...@@ -56,7 +56,7 @@ class BasicBlock(nn.Layer):
def forward(self, inputs): def forward(self, inputs):
x = self._conv1(inputs) x = self._conv1(inputs)
x = self._conv2(x) x = self._conv2(x)
return paddle.elementwise_add(x=inputs, y=x) return paddle.add(x=inputs, y=x)
class DarkNet(nn.Layer): class DarkNet(nn.Layer):
...@@ -104,7 +104,7 @@ class DarkNet(nn.Layer): ...@@ -104,7 +104,7 @@ class DarkNet(nn.Layer):
self._basic_block_43 = BasicBlock(1024, 512, name="stage.4.2") self._basic_block_43 = BasicBlock(1024, 512, name="stage.4.2")
self._basic_block_44 = BasicBlock(1024, 512, name="stage.4.3") self._basic_block_44 = BasicBlock(1024, 512, name="stage.4.3")
self._pool = AdaptiveAvgPool2d(1) self._pool = AdaptiveAvgPool2D(1)
stdv = 1.0 / math.sqrt(1024.0) stdv = 1.0 / math.sqrt(1024.0)
self._out = Linear( self._out = Linear(
......
...@@ -20,8 +20,8 @@ import numpy as np ...@@ -20,8 +20,8 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -51,7 +51,7 @@ class BNACConvLayer(nn.Layer): ...@@ -51,7 +51,7 @@ class BNACConvLayer(nn.Layer):
moving_mean_name=name + '_bn_mean', moving_mean_name=name + '_bn_mean',
moving_variance_name=name + '_bn_variance') moving_variance_name=name + '_bn_variance')
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -145,7 +145,7 @@ class TransitionLayer(nn.Layer): ...@@ -145,7 +145,7 @@ class TransitionLayer(nn.Layer):
stride=1, stride=1,
name=name) name=name)
self.pool2d_avg = AvgPool2d(kernel_size=2, stride=2, padding=0) self.pool2d_avg = AvgPool2D(kernel_size=2, stride=2, padding=0)
def forward(self, input): def forward(self, input):
y = self.conv_ac_func(input) y = self.conv_ac_func(input)
...@@ -165,7 +165,7 @@ class ConvBNLayer(nn.Layer): ...@@ -165,7 +165,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -214,7 +214,7 @@ class DenseNet(nn.Layer): ...@@ -214,7 +214,7 @@ class DenseNet(nn.Layer):
act='relu', act='relu',
name="conv1") name="conv1")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_config = block_config self.block_config = block_config
...@@ -256,7 +256,7 @@ class DenseNet(nn.Layer): ...@@ -256,7 +256,7 @@ class DenseNet(nn.Layer):
moving_mean_name='conv5_blk_bn_mean', moving_mean_name='conv5_blk_bn_mean',
moving_variance_name='conv5_blk_bn_variance') moving_variance_name='conv5_blk_bn_variance')
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
stdv = 1.0 / math.sqrt(num_features * 1.0) stdv = 1.0 / math.sqrt(num_features * 1.0)
......
...@@ -21,8 +21,8 @@ import sys ...@@ -21,8 +21,8 @@ import sys
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear from paddle.nn import Conv2D, BatchNorm, Linear
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -49,7 +49,7 @@ class ConvBNLayer(nn.Layer): ...@@ -49,7 +49,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -93,7 +93,7 @@ class BNACConvLayer(nn.Layer): ...@@ -93,7 +93,7 @@ class BNACConvLayer(nn.Layer):
moving_mean_name=name + '_bn_mean', moving_mean_name=name + '_bn_mean',
moving_variance_name=name + '_bn_variance') moving_variance_name=name + '_bn_variance')
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -202,7 +202,7 @@ class DualPathFactory(nn.Layer): ...@@ -202,7 +202,7 @@ class DualPathFactory(nn.Layer):
c1x1_c, num_or_sections=[self.num_1x1_c, self.inc], axis=1) c1x1_c, num_or_sections=[self.num_1x1_c, self.inc], axis=1)
# OUTPUTS # OUTPUTS
summ = paddle.elementwise_add(x=data_o1, y=c1x1_c1) summ = paddle.add(x=data_o1, y=c1x1_c1)
dense = paddle.concat([data_o2, c1x1_c2], axis=1) dense = paddle.concat([data_o2, c1x1_c2], axis=1)
# tensor, channels # tensor, channels
return [summ, dense] return [summ, dense]
...@@ -236,7 +236,7 @@ class DPN(nn.Layer): ...@@ -236,7 +236,7 @@ class DPN(nn.Layer):
act='relu', act='relu',
name="conv1") name="conv1")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
num_channel_dpn = init_num_filter num_channel_dpn = init_num_filter
...@@ -301,7 +301,7 @@ class DPN(nn.Layer): ...@@ -301,7 +301,7 @@ class DPN(nn.Layer):
moving_mean_name='final_concat_bn_mean', moving_mean_name='final_concat_bn_mean',
moving_variance_name='final_concat_bn_variance') moving_variance_name='final_concat_bn_variance')
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
stdv = 0.01 stdv = 0.01
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
import math import math
import collections import collections
import re import re
...@@ -300,7 +300,7 @@ class Conv2ds(nn.Layer): ...@@ -300,7 +300,7 @@ class Conv2ds(nn.Layer):
padding = padding_type padding = padding_type
groups = 1 if groups is None else groups groups = 1 if groups is None else groups
self._conv = Conv2d( self._conv = Conv2D(
input_channels, input_channels,
output_channels, output_channels,
filter_size, filter_size,
...@@ -484,7 +484,7 @@ class SEBlock(nn.Layer): ...@@ -484,7 +484,7 @@ class SEBlock(nn.Layer):
cur_stage=None): cur_stage=None):
super(SEBlock, self).__init__() super(SEBlock, self).__init__()
self._pool = AdaptiveAvgPool2d(1) self._pool = AdaptiveAvgPool2D(1)
self._conv1 = Conv2ds( self._conv1 = Conv2ds(
input_channels, input_channels,
num_squeezed_channels, num_squeezed_channels,
...@@ -582,7 +582,7 @@ class MbConvBlock(nn.Layer): ...@@ -582,7 +582,7 @@ class MbConvBlock(nn.Layer):
self.block_args.input_filters == self.block_args.output_filters: self.block_args.input_filters == self.block_args.output_filters:
if self.drop_connect_rate: if self.drop_connect_rate:
x = _drop_connect(x, self.drop_connect_rate, not self.training) x = _drop_connect(x, self.drop_connect_rate, not self.training)
x = paddle.elementwise_add(x, inputs) x = paddle.add(x, inputs)
return x return x
...@@ -755,7 +755,7 @@ class EfficientNet(nn.Layer): ...@@ -755,7 +755,7 @@ class EfficientNet(nn.Layer):
bn_name="_bn1", bn_name="_bn1",
model_name=self.name, model_name=self.name,
cur_stage=7) cur_stage=7)
self._pool = AdaptiveAvgPool2d(1) self._pool = AdaptiveAvgPool2D(1)
if self._global_params.dropout_rate: if self._global_params.dropout_rate:
self._drop = Dropout( self._drop = Dropout(
......
...@@ -17,9 +17,9 @@ import paddle ...@@ -17,9 +17,9 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, AdaptiveAvgPool2d, Linear from paddle.nn import Conv2D, BatchNorm, AdaptiveAvgPool2D, Linear
from paddle.fluid.regularizer import L2DecayRegularizer from paddle.regularizer import L2Decay
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform, KaimingNormal
class ConvBNLayer(nn.Layer): class ConvBNLayer(nn.Layer):
...@@ -32,7 +32,7 @@ class ConvBNLayer(nn.Layer): ...@@ -32,7 +32,7 @@ class ConvBNLayer(nn.Layer):
act="relu", act="relu",
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=in_channels, in_channels=in_channels,
out_channels=out_channels, out_channels=out_channels,
kernel_size=kernel_size, kernel_size=kernel_size,
...@@ -40,7 +40,7 @@ class ConvBNLayer(nn.Layer): ...@@ -40,7 +40,7 @@ class ConvBNLayer(nn.Layer):
padding=(kernel_size - 1) // 2, padding=(kernel_size - 1) // 2,
groups=groups, groups=groups,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=nn.initializer.MSRA(), name=name + "_weights"), initializer=KaimingNormal(), name=name + "_weights"),
bias_attr=False) bias_attr=False)
bn_name = name + "_bn" bn_name = name + "_bn"
...@@ -49,11 +49,9 @@ class ConvBNLayer(nn.Layer): ...@@ -49,11 +49,9 @@ class ConvBNLayer(nn.Layer):
num_channels=out_channels, num_channels=out_channels,
act=act, act=act,
param_attr=ParamAttr( param_attr=ParamAttr(
name=bn_name + "_scale", name=bn_name + "_scale", regularizer=L2Decay(0.0)),
regularizer=L2DecayRegularizer(regularization_coeff=0.0)),
bias_attr=ParamAttr( bias_attr=ParamAttr(
name=bn_name + "_offset", name=bn_name + "_offset", regularizer=L2Decay(0.0)),
regularizer=L2DecayRegularizer(regularization_coeff=0.0)),
moving_mean_name=bn_name + "_mean", moving_mean_name=bn_name + "_mean",
moving_variance_name=name + moving_variance_name=name +
"_variance" # wrong due to an old typo, will be fixed later. "_variance" # wrong due to an old typo, will be fixed later.
...@@ -68,7 +66,7 @@ class ConvBNLayer(nn.Layer): ...@@ -68,7 +66,7 @@ class ConvBNLayer(nn.Layer):
class SEBlock(nn.Layer): class SEBlock(nn.Layer):
def __init__(self, num_channels, reduction_ratio=4, name=None): def __init__(self, num_channels, reduction_ratio=4, name=None):
super(SEBlock, self).__init__() super(SEBlock, self).__init__()
self.pool2d_gap = AdaptiveAvgPool2d(1) self.pool2d_gap = AdaptiveAvgPool2D(1)
self._num_channels = num_channels self._num_channels = num_channels
stdv = 1.0 / math.sqrt(num_channels * 1.0) stdv = 1.0 / math.sqrt(num_channels * 1.0)
med_ch = num_channels // reduction_ratio med_ch = num_channels // reduction_ratio
...@@ -92,7 +90,7 @@ class SEBlock(nn.Layer): ...@@ -92,7 +90,7 @@ class SEBlock(nn.Layer):
squeeze = self.squeeze(pool) squeeze = self.squeeze(pool)
squeeze = F.relu(squeeze) squeeze = F.relu(squeeze)
excitation = self.excitation(squeeze) excitation = self.excitation(squeeze)
excitation = paddle.fluid.layers.clip(x=excitation, min=0, max=1) excitation = paddle.clip(x=excitation, min=0, max=1)
excitation = paddle.reshape( excitation = paddle.reshape(
excitation, shape=[-1, self._num_channels, 1, 1]) excitation, shape=[-1, self._num_channels, 1, 1])
out = inputs * excitation out = inputs * excitation
...@@ -208,7 +206,7 @@ class GhostBottleneck(nn.Layer): ...@@ -208,7 +206,7 @@ class GhostBottleneck(nn.Layer):
else: else:
shortcut = self.shortcut_depthwise(inputs) shortcut = self.shortcut_depthwise(inputs)
shortcut = self.shortcut_conv(shortcut) shortcut = self.shortcut_conv(shortcut)
return paddle.elementwise_add(x=x, y=shortcut, axis=-1) return paddle.add(x=x, y=shortcut)
class GhostNet(nn.Layer): class GhostNet(nn.Layer):
...@@ -273,7 +271,7 @@ class GhostNet(nn.Layer): ...@@ -273,7 +271,7 @@ class GhostNet(nn.Layer):
groups=1, groups=1,
act="relu", act="relu",
name="conv_last") name="conv_last")
self.pool2d_gap = AdaptiveAvgPool2d(1) self.pool2d_gap = AdaptiveAvgPool2D(1)
in_channels = output_channels in_channels = output_channels
self._fc0_output_channels = 1280 self._fc0_output_channels = 1280
self.fc_0 = ConvBNLayer( self.fc_0 = ConvBNLayer(
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -29,7 +29,7 @@ class ConvLayer(nn.Layer): ...@@ -29,7 +29,7 @@ class ConvLayer(nn.Layer):
name=None): name=None):
super(ConvLayer, self).__init__() super(ConvLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -73,7 +73,7 @@ class Inception(nn.Layer): ...@@ -73,7 +73,7 @@ class Inception(nn.Layer):
name="inception_" + name + "_5x5_reduce") name="inception_" + name + "_5x5_reduce")
self._conv5 = ConvLayer( self._conv5 = ConvLayer(
filter5R, filter5, 5, name="inception_" + name + "_5x5") filter5R, filter5, 5, name="inception_" + name + "_5x5")
self._pool = MaxPool2d(kernel_size=3, stride=1, padding=1) self._pool = MaxPool2D(kernel_size=3, stride=1, padding=1)
self._convprj = ConvLayer( self._convprj = ConvLayer(
input_channels, proj, 1, name="inception_" + name + "_3x3_proj") input_channels, proj, 1, name="inception_" + name + "_3x3_proj")
...@@ -99,7 +99,7 @@ class GoogleNetDY(nn.Layer): ...@@ -99,7 +99,7 @@ class GoogleNetDY(nn.Layer):
def __init__(self, class_dim=1000): def __init__(self, class_dim=1000):
super(GoogleNetDY, self).__init__() super(GoogleNetDY, self).__init__()
self._conv = ConvLayer(3, 64, 7, 2, name="conv1") self._conv = ConvLayer(3, 64, 7, 2, name="conv1")
self._pool = MaxPool2d(kernel_size=3, stride=2) self._pool = MaxPool2D(kernel_size=3, stride=2)
self._conv_1 = ConvLayer(64, 64, 1, name="conv2_1x1") self._conv_1 = ConvLayer(64, 64, 1, name="conv2_1x1")
self._conv_2 = ConvLayer(64, 192, 3, name="conv2_3x3") self._conv_2 = ConvLayer(64, 192, 3, name="conv2_3x3")
...@@ -124,7 +124,7 @@ class GoogleNetDY(nn.Layer): ...@@ -124,7 +124,7 @@ class GoogleNetDY(nn.Layer):
self._ince5b = Inception( self._ince5b = Inception(
832, 832, 384, 192, 384, 48, 128, 128, name="ince5b") 832, 832, 384, 192, 384, 48, 128, 128, name="ince5b")
self._pool_5 = AvgPool2d(kernel_size=7, stride=7) self._pool_5 = AvgPool2D(kernel_size=7, stride=7)
self._drop = Dropout(p=0.4, mode="downscale_in_infer") self._drop = Dropout(p=0.4, mode="downscale_in_infer")
self._fc_out = Linear( self._fc_out = Linear(
...@@ -132,7 +132,7 @@ class GoogleNetDY(nn.Layer): ...@@ -132,7 +132,7 @@ class GoogleNetDY(nn.Layer):
class_dim, class_dim,
weight_attr=xavier(1024, 1, "out"), weight_attr=xavier(1024, 1, "out"),
bias_attr=ParamAttr(name="out_offset")) bias_attr=ParamAttr(name="out_offset"))
self._pool_o1 = AvgPool2d(kernel_size=5, stride=3) self._pool_o1 = AvgPool2D(kernel_size=5, stride=3)
self._conv_o1 = ConvLayer(512, 128, 1, name="conv_o1") self._conv_o1 = ConvLayer(512, 128, 1, name="conv_o1")
self._fc_o1 = Linear( self._fc_o1 = Linear(
1152, 1152,
...@@ -145,7 +145,7 @@ class GoogleNetDY(nn.Layer): ...@@ -145,7 +145,7 @@ class GoogleNetDY(nn.Layer):
class_dim, class_dim,
weight_attr=xavier(1024, 1, "out1"), weight_attr=xavier(1024, 1, "out1"),
bias_attr=ParamAttr(name="out1_offset")) bias_attr=ParamAttr(name="out1_offset"))
self._pool_o2 = AvgPool2d(kernel_size=5, stride=3) self._pool_o2 = AvgPool2D(kernel_size=5, stride=3)
self._conv_o2 = ConvLayer(528, 128, 1, name="conv_o2") self._conv_o2 = ConvLayer(528, 128, 1, name="conv_o2")
self._fc_o2 = Linear( self._fc_o2 = Linear(
1152, 1152,
...@@ -184,7 +184,6 @@ class GoogleNetDY(nn.Layer): ...@@ -184,7 +184,6 @@ class GoogleNetDY(nn.Layer):
x = self._drop(x) x = self._drop(x)
x = paddle.squeeze(x, axis=[2, 3]) x = paddle.squeeze(x, axis=[2, 3])
out = self._fc_out(x) out = self._fc_out(x)
out = F.softmax(out)
x = self._pool_o1(ince4a) x = self._pool_o1(ince4a)
x = self._conv_o1(x) x = self._conv_o1(x)
...@@ -193,7 +192,6 @@ class GoogleNetDY(nn.Layer): ...@@ -193,7 +192,6 @@ class GoogleNetDY(nn.Layer):
x = F.relu(x) x = F.relu(x)
x = self._drop_o1(x) x = self._drop_o1(x)
out1 = self._out1(x) out1 = self._out1(x)
out1 = F.softmax(out1)
x = self._pool_o2(ince4d) x = self._pool_o2(ince4d)
x = self._conv_o2(x) x = self._conv_o2(x)
......
...@@ -21,8 +21,8 @@ import paddle ...@@ -21,8 +21,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear from paddle.nn import Conv2D, BatchNorm, Linear
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -58,7 +58,7 @@ class ConvBNLayer(nn.Layer): ...@@ -58,7 +58,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -245,7 +245,8 @@ class BottleneckBlock(nn.Layer): ...@@ -245,7 +245,8 @@ class BottleneckBlock(nn.Layer):
if self.has_se: if self.has_se:
conv3 = self.se(conv3) conv3 = self.se(conv3)
y = paddle.elementwise_add(x=conv3, y=residual, act="relu") y = paddle.add(x=conv3, y=residual)
y = F.relu(y)
return y return y
...@@ -303,7 +304,8 @@ class BasicBlock(nn.Layer): ...@@ -303,7 +304,8 @@ class BasicBlock(nn.Layer):
if self.has_se: if self.has_se:
conv2 = self.se(conv2) conv2 = self.se(conv2)
y = paddle.elementwise_add(x=conv2, y=residual, act="relu") y = paddle.add(x=conv2, y=residual)
y = F.relu(y)
return y return y
...@@ -311,7 +313,7 @@ class SELayer(nn.Layer): ...@@ -311,7 +313,7 @@ class SELayer(nn.Layer):
def __init__(self, num_channels, num_filters, reduction_ratio, name=None): def __init__(self, num_channels, num_filters, reduction_ratio, name=None):
super(SELayer, self).__init__() super(SELayer, self).__init__()
self.pool2d_gap = AdaptiveAvgPool2d(1) self.pool2d_gap = AdaptiveAvgPool2D(1)
self._num_channels = num_channels self._num_channels = num_channels
...@@ -482,17 +484,15 @@ class FuseLayers(nn.Layer): ...@@ -482,17 +484,15 @@ class FuseLayers(nn.Layer):
y = self.residual_func_list[residual_func_idx](input[j]) y = self.residual_func_list[residual_func_idx](input[j])
residual_func_idx += 1 residual_func_idx += 1
y = F.resize_nearest(input=y, scale=2**(j - i)) y = F.upsample(y, scale_factor=2**(j - i), mode="nearest")
residual = paddle.elementwise_add( residual = paddle.add(x=residual, y=y)
x=residual, y=y, act=None)
elif j < i: elif j < i:
y = input[j] y = input[j]
for k in range(i - j): for k in range(i - j):
y = self.residual_func_list[residual_func_idx](y) y = self.residual_func_list[residual_func_idx](y)
residual_func_idx += 1 residual_func_idx += 1
residual = paddle.elementwise_add( residual = paddle.add(x=residual, y=y)
x=residual, y=y, act=None)
residual = F.relu(residual) residual = F.relu(residual)
outs.append(residual) outs.append(residual)
...@@ -623,7 +623,7 @@ class HRNet(nn.Layer): ...@@ -623,7 +623,7 @@ class HRNet(nn.Layer):
stride=1, stride=1,
name="cls_head_last_conv") name="cls_head_last_conv")
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
stdv = 1.0 / math.sqrt(2048 * 1.0) stdv = 1.0 / math.sqrt(2048 * 1.0)
......
...@@ -16,8 +16,8 @@ import paddle ...@@ -16,8 +16,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -36,7 +36,7 @@ class ConvBNLayer(nn.Layer): ...@@ -36,7 +36,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -68,7 +68,7 @@ class InceptionStem(nn.Layer): ...@@ -68,7 +68,7 @@ class InceptionStem(nn.Layer):
self._conv_2 = ConvBNLayer(32, 32, 3, act="relu", name="conv2_3x3_s1") self._conv_2 = ConvBNLayer(32, 32, 3, act="relu", name="conv2_3x3_s1")
self._conv_3 = ConvBNLayer( self._conv_3 = ConvBNLayer(
32, 64, 3, padding=1, act="relu", name="conv3_3x3_s1") 32, 64, 3, padding=1, act="relu", name="conv3_3x3_s1")
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=0) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=0)
self._conv2 = ConvBNLayer( self._conv2 = ConvBNLayer(
64, 96, 3, stride=2, act="relu", name="inception_stem1_3x3_s2") 64, 96, 3, stride=2, act="relu", name="inception_stem1_3x3_s2")
self._conv1_1 = ConvBNLayer( self._conv1_1 = ConvBNLayer(
...@@ -123,7 +123,7 @@ class InceptionStem(nn.Layer): ...@@ -123,7 +123,7 @@ class InceptionStem(nn.Layer):
class InceptionA(nn.Layer): class InceptionA(nn.Layer):
def __init__(self, name): def __init__(self, name):
super(InceptionA, self).__init__() super(InceptionA, self).__init__()
self._pool = AvgPool2d(kernel_size=3, stride=1, padding=1) self._pool = AvgPool2D(kernel_size=3, stride=1, padding=1)
self._conv1 = ConvBNLayer( self._conv1 = ConvBNLayer(
384, 96, 1, act="relu", name="inception_a" + name + "_1x1") 384, 96, 1, act="relu", name="inception_a" + name + "_1x1")
self._conv2 = ConvBNLayer( self._conv2 = ConvBNLayer(
...@@ -178,7 +178,7 @@ class InceptionA(nn.Layer): ...@@ -178,7 +178,7 @@ class InceptionA(nn.Layer):
class ReductionA(nn.Layer): class ReductionA(nn.Layer):
def __init__(self): def __init__(self):
super(ReductionA, self).__init__() super(ReductionA, self).__init__()
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=0) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=0)
self._conv2 = ConvBNLayer( self._conv2 = ConvBNLayer(
384, 384, 3, stride=2, act="relu", name="reduction_a_3x3") 384, 384, 3, stride=2, act="relu", name="reduction_a_3x3")
self._conv3_1 = ConvBNLayer( self._conv3_1 = ConvBNLayer(
...@@ -201,7 +201,7 @@ class ReductionA(nn.Layer): ...@@ -201,7 +201,7 @@ class ReductionA(nn.Layer):
class InceptionB(nn.Layer): class InceptionB(nn.Layer):
def __init__(self, name=None): def __init__(self, name=None):
super(InceptionB, self).__init__() super(InceptionB, self).__init__()
self._pool = AvgPool2d(kernel_size=3, stride=1, padding=1) self._pool = AvgPool2D(kernel_size=3, stride=1, padding=1)
self._conv1 = ConvBNLayer( self._conv1 = ConvBNLayer(
1024, 128, 1, act="relu", name="inception_b" + name + "_1x1") 1024, 128, 1, act="relu", name="inception_b" + name + "_1x1")
self._conv2 = ConvBNLayer( self._conv2 = ConvBNLayer(
...@@ -278,7 +278,7 @@ class InceptionB(nn.Layer): ...@@ -278,7 +278,7 @@ class InceptionB(nn.Layer):
class ReductionB(nn.Layer): class ReductionB(nn.Layer):
def __init__(self): def __init__(self):
super(ReductionB, self).__init__() super(ReductionB, self).__init__()
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=0) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=0)
self._conv2_1 = ConvBNLayer( self._conv2_1 = ConvBNLayer(
1024, 192, 1, act="relu", name="reduction_b_3x3_reduce") 1024, 192, 1, act="relu", name="reduction_b_3x3_reduce")
self._conv2_2 = ConvBNLayer( self._conv2_2 = ConvBNLayer(
...@@ -319,7 +319,7 @@ class ReductionB(nn.Layer): ...@@ -319,7 +319,7 @@ class ReductionB(nn.Layer):
class InceptionC(nn.Layer): class InceptionC(nn.Layer):
def __init__(self, name=None): def __init__(self, name=None):
super(InceptionC, self).__init__() super(InceptionC, self).__init__()
self._pool = AvgPool2d(kernel_size=3, stride=1, padding=1) self._pool = AvgPool2D(kernel_size=3, stride=1, padding=1)
self._conv1 = ConvBNLayer( self._conv1 = ConvBNLayer(
1536, 256, 1, act="relu", name="inception_c" + name + "_1x1") 1536, 256, 1, act="relu", name="inception_c" + name + "_1x1")
self._conv2 = ConvBNLayer( self._conv2 = ConvBNLayer(
...@@ -411,7 +411,7 @@ class InceptionV4DY(nn.Layer): ...@@ -411,7 +411,7 @@ class InceptionV4DY(nn.Layer):
self._inceptionC_2 = InceptionC(name="2") self._inceptionC_2 = InceptionC(name="2")
self._inceptionC_3 = InceptionC(name="3") self._inceptionC_3 = InceptionC(name="3")
self.avg_pool = AdaptiveAvgPool2d(1) self.avg_pool = AdaptiveAvgPool2D(1)
self._drop = Dropout(p=0.2, mode="downscale_in_infer") self._drop = Dropout(p=0.2, mode="downscale_in_infer")
stdv = 1.0 / math.sqrt(1536 * 1.0) stdv = 1.0 / math.sqrt(1536 * 1.0)
self.out = Linear( self.out = Linear(
......
...@@ -21,9 +21,9 @@ import paddle ...@@ -21,9 +21,9 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import MSRA from paddle.nn.initializer import KaimingNormal
import math import math
__all__ = [ __all__ = [
...@@ -44,7 +44,7 @@ class ConvBNLayer(nn.Layer): ...@@ -44,7 +44,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -52,7 +52,7 @@ class ConvBNLayer(nn.Layer): ...@@ -52,7 +52,7 @@ class ConvBNLayer(nn.Layer):
padding=padding, padding=padding,
groups=num_groups, groups=num_groups,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=MSRA(), name=name + "_weights"), initializer=KaimingNormal(), name=name + "_weights"),
bias_attr=False) bias_attr=False)
self._batch_norm = BatchNorm( self._batch_norm = BatchNorm(
...@@ -227,13 +227,13 @@ class MobileNet(nn.Layer): ...@@ -227,13 +227,13 @@ class MobileNet(nn.Layer):
name="conv6")) name="conv6"))
self.block_list.append(conv6) self.block_list.append(conv6)
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.out = Linear( self.out = Linear(
int(1024 * scale), int(1024 * scale),
class_dim, class_dim,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=MSRA(), name="fc7_weights"), initializer=KaimingNormal(), name="fc7_weights"),
bias_attr=ParamAttr(name="fc7_offset")) bias_attr=ParamAttr(name="fc7_offset"))
def forward(self, inputs): def forward(self, inputs):
......
...@@ -21,8 +21,8 @@ import paddle ...@@ -21,8 +21,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
import math import math
...@@ -45,7 +45,7 @@ class ConvBNLayer(nn.Layer): ...@@ -45,7 +45,7 @@ class ConvBNLayer(nn.Layer):
use_cudnn=True): use_cudnn=True):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -108,7 +108,7 @@ class InvertedResidualUnit(nn.Layer): ...@@ -108,7 +108,7 @@ class InvertedResidualUnit(nn.Layer):
y = self._bottleneck_conv(y, if_act=True) y = self._bottleneck_conv(y, if_act=True)
y = self._linear_conv(y, if_act=False) y = self._linear_conv(y, if_act=False)
if ifshortcut: if ifshortcut:
y = paddle.elementwise_add(inputs, y) y = paddle.add(inputs, y)
return y return y
...@@ -199,7 +199,7 @@ class MobileNet(nn.Layer): ...@@ -199,7 +199,7 @@ class MobileNet(nn.Layer):
padding=0, padding=0,
name="conv9") name="conv9")
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.out = Linear( self.out = Linear(
self.out_c, self.out_c,
......
...@@ -21,9 +21,10 @@ import paddle ...@@ -21,9 +21,10 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn.functional.activation import hard_sigmoid, hard_swish
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.fluid.regularizer import L2Decay from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.regularizer import L2Decay
import math import math
...@@ -111,7 +112,8 @@ class MobileNetV3(nn.Layer): ...@@ -111,7 +112,8 @@ class MobileNetV3(nn.Layer):
i = 0 i = 0
inplanes = make_divisible(inplanes * scale) inplanes = make_divisible(inplanes * scale)
for (k, exp, c, se, nl, s) in self.cfg: for (k, exp, c, se, nl, s) in self.cfg:
self.block_list.append( block = self.add_sublayer(
"conv" + str(i + 2),
ResidualUnit( ResidualUnit(
in_c=inplanes, in_c=inplanes,
mid_c=make_divisible(scale * exp), mid_c=make_divisible(scale * exp),
...@@ -121,8 +123,7 @@ class MobileNetV3(nn.Layer): ...@@ -121,8 +123,7 @@ class MobileNetV3(nn.Layer):
use_se=se, use_se=se,
act=nl, act=nl,
name="conv" + str(i + 2))) name="conv" + str(i + 2)))
self.add_sublayer( self.block_list.append(block)
sublayer=self.block_list[-1], name="conv" + str(i + 2))
inplanes = make_divisible(scale * c) inplanes = make_divisible(scale * c)
i += 1 i += 1
...@@ -137,9 +138,9 @@ class MobileNetV3(nn.Layer): ...@@ -137,9 +138,9 @@ class MobileNetV3(nn.Layer):
act="hard_swish", act="hard_swish",
name="conv_last") name="conv_last")
self.pool = AdaptiveAvgPool2d(1) self.pool = AdaptiveAvgPool2D(1)
self.last_conv = Conv2d( self.last_conv = Conv2D(
in_channels=make_divisible(scale * self.cls_ch_squeeze), in_channels=make_divisible(scale * self.cls_ch_squeeze),
out_channels=self.cls_ch_expand, out_channels=self.cls_ch_expand,
kernel_size=1, kernel_size=1,
...@@ -158,6 +159,7 @@ class MobileNetV3(nn.Layer): ...@@ -158,6 +159,7 @@ class MobileNetV3(nn.Layer):
def forward(self, inputs, label=None): def forward(self, inputs, label=None):
x = self.conv1(inputs) x = self.conv1(inputs)
for block in self.block_list: for block in self.block_list:
x = block(x) x = block(x)
...@@ -165,10 +167,11 @@ class MobileNetV3(nn.Layer): ...@@ -165,10 +167,11 @@ class MobileNetV3(nn.Layer):
x = self.pool(x) x = self.pool(x)
x = self.last_conv(x) x = self.last_conv(x)
x = F.hard_swish(x) x = hard_swish(x)
x = self.dropout(x) x = self.dropout(x)
x = paddle.reshape(x, shape=[x.shape[0], x.shape[1]]) x = paddle.reshape(x, shape=[x.shape[0], x.shape[1]])
x = self.out(x) x = self.out(x)
return x return x
...@@ -187,7 +190,7 @@ class ConvBNLayer(nn.Layer): ...@@ -187,7 +190,7 @@ class ConvBNLayer(nn.Layer):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self.if_act = if_act self.if_act = if_act
self.act = act self.act = act
self.conv = Conv2d( self.conv = Conv2D(
in_channels=in_c, in_channels=in_c,
out_channels=out_c, out_channels=out_c,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -213,7 +216,7 @@ class ConvBNLayer(nn.Layer): ...@@ -213,7 +216,7 @@ class ConvBNLayer(nn.Layer):
if self.act == "relu": if self.act == "relu":
x = F.relu(x) x = F.relu(x)
elif self.act == "hard_swish": elif self.act == "hard_swish":
x = F.hard_swish(x) x = hard_swish(x)
else: else:
print("The activation function is selected incorrectly.") print("The activation function is selected incorrectly.")
exit() exit()
...@@ -272,15 +275,15 @@ class ResidualUnit(nn.Layer): ...@@ -272,15 +275,15 @@ class ResidualUnit(nn.Layer):
x = self.mid_se(x) x = self.mid_se(x)
x = self.linear_conv(x) x = self.linear_conv(x)
if self.if_shortcut: if self.if_shortcut:
x = paddle.elementwise_add(inputs, x) x = paddle.add(inputs, x)
return x return x
class SEModule(nn.Layer): class SEModule(nn.Layer):
def __init__(self, channel, reduction=4, name=""): def __init__(self, channel, reduction=4, name=""):
super(SEModule, self).__init__() super(SEModule, self).__init__()
self.avg_pool = AdaptiveAvgPool2d(1) self.avg_pool = AdaptiveAvgPool2D(1)
self.conv1 = Conv2d( self.conv1 = Conv2D(
in_channels=channel, in_channels=channel,
out_channels=channel // reduction, out_channels=channel // reduction,
kernel_size=1, kernel_size=1,
...@@ -288,7 +291,7 @@ class SEModule(nn.Layer): ...@@ -288,7 +291,7 @@ class SEModule(nn.Layer):
padding=0, padding=0,
weight_attr=ParamAttr(name=name + "_1_weights"), weight_attr=ParamAttr(name=name + "_1_weights"),
bias_attr=ParamAttr(name=name + "_1_offset")) bias_attr=ParamAttr(name=name + "_1_offset"))
self.conv2 = Conv2d( self.conv2 = Conv2D(
in_channels=channel // reduction, in_channels=channel // reduction,
out_channels=channel, out_channels=channel,
kernel_size=1, kernel_size=1,
...@@ -302,7 +305,7 @@ class SEModule(nn.Layer): ...@@ -302,7 +305,7 @@ class SEModule(nn.Layer):
outputs = self.conv1(outputs) outputs = self.conv1(outputs)
outputs = F.relu(outputs) outputs = F.relu(outputs)
outputs = self.conv2(outputs) outputs = self.conv2(outputs)
outputs = F.hard_sigmoid(outputs) outputs = hard_sigmoid(outputs)
return paddle.multiply(x=inputs, y=outputs, axis=0) return paddle.multiply(x=inputs, y=outputs, axis=0)
......
...@@ -20,8 +20,9 @@ import numpy as np ...@@ -20,8 +20,9 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout import paddle.nn.functional as F
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -30,6 +31,7 @@ __all__ = [ ...@@ -30,6 +31,7 @@ __all__ = [
"RegNetY_4GF", "RegNetY_32GF" "RegNetY_4GF", "RegNetY_32GF"
] ]
def quantize_float(f, q): def quantize_float(f, q):
"""Converts a float to closest non-zero int divisible by q.""" """Converts a float to closest non-zero int divisible by q."""
return int(round(f / q) * q) return int(round(f / q) * q)
...@@ -39,9 +41,7 @@ def adjust_ws_gs_comp(ws, bms, gs): ...@@ -39,9 +41,7 @@ def adjust_ws_gs_comp(ws, bms, gs):
"""Adjusts the compatibility of widths and groups.""" """Adjusts the compatibility of widths and groups."""
ws_bot = [int(w * b) for w, b in zip(ws, bms)] ws_bot = [int(w * b) for w, b in zip(ws, bms)]
gs = [min(g, w_bot) for g, w_bot in zip(gs, ws_bot)] gs = [min(g, w_bot) for g, w_bot in zip(gs, ws_bot)]
ws_bot = [ ws_bot = [quantize_float(w_bot, g) for w_bot, g in zip(ws_bot, gs)]
quantize_float(w_bot, g) for w_bot, g in zip(ws_bot, gs)
]
ws = [int(w_bot / b) for w_bot, b in zip(ws_bot, bms)] ws = [int(w_bot / b) for w_bot, b in zip(ws_bot, bms)]
return ws, gs return ws, gs
...@@ -81,7 +81,7 @@ class ConvBNLayer(nn.Layer): ...@@ -81,7 +81,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -98,21 +98,22 @@ class ConvBNLayer(nn.Layer): ...@@ -98,21 +98,22 @@ class ConvBNLayer(nn.Layer):
bias_attr=ParamAttr(bn_name + ".output.1.b_0"), bias_attr=ParamAttr(bn_name + ".output.1.b_0"),
moving_mean_name=bn_name + "_mean", moving_mean_name=bn_name + "_mean",
moving_variance_name=bn_name + "_variance") moving_variance_name=bn_name + "_variance")
def forward(self, inputs): def forward(self, inputs):
y = self._conv(inputs) y = self._conv(inputs)
y = self._batch_norm(y) y = self._batch_norm(y)
return y return y
class BottleneckBlock(nn.Layer): class BottleneckBlock(nn.Layer):
def __init__(self, def __init__(self,
num_channels, num_channels,
num_filters, num_filters,
stride, stride,
bm, bm,
gw, gw,
se_on, se_on,
se_r, se_r,
shortcut=True, shortcut=True,
name=None): name=None):
super(BottleneckBlock, self).__init__() super(BottleneckBlock, self).__init__()
...@@ -121,7 +122,7 @@ class BottleneckBlock(nn.Layer): ...@@ -121,7 +122,7 @@ class BottleneckBlock(nn.Layer):
w_b = int(round(num_filters * bm)) w_b = int(round(num_filters * bm))
# Compute the number of groups # Compute the number of groups
num_gs = w_b // gw num_gs = w_b // gw
self.se_on = se_on self.se_on = se_on
self.conv0 = ConvBNLayer( self.conv0 = ConvBNLayer(
num_channels=num_channels, num_channels=num_channels,
num_filters=w_b, num_filters=w_b,
...@@ -174,15 +175,16 @@ class BottleneckBlock(nn.Layer): ...@@ -174,15 +175,16 @@ class BottleneckBlock(nn.Layer):
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act="relu") y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
class SELayer(nn.Layer): class SELayer(nn.Layer):
def __init__(self, num_channels, num_filters, reduction_ratio, name=None): def __init__(self, num_channels, num_filters, reduction_ratio, name=None):
super(SELayer, self).__init__() super(SELayer, self).__init__()
self.pool2d_gap = AdaptiveAvgPool2d(1) self.pool2d_gap = AdaptiveAvgPool2D(1)
self._num_channels = num_channels self._num_channels = num_channels
...@@ -214,15 +216,23 @@ class SELayer(nn.Layer): ...@@ -214,15 +216,23 @@ class SELayer(nn.Layer):
excitation, shape=[-1, self._num_channels, 1, 1]) excitation, shape=[-1, self._num_channels, 1, 1])
out = input * excitation out = input * excitation
return out return out
class RegNet(nn.Layer): class RegNet(nn.Layer):
def __init__(self, w_a, w_0, w_m, d, group_w, bot_mul, q=8, se_on=False, class_dim=1000): def __init__(self,
w_a,
w_0,
w_m,
d,
group_w,
bot_mul,
q=8,
se_on=False,
class_dim=1000):
super(RegNet, self).__init__() super(RegNet, self).__init__()
# Generate RegNet ws per block # Generate RegNet ws per block
b_ws, num_s, max_s, ws_cont = generate_regnet( b_ws, num_s, max_s, ws_cont = generate_regnet(w_a, w_0, w_m, d, q)
w_a, w_0, w_m, d, q)
# Convert to per stage format # Convert to per stage format
ws, ds = get_stages_from_blocks(b_ws, b_ws) ws, ds = get_stages_from_blocks(b_ws, b_ws)
# Generate group widths and bot muls # Generate group widths and bot muls
...@@ -258,7 +268,8 @@ class RegNet(nn.Layer): ...@@ -258,7 +268,8 @@ class RegNet(nn.Layer):
num_channels = stem_w if block == i == 0 else in_channels num_channels = stem_w if block == i == 0 else in_channels
# Stride apply to the first block of the stage # Stride apply to the first block of the stage
b_stride = stride if i == 0 else 1 b_stride = stride if i == 0 else 1
conv_name = "s" + str(block + 1) + "_b" + str(i + 1) # chr(97 + i) conv_name = "s" + str(block + 1) + "_b" + str(i +
1) # chr(97 + i)
bottleneck_block = self.add_sublayer( bottleneck_block = self.add_sublayer(
conv_name, conv_name,
BottleneckBlock( BottleneckBlock(
...@@ -275,7 +286,7 @@ class RegNet(nn.Layer): ...@@ -275,7 +286,7 @@ class RegNet(nn.Layer):
self.block_list.append(bottleneck_block) self.block_list.append(bottleneck_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = w_out self.pool2d_avg_channels = w_out
...@@ -297,7 +308,7 @@ class RegNet(nn.Layer): ...@@ -297,7 +308,7 @@ class RegNet(nn.Layer):
y = self.out(y) y = self.out(y)
return y return y
def RegNetX_200MF(**args): def RegNetX_200MF(**args):
model = RegNet( model = RegNet(
w_a=36.44, w_0=24, w_m=2.49, d=13, group_w=8, bot_mul=1.0, q=8, **args) w_a=36.44, w_0=24, w_m=2.49, d=13, group_w=8, bot_mul=1.0, q=8, **args)
...@@ -306,13 +317,27 @@ def RegNetX_200MF(**args): ...@@ -306,13 +317,27 @@ def RegNetX_200MF(**args):
def RegNetX_4GF(**args): def RegNetX_4GF(**args):
model = RegNet( model = RegNet(
w_a=38.65, w_0=96, w_m=2.43, d=23, group_w=40, bot_mul=1.0, q=8, **args) w_a=38.65,
w_0=96,
w_m=2.43,
d=23,
group_w=40,
bot_mul=1.0,
q=8,
**args)
return model return model
def RegNetX_32GF(**args): def RegNetX_32GF(**args):
model = RegNet( model = RegNet(
w_a=69.86, w_0=320, w_m=2.0, d=23, group_w=168, bot_mul=1.0, q=8, **args) w_a=69.86,
w_0=320,
w_m=2.0,
d=23,
group_w=168,
bot_mul=1.0,
q=8,
**args)
return model return model
...@@ -356,4 +381,3 @@ def RegNetY_32GF(**args): ...@@ -356,4 +381,3 @@ def RegNetY_32GF(**args):
se_on=True, se_on=True,
**args) **args)
return model return model
...@@ -21,8 +21,8 @@ import paddle ...@@ -21,8 +21,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -46,7 +46,7 @@ class ConvBNLayer(nn.Layer): ...@@ -46,7 +46,7 @@ class ConvBNLayer(nn.Layer):
name=None, ): name=None, ):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -104,7 +104,7 @@ class BottleneckBlock(nn.Layer): ...@@ -104,7 +104,7 @@ class BottleneckBlock(nn.Layer):
act='relu', act='relu',
name=name + '_branch2b_' + str(s + 1))) name=name + '_branch2b_' + str(s + 1)))
self.conv1_list.append(conv1) self.conv1_list.append(conv1)
self.pool2d_avg = AvgPool2d(kernel_size=3, stride=stride, padding=1) self.pool2d_avg = AvgPool2D(kernel_size=3, stride=stride, padding=1)
self.conv2 = ConvBNLayer( self.conv2 = ConvBNLayer(
num_channels=num_filters, num_channels=num_filters,
...@@ -143,7 +143,8 @@ class BottleneckBlock(nn.Layer): ...@@ -143,7 +143,8 @@ class BottleneckBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act='relu') y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
...@@ -179,7 +180,7 @@ class Res2Net(nn.Layer): ...@@ -179,7 +180,7 @@ class Res2Net(nn.Layer):
stride=2, stride=2,
act='relu', act='relu',
name="conv1") name="conv1")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
for block in range(len(depth)): for block in range(len(depth)):
...@@ -207,7 +208,7 @@ class Res2Net(nn.Layer): ...@@ -207,7 +208,7 @@ class Res2Net(nn.Layer):
self.block_list.append(bottleneck_block) self.block_list.append(bottleneck_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
...@@ -21,8 +21,8 @@ import paddle ...@@ -21,8 +21,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -48,9 +48,9 @@ class ConvBNLayer(nn.Layer): ...@@ -48,9 +48,9 @@ class ConvBNLayer(nn.Layer):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self.is_vd_mode = is_vd_mode self.is_vd_mode = is_vd_mode
self._pool2d_avg = AvgPool2d( self._pool2d_avg = AvgPool2D(
kernel_size=2, stride=2, padding=0, ceil_mode=True) kernel_size=2, stride=2, padding=0, ceil_mode=True)
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -110,7 +110,7 @@ class BottleneckBlock(nn.Layer): ...@@ -110,7 +110,7 @@ class BottleneckBlock(nn.Layer):
act='relu', act='relu',
name=name + '_branch2b_' + str(s + 1))) name=name + '_branch2b_' + str(s + 1)))
self.conv1_list.append(conv1) self.conv1_list.append(conv1)
self.pool2d_avg = AvgPool2d(kernel_size=3, stride=stride, padding=1) self.pool2d_avg = AvgPool2D(kernel_size=3, stride=stride, padding=1)
self.conv2 = ConvBNLayer( self.conv2 = ConvBNLayer(
num_channels=num_filters, num_channels=num_filters,
...@@ -150,7 +150,8 @@ class BottleneckBlock(nn.Layer): ...@@ -150,7 +150,8 @@ class BottleneckBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act='relu') y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
...@@ -200,7 +201,7 @@ class Res2Net_vd(nn.Layer): ...@@ -200,7 +201,7 @@ class Res2Net_vd(nn.Layer):
stride=1, stride=1,
act='relu', act='relu',
name="conv1_3") name="conv1_3")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
for block in range(len(depth)): for block in range(len(depth)):
...@@ -228,7 +229,7 @@ class Res2Net_vd(nn.Layer): ...@@ -228,7 +229,7 @@ class Res2Net_vd(nn.Layer):
self.block_list.append(bottleneck_block) self.block_list.append(bottleneck_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
...@@ -20,11 +20,12 @@ import numpy as np ...@@ -20,11 +20,12 @@ import numpy as np
import paddle import paddle
import math import math
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F
from paddle import ParamAttr from paddle import ParamAttr
from paddle.nn.initializer import MSRA from paddle.nn.initializer import KaimingNormal
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.fluid.regularizer import L2Decay from paddle.regularizer import L2Decay
__all__ = ["ResNeSt50_fast_1s1x64d", "ResNeSt50"] __all__ = ["ResNeSt50_fast_1s1x64d", "ResNeSt50"]
...@@ -43,7 +44,7 @@ class ConvBNLayer(nn.Layer): ...@@ -43,7 +44,7 @@ class ConvBNLayer(nn.Layer):
bn_decay = 0.0 bn_decay = 0.0
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -121,7 +122,7 @@ class SplatConv(nn.Layer): ...@@ -121,7 +122,7 @@ class SplatConv(nn.Layer):
act="relu", act="relu",
name=name + "_splat1") name=name + "_splat1")
self.avg_pool2d = AdaptiveAvgPool2d(1) self.avg_pool2d = AdaptiveAvgPool2D(1)
inter_channels = int(max(in_channels * radix // reduction_factor, 32)) inter_channels = int(max(in_channels * radix // reduction_factor, 32))
...@@ -136,7 +137,7 @@ class SplatConv(nn.Layer): ...@@ -136,7 +137,7 @@ class SplatConv(nn.Layer):
name=name + "_splat2") name=name + "_splat2")
# to calc atten # to calc atten
self.conv3 = Conv2d( self.conv3 = Conv2D(
in_channels=inter_channels, in_channels=inter_channels,
out_channels=channels * radix, out_channels=channels * radix,
kernel_size=1, kernel_size=1,
...@@ -144,7 +145,7 @@ class SplatConv(nn.Layer): ...@@ -144,7 +145,7 @@ class SplatConv(nn.Layer):
padding=0, padding=0,
groups=groups, groups=groups,
weight_attr=ParamAttr( weight_attr=ParamAttr(
name=name + "_splat_weights", initializer=MSRA()), name=name + "_splat_weights", initializer=KaimingNormal()),
bias_attr=False) bias_attr=False)
self.rsoftmax = rSoftmax(radix=radix, cardinality=groups) self.rsoftmax = rSoftmax(radix=radix, cardinality=groups)
...@@ -154,7 +155,7 @@ class SplatConv(nn.Layer): ...@@ -154,7 +155,7 @@ class SplatConv(nn.Layer):
if self.radix > 1: if self.radix > 1:
splited = paddle.split(x, num_or_sections=self.radix, axis=1) splited = paddle.split(x, num_or_sections=self.radix, axis=1)
gap = paddle.sums(splited) gap = paddle.add_n(splited)
else: else:
gap = x gap = x
...@@ -167,10 +168,10 @@ class SplatConv(nn.Layer): ...@@ -167,10 +168,10 @@ class SplatConv(nn.Layer):
if self.radix > 1: if self.radix > 1:
attens = paddle.split(atten, num_or_sections=self.radix, axis=1) attens = paddle.split(atten, num_or_sections=self.radix, axis=1)
y = paddle.sums( y = paddle.add_n(
[att * split for (att, split) in zip(attens, splited)]) [split * att for (att, split) in zip(attens, splited)])
else: else:
y = atten * x y = x * atten
return y return y
...@@ -217,7 +218,7 @@ class BottleneckBlock(nn.Layer): ...@@ -217,7 +218,7 @@ class BottleneckBlock(nn.Layer):
name=name + "_conv1") name=name + "_conv1")
if avd and avd_first and (stride > 1 or is_first): if avd and avd_first and (stride > 1 or is_first):
self.avg_pool2d_1 = AvgPool2d( self.avg_pool2d_1 = AvgPool2D(
kernel_size=3, stride=stride, padding=1) kernel_size=3, stride=stride, padding=1)
if radix >= 1: if radix >= 1:
...@@ -245,7 +246,7 @@ class BottleneckBlock(nn.Layer): ...@@ -245,7 +246,7 @@ class BottleneckBlock(nn.Layer):
name=name + "_conv2") name=name + "_conv2")
if avd and avd_first == False and (stride > 1 or is_first): if avd and avd_first == False and (stride > 1 or is_first):
self.avg_pool2d_2 = AvgPool2d( self.avg_pool2d_2 = AvgPool2D(
kernel_size=3, stride=stride, padding=1) kernel_size=3, stride=stride, padding=1)
self.conv3 = ConvBNLayer( self.conv3 = ConvBNLayer(
...@@ -260,13 +261,13 @@ class BottleneckBlock(nn.Layer): ...@@ -260,13 +261,13 @@ class BottleneckBlock(nn.Layer):
if stride != 1 or self.inplanes != self.planes * 4: if stride != 1 or self.inplanes != self.planes * 4:
if avg_down: if avg_down:
if dilation == 1: if dilation == 1:
self.avg_pool2d_3 = AvgPool2d( self.avg_pool2d_3 = AvgPool2D(
kernel_size=stride, stride=stride, padding=0) kernel_size=stride, stride=stride, padding=0)
else: else:
self.avg_pool2d_3 = AvgPool2d( self.avg_pool2d_3 = AvgPool2D(
kernel_size=1, stride=1, padding=0, ceil_mode=True) kernel_size=1, stride=1, padding=0, ceil_mode=True)
self.conv4 = Conv2d( self.conv4 = Conv2D(
in_channels=self.inplanes, in_channels=self.inplanes,
out_channels=planes * 4, out_channels=planes * 4,
kernel_size=1, kernel_size=1,
...@@ -274,10 +275,10 @@ class BottleneckBlock(nn.Layer): ...@@ -274,10 +275,10 @@ class BottleneckBlock(nn.Layer):
padding=0, padding=0,
groups=1, groups=1,
weight_attr=ParamAttr( weight_attr=ParamAttr(
name=name + "_weights", initializer=MSRA()), name=name + "_weights", initializer=KaimingNormal()),
bias_attr=False) bias_attr=False)
else: else:
self.conv4 = Conv2d( self.conv4 = Conv2D(
in_channels=self.inplanes, in_channels=self.inplanes,
out_channels=planes * 4, out_channels=planes * 4,
kernel_size=1, kernel_size=1,
...@@ -285,7 +286,8 @@ class BottleneckBlock(nn.Layer): ...@@ -285,7 +286,8 @@ class BottleneckBlock(nn.Layer):
padding=0, padding=0,
groups=1, groups=1,
weight_attr=ParamAttr( weight_attr=ParamAttr(
name=name + "_shortcut_weights", initializer=MSRA()), name=name + "_shortcut_weights",
initializer=KaimingNormal()),
bias_attr=False) bias_attr=False)
bn_decay = 0.0 bn_decay = 0.0
...@@ -294,10 +296,9 @@ class BottleneckBlock(nn.Layer): ...@@ -294,10 +296,9 @@ class BottleneckBlock(nn.Layer):
act=None, act=None,
param_attr=ParamAttr( param_attr=ParamAttr(
name=name + "_shortcut_scale", name=name + "_shortcut_scale",
regularizer=L2Decay(regularization_coeff=bn_decay)), regularizer=L2Decay(bn_decay)),
bias_attr=ParamAttr( bias_attr=ParamAttr(
name + "_shortcut_offset", name + "_shortcut_offset", regularizer=L2Decay(bn_decay)),
regularizer=L2Decay(regularization_coeff=bn_decay)),
moving_mean_name=name + "_shortcut_mean", moving_mean_name=name + "_shortcut_mean",
moving_variance_name=name + "_shortcut_variance") moving_variance_name=name + "_shortcut_variance")
...@@ -324,7 +325,8 @@ class BottleneckBlock(nn.Layer): ...@@ -324,7 +325,8 @@ class BottleneckBlock(nn.Layer):
short = self._batch_norm(short) short = self._batch_norm(short)
y = paddle.elementwise_add(x=short, y=x, act="relu") y = paddle.add(x=short, y=x)
y = F.relu(y)
return y return y
...@@ -495,7 +497,7 @@ class ResNeSt(nn.Layer): ...@@ -495,7 +497,7 @@ class ResNeSt(nn.Layer):
act="relu", act="relu",
name="conv1") name="conv1")
self.max_pool2d = MaxPool2d(kernel_size=3, stride=2, padding=1) self.max_pool2d = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.layer1 = ResNeStLayer( self.layer1 = ResNeStLayer(
inplanes=self.stem_width * 2 inplanes=self.stem_width * 2
...@@ -624,7 +626,7 @@ class ResNeSt(nn.Layer): ...@@ -624,7 +626,7 @@ class ResNeSt(nn.Layer):
stride=2, stride=2,
name="layer4") name="layer4")
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.out_channels = 2048 self.out_channels = 2048
......
...@@ -20,8 +20,9 @@ import numpy as np ...@@ -20,8 +20,9 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout import paddle.nn.functional as F
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -40,7 +41,7 @@ class ConvBNLayer(nn.Layer): ...@@ -40,7 +41,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -118,7 +119,8 @@ class BottleneckBlock(nn.Layer): ...@@ -118,7 +119,8 @@ class BottleneckBlock(nn.Layer):
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act="relu") y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
...@@ -163,7 +165,8 @@ class BasicBlock(nn.Layer): ...@@ -163,7 +165,8 @@ class BasicBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv1, act="relu") y = paddle.add(x=short, y=conv1)
y = F.relu(y)
return y return y
...@@ -196,7 +199,7 @@ class ResNet(nn.Layer): ...@@ -196,7 +199,7 @@ class ResNet(nn.Layer):
stride=2, stride=2,
act="relu", act="relu",
name="conv1") name="conv1")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
if layers >= 50: if layers >= 50:
...@@ -238,7 +241,7 @@ class ResNet(nn.Layer): ...@@ -238,7 +241,7 @@ class ResNet(nn.Layer):
self.block_list.append(basic_block) self.block_list.append(basic_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import math
import paddle.fluid as fluid
from paddle.fluid.param_attr import ParamAttr
__all__ = [
"ResNet18_ACNet", "ResNet34_ACNet", "ResNet50_ACNet", "ResNet101_ACNet",
"ResNet152_ACNet"
]
class ResNetACNet(object):
""" ACNet """
def __init__(self, layers=50, deploy=False):
"""init"""
self.layers = layers
self.deploy = deploy
def net(self, input, class_dim=1000):
"""model"""
layers = self.layers
supported_layers = [18, 34, 50, 101, 152]
assert layers in supported_layers, \
"supported layers are {} but input layer is {}".format(
supported_layers, layers)
if layers == 18:
depth = [2, 2, 2, 2]
elif layers == 34 or layers == 50:
depth = [3, 4, 6, 3]
elif layers == 101:
depth = [3, 4, 23, 3]
elif layers == 152:
depth = [3, 8, 36, 3]
num_filters = [64, 128, 256, 512]
conv = self.conv_bn_layer(
input=input,
num_filters=64,
filter_size=7,
stride=2,
act='relu',
name="conv1")
conv = fluid.layers.pool2d(
input=conv,
pool_size=3,
pool_stride=2,
pool_padding=1,
pool_type='max')
if layers >= 50:
for block in range(len(depth)):
for i in range(depth[block]):
if layers in [101, 152] and block == 2:
if i == 0:
conv_name = "res" + str(block + 2) + "a"
else:
conv_name = "res" + str(block + 2) + "b" + str(i)
else:
conv_name = "res" + str(block + 2) + chr(97 + i)
conv = self.bottleneck_block(
input=conv,
num_filters=num_filters[block],
stride=2 if i == 0 and block != 0 else 1,
name=conv_name)
else:
for block in range(len(depth)):
for i in range(depth[block]):
conv_name = "res" + str(block + 2) + chr(97 + i)
conv = self.basic_block(
input=conv,
num_filters=num_filters[block],
stride=2 if i == 0 and block != 0 else 1,
is_first=block == i == 0,
name=conv_name)
pool = fluid.layers.pool2d(
input=conv, pool_size=7, pool_type='avg', global_pooling=True)
stdv = 1.0 / math.sqrt(pool.shape[1] * 1.0)
out = fluid.layers.fc(
input=pool,
size=class_dim,
param_attr=fluid.param_attr.ParamAttr(
initializer=fluid.initializer.Uniform(-stdv, stdv)))
return out
def conv_bn_layer(self, **kwargs):
"""
conv_bn_layer
"""
if kwargs['filter_size'] == 1:
return self.conv_bn_layer_ori(**kwargs)
else:
return self.conv_bn_layer_ac(**kwargs)
# conv bn+relu
def conv_bn_layer_ori(self,
input,
num_filters,
filter_size,
stride=1,
groups=1,
act=None,
name=None):
"""
standard convbn
used for 1x1 convbn in acnet
"""
conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=filter_size,
stride=stride,
padding=(filter_size - 1) // 2,
groups=groups,
act=None,
param_attr=ParamAttr(name=name + "_weights"),
bias_attr=False,
name=name + '.conv2d.output.1')
if name == "conv1":
bn_name = "bn_" + name
else:
bn_name = "bn" + name[3:]
return fluid.layers.batch_norm(
input=conv,
act=act,
name=bn_name + '.output.1',
param_attr=ParamAttr(name=bn_name + '_scale'),
bias_attr=ParamAttr(bn_name + '_offset'),
moving_mean_name=bn_name + '_mean',
moving_variance_name=bn_name + '_variance', )
# conv bn+relu
def conv_bn_layer_ac(self,
input,
num_filters,
filter_size,
stride=1,
groups=1,
act=None,
name=None):
""" ACNet conv bn """
padding = (filter_size - 1) // 2
square_conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=filter_size,
stride=stride,
padding=padding,
groups=groups,
act=act if self.deploy else None,
param_attr=ParamAttr(name=name + "_acsquare_weights"),
bias_attr=ParamAttr(name=name + "_acsquare_bias")
if self.deploy else False,
name=name + '.acsquare.conv2d.output.1')
if self.deploy:
return square_conv
else:
ver_conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=(filter_size, 1),
stride=stride,
padding=(padding, 0),
groups=groups,
act=None,
param_attr=ParamAttr(name=name + "_acver_weights"),
bias_attr=False,
name=name + '.acver.conv2d.output.1')
hor_conv = fluid.layers.conv2d(
input=input,
num_filters=num_filters,
filter_size=(1, filter_size),
stride=stride,
padding=(0, padding),
groups=groups,
act=None,
param_attr=ParamAttr(name=name + "_achor_weights"),
bias_attr=False,
name=name + '.achor.conv2d.output.1')
if name == "conv1":
bn_name = "bn_" + name
else:
bn_name = "bn" + name[3:]
square_bn = fluid.layers.batch_norm(
input=square_conv,
act=None,
name=bn_name + '.acsquare.output.1',
param_attr=ParamAttr(name=bn_name + '_acsquare_scale'),
bias_attr=ParamAttr(bn_name + '_acsquare_offset'),
moving_mean_name=bn_name + '_acsquare_mean',
moving_variance_name=bn_name + '_acsquare_variance', )
ver_bn = fluid.layers.batch_norm(
input=ver_conv,
act=None,
name=bn_name + '.acver.output.1',
param_attr=ParamAttr(name=bn_name + '_acver_scale'),
bias_attr=ParamAttr(bn_name + '_acver_offset'),
moving_mean_name=bn_name + '_acver_mean',
moving_variance_name=bn_name + '_acver_variance', )
hor_bn = fluid.layers.batch_norm(
input=hor_conv,
act=None,
name=bn_name + '.achor.output.1',
param_attr=ParamAttr(name=bn_name + '_achor_scale'),
bias_attr=ParamAttr(bn_name + '_achor_offset'),
moving_mean_name=bn_name + '_achor_mean',
moving_variance_name=bn_name + '_achor_variance', )
return fluid.layers.elementwise_add(
x=square_bn, y=ver_bn + hor_bn, act=act)
def shortcut(self, input, ch_out, stride, is_first, name):
""" shortcut """
ch_in = input.shape[1]
if ch_in != ch_out or stride != 1 or is_first is True:
return self.conv_bn_layer(
input=input,
num_filters=ch_out,
filter_size=1,
stride=stride,
name=name)
else:
return input
def bottleneck_block(self, input, num_filters, stride, name):
"""" bottleneck_block """
conv0 = self.conv_bn_layer(
input=input,
num_filters=num_filters,
filter_size=1,
act='relu',
name=name + "_branch2a")
conv1 = self.conv_bn_layer(
input=conv0,
num_filters=num_filters,
filter_size=3,
stride=stride,
act='relu',
name=name + "_branch2b")
conv2 = self.conv_bn_layer(
input=conv1,
num_filters=num_filters * 4,
filter_size=1,
act=None,
name=name + "_branch2c")
short = self.shortcut(
input,
num_filters * 4,
stride,
is_first=False,
name=name + "_branch1")
return fluid.layers.elementwise_add(
x=short, y=conv2, act='relu', name=name + ".add.output.5")
def basic_block(self, input, num_filters, stride, is_first, name):
""" basic_block """
conv0 = self.conv_bn_layer(
input=input,
num_filters=num_filters,
filter_size=3,
act='relu',
stride=stride,
name=name + "_branch2a")
conv1 = self.conv_bn_layer(
input=conv0,
num_filters=num_filters,
filter_size=3,
act=None,
name=name + "_branch2b")
short = self.shortcut(
input, num_filters, stride, is_first, name=name + "_branch1")
return fluid.layers.elementwise_add(x=short, y=conv1, act='relu')
def ResNet18_ACNet(deploy=False):
"""ResNet18 + ACNet"""
model = ResNetACNet(layers=18, deploy=deploy)
return model
def ResNet34_ACNet(deploy=False):
"""ResNet34 + ACNet"""
model = ResNetACNet(layers=34, deploy=deploy)
return model
def ResNet50_ACNet(deploy=False):
"""ResNet50 + ACNet"""
model = ResNetACNet(layers=50, deploy=deploy)
return model
def ResNet101_ACNet(deploy=False):
"""ResNet101 + ACNet"""
model = ResNetACNet(layers=101, deploy=deploy)
return model
def ResNet152_ACNet(deploy=False):
"""ResNet152 + ACNet"""
model = ResNetACNet(layers=152, deploy=deploy)
return model
...@@ -20,8 +20,9 @@ import numpy as np ...@@ -20,8 +20,9 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout import paddle.nn.functional as F
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -42,7 +43,7 @@ class ConvBNLayer(nn.Layer): ...@@ -42,7 +43,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -120,7 +121,8 @@ class BottleneckBlock(nn.Layer): ...@@ -120,7 +121,8 @@ class BottleneckBlock(nn.Layer):
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act='relu') y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
...@@ -165,7 +167,8 @@ class BasicBlock(nn.Layer): ...@@ -165,7 +167,8 @@ class BasicBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv1, act='relu') y = paddle.add(x=short, y=conv1)
y = F.relu(y)
return y return y
...@@ -213,7 +216,7 @@ class ResNet_vc(nn.Layer): ...@@ -213,7 +216,7 @@ class ResNet_vc(nn.Layer):
act='relu', act='relu',
name="conv1_3") name="conv1_3")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
if layers >= 50: if layers >= 50:
...@@ -255,7 +258,7 @@ class ResNet_vc(nn.Layer): ...@@ -255,7 +258,7 @@ class ResNet_vc(nn.Layer):
self.block_list.append(basic_block) self.block_list.append(basic_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
...@@ -20,8 +20,9 @@ import numpy as np ...@@ -20,8 +20,9 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout import paddle.nn.functional as F
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -44,9 +45,9 @@ class ConvBNLayer(nn.Layer): ...@@ -44,9 +45,9 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self.is_vd_mode = is_vd_mode self.is_vd_mode = is_vd_mode
self._pool2d_avg = AvgPool2d( self._pool2d_avg = AvgPool2D(
kernel_size=2, stride=2, padding=0, ceil_mode=True) kernel_size=2, stride=2, padding=0, ceil_mode=True)
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -130,7 +131,8 @@ class BottleneckBlock(nn.Layer): ...@@ -130,7 +131,8 @@ class BottleneckBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act='relu') y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
...@@ -178,7 +180,8 @@ class BasicBlock(nn.Layer): ...@@ -178,7 +180,8 @@ class BasicBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv1, act='relu') y = paddle.add(x=short, y=conv1)
y = F.relu(y)
return y return y
...@@ -243,7 +246,7 @@ class ResNet_vd(nn.Layer): ...@@ -243,7 +246,7 @@ class ResNet_vd(nn.Layer):
act='relu', act='relu',
lr_mult=self.lr_mult_list[0], lr_mult=self.lr_mult_list[0],
name="conv1_3") name="conv1_3")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
if layers >= 50: if layers >= 50:
...@@ -285,11 +288,11 @@ class ResNet_vd(nn.Layer): ...@@ -285,11 +288,11 @@ class ResNet_vd(nn.Layer):
shortcut=shortcut, shortcut=shortcut,
if_first=block == i == 0, if_first=block == i == 0,
name=conv_name, name=conv_name,
lr_mult=lr_mult)) lr_mult=self.lr_mult_list[block + 1]))
self.block_list.append(basic_block) self.block_list.append(basic_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
...@@ -20,8 +20,9 @@ import numpy as np ...@@ -20,8 +20,9 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout import paddle.nn.functional as F
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -43,7 +44,7 @@ class ConvBNLayer(nn.Layer): ...@@ -43,7 +44,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -122,7 +123,8 @@ class BottleneckBlock(nn.Layer): ...@@ -122,7 +123,8 @@ class BottleneckBlock(nn.Layer):
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act='relu') y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
...@@ -157,7 +159,7 @@ class ResNeXt(nn.Layer): ...@@ -157,7 +159,7 @@ class ResNeXt(nn.Layer):
stride=2, stride=2,
act='relu', act='relu',
name="res_conv1") name="res_conv1")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
for block in range(len(depth)): for block in range(len(depth)):
...@@ -183,7 +185,7 @@ class ResNeXt(nn.Layer): ...@@ -183,7 +185,7 @@ class ResNeXt(nn.Layer):
self.block_list.append(bottleneck_block) self.block_list.append(bottleneck_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
__all__ = [ __all__ = [
...@@ -26,7 +26,7 @@ class ConvBNLayer(nn.Layer): ...@@ -26,7 +26,7 @@ class ConvBNLayer(nn.Layer):
conv_name = name + ".0" conv_name = name + ".0"
else: else:
conv_name = name conv_name = name
self._conv = Conv2d( self._conv = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -114,7 +114,9 @@ class BottleneckBlock(nn.Layer): ...@@ -114,7 +114,9 @@ class BottleneckBlock(nn.Layer):
x = self._conv1(x) x = self._conv1(x)
x = self._conv2(x) x = self._conv2(x)
y = self._short(inputs) y = self._short(inputs)
return paddle.elementwise_add(x, y, act="relu") y = paddle.add(x, y)
y = F.relu(y)
return y
class ResNeXt101WSL(nn.Layer): class ResNeXt101WSL(nn.Layer):
...@@ -134,7 +136,7 @@ class ResNeXt101WSL(nn.Layer): ...@@ -134,7 +136,7 @@ class ResNeXt101WSL(nn.Layer):
for i in [1, 2, 4, 8]] # [256, 512, 1024, 2048] for i in [1, 2, 4, 8]] # [256, 512, 1024, 2048]
self._conv_stem = ConvBNLayer( self._conv_stem = ConvBNLayer(
3, 64, 7, stride=2, act="relu", name="conv1") 3, 64, 7, stride=2, act="relu", name="conv1")
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=1) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=1)
self._conv1_0 = BottleneckBlock( self._conv1_0 = BottleneckBlock(
64, 64,
...@@ -371,7 +373,7 @@ class ResNeXt101WSL(nn.Layer): ...@@ -371,7 +373,7 @@ class ResNeXt101WSL(nn.Layer):
width=self.width, width=self.width,
name="layer4.2") name="layer4.2")
self._avg_pool = AdaptiveAvgPool2d(1) self._avg_pool = AdaptiveAvgPool2D(1)
self._out = Linear( self._out = Linear(
num_filters[3] // (width // 8), num_filters[3] // (width // 8),
class_dim, class_dim,
......
...@@ -20,8 +20,9 @@ import numpy as np ...@@ -20,8 +20,9 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout import paddle.nn.functional as F
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -46,9 +47,9 @@ class ConvBNLayer(nn.Layer): ...@@ -46,9 +47,9 @@ class ConvBNLayer(nn.Layer):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self.is_vd_mode = is_vd_mode self.is_vd_mode = is_vd_mode
self._pool2d_avg = AvgPool2d( self._pool2d_avg = AvgPool2D(
kernel_size=2, stride=2, padding=0, ceil_mode=True) kernel_size=2, stride=2, padding=0, ceil_mode=True)
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -131,7 +132,8 @@ class BottleneckBlock(nn.Layer): ...@@ -131,7 +132,8 @@ class BottleneckBlock(nn.Layer):
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=conv2, act='relu') y = paddle.add(x=short, y=conv2)
y = F.relu(y)
return y return y
...@@ -181,7 +183,7 @@ class ResNeXt(nn.Layer): ...@@ -181,7 +183,7 @@ class ResNeXt(nn.Layer):
act='relu', act='relu',
name="conv1_3") name="conv1_3")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
for block in range(len(depth)): for block in range(len(depth)):
...@@ -208,7 +210,7 @@ class ResNeXt(nn.Layer): ...@@ -208,7 +210,7 @@ class ResNeXt(nn.Layer):
self.block_list.append(bottleneck_block) self.block_list.append(bottleneck_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
...@@ -20,8 +20,8 @@ import paddle ...@@ -20,8 +20,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -46,10 +46,10 @@ class ConvBNLayer(nn.Layer): ...@@ -46,10 +46,10 @@ class ConvBNLayer(nn.Layer):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self.is_vd_mode = is_vd_mode self.is_vd_mode = is_vd_mode
self._pool2d_avg = AvgPool2d( self._pool2d_avg = AvgPool2D(
kernel_size=2, stride=2, padding=0, ceil_mode=True) kernel_size=2, stride=2, padding=0, ceil_mode=True)
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -135,7 +135,8 @@ class BottleneckBlock(nn.Layer): ...@@ -135,7 +135,8 @@ class BottleneckBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=scale, act='relu') y = paddle.add(x=short, y=scale)
y = F.relu(y)
return y return y
...@@ -190,7 +191,8 @@ class BasicBlock(nn.Layer): ...@@ -190,7 +191,8 @@ class BasicBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=scale, act='relu') y = paddle.add(x=short, y=scale)
y = F.relu(y)
return y return y
...@@ -198,7 +200,7 @@ class SELayer(nn.Layer): ...@@ -198,7 +200,7 @@ class SELayer(nn.Layer):
def __init__(self, num_channels, num_filters, reduction_ratio, name=None): def __init__(self, num_channels, num_filters, reduction_ratio, name=None):
super(SELayer, self).__init__() super(SELayer, self).__init__()
self.pool2d_gap = AdaptiveAvgPool2d(1) self.pool2d_gap = AdaptiveAvgPool2D(1)
self._num_channels = num_channels self._num_channels = num_channels
...@@ -277,7 +279,7 @@ class SE_ResNet_vd(nn.Layer): ...@@ -277,7 +279,7 @@ class SE_ResNet_vd(nn.Layer):
stride=1, stride=1,
act='relu', act='relu',
name="conv1_3") name="conv1_3")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
if layers >= 50: if layers >= 50:
...@@ -321,7 +323,7 @@ class SE_ResNet_vd(nn.Layer): ...@@ -321,7 +323,7 @@ class SE_ResNet_vd(nn.Layer):
self.block_list.append(basic_block) self.block_list.append(basic_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
......
...@@ -20,8 +20,8 @@ import numpy as np ...@@ -20,8 +20,8 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -30,18 +30,17 @@ __all__ = ["SE_ResNeXt50_32x4d", "SE_ResNeXt101_32x4d", "SE_ResNeXt152_64x4d"] ...@@ -30,18 +30,17 @@ __all__ = ["SE_ResNeXt50_32x4d", "SE_ResNeXt101_32x4d", "SE_ResNeXt152_64x4d"]
class ConvBNLayer(nn.Layer): class ConvBNLayer(nn.Layer):
def __init__( def __init__(self,
self, num_channels,
num_channels, num_filters,
num_filters, filter_size,
filter_size, stride=1,
stride=1, groups=1,
groups=1, act=None,
act=None, name=None):
name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -124,7 +123,8 @@ class BottleneckBlock(nn.Layer): ...@@ -124,7 +123,8 @@ class BottleneckBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=scale, act='relu') y = paddle.add(x=short, y=scale)
y = F.relu(y)
return y return y
...@@ -132,7 +132,7 @@ class SELayer(nn.Layer): ...@@ -132,7 +132,7 @@ class SELayer(nn.Layer):
def __init__(self, num_channels, num_filters, reduction_ratio, name=None): def __init__(self, num_channels, num_filters, reduction_ratio, name=None):
super(SELayer, self).__init__() super(SELayer, self).__init__()
self.pool2d_gap = AdaptiveAvgPool2d(1) self.pool2d_gap = AdaptiveAvgPool2D(1)
self._num_channels = num_channels self._num_channels = num_channels
...@@ -142,8 +142,7 @@ class SELayer(nn.Layer): ...@@ -142,8 +142,7 @@ class SELayer(nn.Layer):
num_channels, num_channels,
med_ch, med_ch,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=Uniform(-stdv, stdv), initializer=Uniform(-stdv, stdv), name=name + "_sqz_weights"),
name=name + "_sqz_weights"),
bias_attr=ParamAttr(name=name + '_sqz_offset')) bias_attr=ParamAttr(name=name + '_sqz_offset'))
self.relu = nn.ReLU() self.relu = nn.ReLU()
stdv = 1.0 / math.sqrt(med_ch * 1.0) stdv = 1.0 / math.sqrt(med_ch * 1.0)
...@@ -151,11 +150,10 @@ class SELayer(nn.Layer): ...@@ -151,11 +150,10 @@ class SELayer(nn.Layer):
med_ch, med_ch,
num_filters, num_filters,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=Uniform(-stdv, stdv), initializer=Uniform(-stdv, stdv), name=name + "_exc_weights"),
name=name + "_exc_weights"),
bias_attr=ParamAttr(name=name + '_exc_offset')) bias_attr=ParamAttr(name=name + '_exc_offset'))
self.sigmoid = nn.Sigmoid() self.sigmoid = nn.Sigmoid()
def forward(self, input): def forward(self, input):
pool = self.pool2d_gap(input) pool = self.pool2d_gap(input)
pool = paddle.reshape(pool, shape=[-1, self._num_channels]) pool = paddle.reshape(pool, shape=[-1, self._num_channels])
...@@ -224,7 +222,7 @@ class ResNeXt(nn.Layer): ...@@ -224,7 +222,7 @@ class ResNeXt(nn.Layer):
act='relu', act='relu',
name="conv3") name="conv3")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
n = 1 if layers == 50 or layers == 101 else 3 n = 1 if layers == 50 or layers == 101 else 3
...@@ -247,7 +245,7 @@ class ResNeXt(nn.Layer): ...@@ -247,7 +245,7 @@ class ResNeXt(nn.Layer):
self.block_list.append(bottleneck_block) self.block_list.append(bottleneck_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
...@@ -257,8 +255,7 @@ class ResNeXt(nn.Layer): ...@@ -257,8 +255,7 @@ class ResNeXt(nn.Layer):
self.pool2d_avg_channels, self.pool2d_avg_channels,
class_dim, class_dim,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=Uniform(-stdv, stdv), initializer=Uniform(-stdv, stdv), name="fc6_weights"),
name="fc6_weights"),
bias_attr=ParamAttr(name="fc6_offset")) bias_attr=ParamAttr(name="fc6_offset"))
def forward(self, inputs): def forward(self, inputs):
...@@ -269,7 +266,7 @@ class ResNeXt(nn.Layer): ...@@ -269,7 +266,7 @@ class ResNeXt(nn.Layer):
y = self.conv1_2(y) y = self.conv1_2(y)
y = self.conv1_3(y) y = self.conv1_3(y)
y = self.pool2d_max(y) y = self.pool2d_max(y)
for block in self.block_list: for block in self.block_list:
y = block(y) y = block(y)
y = self.pool2d_avg(y) y = self.pool2d_avg(y)
......
...@@ -20,8 +20,9 @@ import numpy as np ...@@ -20,8 +20,9 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout import paddle.nn.functional as F
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -30,22 +31,21 @@ __all__ = ["SE_ResNeXt50_vd_32x4d", "SE_ResNeXt50_vd_32x4d", "SENet154_vd"] ...@@ -30,22 +31,21 @@ __all__ = ["SE_ResNeXt50_vd_32x4d", "SE_ResNeXt50_vd_32x4d", "SENet154_vd"]
class ConvBNLayer(nn.Layer): class ConvBNLayer(nn.Layer):
def __init__( def __init__(self,
self, num_channels,
num_channels, num_filters,
num_filters, filter_size,
filter_size, stride=1,
stride=1, groups=1,
groups=1, is_vd_mode=False,
is_vd_mode=False, act=None,
act=None, name=None):
name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self.is_vd_mode = is_vd_mode self.is_vd_mode = is_vd_mode
self._pool2d_avg = AvgPool2d( self._pool2d_avg = AvgPool2D(
kernel_size=2, stride=2, padding=0, ceil_mode=True) kernel_size=2, stride=2, padding=0, ceil_mode=True)
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -131,7 +131,8 @@ class BottleneckBlock(nn.Layer): ...@@ -131,7 +131,8 @@ class BottleneckBlock(nn.Layer):
short = inputs short = inputs
else: else:
short = self.short(inputs) short = self.short(inputs)
y = paddle.elementwise_add(x=short, y=scale, act='relu') y = paddle.add(x=short, y=scale)
y = F.relu(y)
return y return y
...@@ -139,7 +140,7 @@ class SELayer(nn.Layer): ...@@ -139,7 +140,7 @@ class SELayer(nn.Layer):
def __init__(self, num_channels, num_filters, reduction_ratio, name=None): def __init__(self, num_channels, num_filters, reduction_ratio, name=None):
super(SELayer, self).__init__() super(SELayer, self).__init__()
self.pool2d_gap = AdaptiveAvgPool2d(1) self.pool2d_gap = AdaptiveAvgPool2D(1)
self._num_channels = num_channels self._num_channels = num_channels
...@@ -149,8 +150,7 @@ class SELayer(nn.Layer): ...@@ -149,8 +150,7 @@ class SELayer(nn.Layer):
num_channels, num_channels,
med_ch, med_ch,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=Uniform(-stdv, stdv), initializer=Uniform(-stdv, stdv), name=name + "_sqz_weights"),
name=name + "_sqz_weights"),
bias_attr=ParamAttr(name=name + '_sqz_offset')) bias_attr=ParamAttr(name=name + '_sqz_offset'))
self.relu = nn.ReLU() self.relu = nn.ReLU()
stdv = 1.0 / math.sqrt(med_ch * 1.0) stdv = 1.0 / math.sqrt(med_ch * 1.0)
...@@ -158,11 +158,10 @@ class SELayer(nn.Layer): ...@@ -158,11 +158,10 @@ class SELayer(nn.Layer):
med_ch, med_ch,
num_filters, num_filters,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=Uniform(-stdv, stdv), initializer=Uniform(-stdv, stdv), name=name + "_exc_weights"),
name=name + "_exc_weights"),
bias_attr=ParamAttr(name=name + '_exc_offset')) bias_attr=ParamAttr(name=name + '_exc_offset'))
self.sigmoid = nn.Sigmoid() self.sigmoid = nn.Sigmoid()
def forward(self, input): def forward(self, input):
pool = self.pool2d_gap(input) pool = self.pool2d_gap(input)
pool = paddle.reshape(pool, shape=[-1, self._num_channels]) pool = paddle.reshape(pool, shape=[-1, self._num_channels])
...@@ -223,7 +222,7 @@ class ResNeXt(nn.Layer): ...@@ -223,7 +222,7 @@ class ResNeXt(nn.Layer):
act='relu', act='relu',
name="conv1_3") name="conv1_3")
self.pool2d_max = MaxPool2d(kernel_size=3, stride=2, padding=1) self.pool2d_max = MaxPool2D(kernel_size=3, stride=2, padding=1)
self.block_list = [] self.block_list = []
n = 1 if layers == 50 or layers == 101 else 3 n = 1 if layers == 50 or layers == 101 else 3
...@@ -246,7 +245,7 @@ class ResNeXt(nn.Layer): ...@@ -246,7 +245,7 @@ class ResNeXt(nn.Layer):
self.block_list.append(bottleneck_block) self.block_list.append(bottleneck_block)
shortcut = True shortcut = True
self.pool2d_avg = AdaptiveAvgPool2d(1) self.pool2d_avg = AdaptiveAvgPool2D(1)
self.pool2d_avg_channels = num_channels[-1] * 2 self.pool2d_avg_channels = num_channels[-1] * 2
...@@ -256,8 +255,7 @@ class ResNeXt(nn.Layer): ...@@ -256,8 +255,7 @@ class ResNeXt(nn.Layer):
self.pool2d_avg_channels, self.pool2d_avg_channels,
class_dim, class_dim,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=Uniform(-stdv, stdv), initializer=Uniform(-stdv, stdv), name="fc6_weights"),
name="fc6_weights"),
bias_attr=ParamAttr(name="fc6_offset")) bias_attr=ParamAttr(name="fc6_offset"))
def forward(self, inputs): def forward(self, inputs):
......
...@@ -17,8 +17,8 @@ from __future__ import division ...@@ -17,8 +17,8 @@ from __future__ import division
from __future__ import print_function from __future__ import print_function
from paddle import ParamAttr, reshape, transpose, concat, split from paddle import ParamAttr, reshape, transpose, concat, split
from paddle.nn import Layer, Conv2d, MaxPool2d, AdaptiveAvgPool2d, BatchNorm, Linear from paddle.nn import Layer, Conv2D, MaxPool2D, AdaptiveAvgPool2D, BatchNorm, Linear
from paddle.nn.initializer import MSRA from paddle.nn.initializer import KaimingNormal
from paddle.nn.functional import swish from paddle.nn.functional import swish
__all__ = [ __all__ = [
...@@ -56,7 +56,7 @@ class ConvBNLayer(Layer): ...@@ -56,7 +56,7 @@ class ConvBNLayer(Layer):
act=None, act=None,
name=None, ): name=None, ):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=in_channels, in_channels=in_channels,
out_channels=out_channels, out_channels=out_channels,
kernel_size=kernel_size, kernel_size=kernel_size,
...@@ -64,7 +64,7 @@ class ConvBNLayer(Layer): ...@@ -64,7 +64,7 @@ class ConvBNLayer(Layer):
padding=padding, padding=padding,
groups=groups, groups=groups,
weight_attr=ParamAttr( weight_attr=ParamAttr(
initializer=MSRA(), name=name + "_weights"), initializer=KaimingNormal(), name=name + "_weights"),
bias_attr=False) bias_attr=False)
self._batch_norm = BatchNorm( self._batch_norm = BatchNorm(
...@@ -228,7 +228,7 @@ class ShuffleNet(Layer): ...@@ -228,7 +228,7 @@ class ShuffleNet(Layer):
padding=1, padding=1,
act=act, act=act,
name='stage1_conv') name='stage1_conv')
self._max_pool = MaxPool2d(kernel_size=3, stride=2, padding=1) self._max_pool = MaxPool2D(kernel_size=3, stride=2, padding=1)
# 2. bottleneck sequences # 2. bottleneck sequences
self._block_list = [] self._block_list = []
...@@ -263,7 +263,7 @@ class ShuffleNet(Layer): ...@@ -263,7 +263,7 @@ class ShuffleNet(Layer):
act=act, act=act,
name='conv5') name='conv5')
# 4. pool # 4. pool
self._pool2d_avg = AdaptiveAvgPool2d(1) self._pool2d_avg = AdaptiveAvgPool2D(1)
self._out_c = stage_out_channels[-1] self._out_c = stage_out_channels[-1]
# 5. fc # 5. fc
self._fc = Linear( self._fc = Linear(
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
__all__ = ["SqueezeNet1_0", "SqueezeNet1_1"] __all__ = ["SqueezeNet1_0", "SqueezeNet1_1"]
...@@ -16,7 +16,7 @@ class MakeFireConv(nn.Layer): ...@@ -16,7 +16,7 @@ class MakeFireConv(nn.Layer):
padding=0, padding=0,
name=None): name=None):
super(MakeFireConv, self).__init__() super(MakeFireConv, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
input_channels, input_channels,
output_channels, output_channels,
filter_size, filter_size,
...@@ -62,14 +62,14 @@ class SqueezeNet(nn.Layer): ...@@ -62,14 +62,14 @@ class SqueezeNet(nn.Layer):
self.version = version self.version = version
if self.version == "1.0": if self.version == "1.0":
self._conv = Conv2d( self._conv = Conv2D(
3, 3,
96, 96,
7, 7,
stride=2, stride=2,
weight_attr=ParamAttr(name="conv1_weights"), weight_attr=ParamAttr(name="conv1_weights"),
bias_attr=ParamAttr(name="conv1_offset")) bias_attr=ParamAttr(name="conv1_offset"))
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=0) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=0)
self._conv1 = MakeFire(96, 16, 64, 64, name="fire2") self._conv1 = MakeFire(96, 16, 64, 64, name="fire2")
self._conv2 = MakeFire(128, 16, 64, 64, name="fire3") self._conv2 = MakeFire(128, 16, 64, 64, name="fire3")
self._conv3 = MakeFire(128, 32, 128, 128, name="fire4") self._conv3 = MakeFire(128, 32, 128, 128, name="fire4")
...@@ -81,7 +81,7 @@ class SqueezeNet(nn.Layer): ...@@ -81,7 +81,7 @@ class SqueezeNet(nn.Layer):
self._conv8 = MakeFire(512, 64, 256, 256, name="fire9") self._conv8 = MakeFire(512, 64, 256, 256, name="fire9")
else: else:
self._conv = Conv2d( self._conv = Conv2D(
3, 3,
64, 64,
3, 3,
...@@ -89,7 +89,7 @@ class SqueezeNet(nn.Layer): ...@@ -89,7 +89,7 @@ class SqueezeNet(nn.Layer):
padding=1, padding=1,
weight_attr=ParamAttr(name="conv1_weights"), weight_attr=ParamAttr(name="conv1_weights"),
bias_attr=ParamAttr(name="conv1_offset")) bias_attr=ParamAttr(name="conv1_offset"))
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=0) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=0)
self._conv1 = MakeFire(64, 16, 64, 64, name="fire2") self._conv1 = MakeFire(64, 16, 64, 64, name="fire2")
self._conv2 = MakeFire(128, 16, 64, 64, name="fire3") self._conv2 = MakeFire(128, 16, 64, 64, name="fire3")
...@@ -102,13 +102,13 @@ class SqueezeNet(nn.Layer): ...@@ -102,13 +102,13 @@ class SqueezeNet(nn.Layer):
self._conv8 = MakeFire(512, 64, 256, 256, name="fire9") self._conv8 = MakeFire(512, 64, 256, 256, name="fire9")
self._drop = Dropout(p=0.5, mode="downscale_in_infer") self._drop = Dropout(p=0.5, mode="downscale_in_infer")
self._conv9 = Conv2d( self._conv9 = Conv2D(
512, 512,
class_dim, class_dim,
1, 1,
weight_attr=ParamAttr(name="conv10_weights"), weight_attr=ParamAttr(name="conv10_weights"),
bias_attr=ParamAttr(name="conv10_offset")) bias_attr=ParamAttr(name="conv10_offset"))
self._avg_pool = AdaptiveAvgPool2d(1) self._avg_pool = AdaptiveAvgPool2D(1)
def forward(self, inputs): def forward(self, inputs):
x = self._conv(inputs) x = self._conv(inputs)
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
__all__ = ["VGG11", "VGG13", "VGG16", "VGG19"] __all__ = ["VGG11", "VGG13", "VGG16", "VGG19"]
...@@ -13,7 +13,7 @@ class ConvBlock(nn.Layer): ...@@ -13,7 +13,7 @@ class ConvBlock(nn.Layer):
super(ConvBlock, self).__init__() super(ConvBlock, self).__init__()
self.groups = groups self.groups = groups
self._conv_1 = Conv2d( self._conv_1 = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=3, kernel_size=3,
...@@ -22,7 +22,7 @@ class ConvBlock(nn.Layer): ...@@ -22,7 +22,7 @@ class ConvBlock(nn.Layer):
weight_attr=ParamAttr(name=name + "1_weights"), weight_attr=ParamAttr(name=name + "1_weights"),
bias_attr=False) bias_attr=False)
if groups == 2 or groups == 3 or groups == 4: if groups == 2 or groups == 3 or groups == 4:
self._conv_2 = Conv2d( self._conv_2 = Conv2D(
in_channels=output_channels, in_channels=output_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=3, kernel_size=3,
...@@ -31,7 +31,7 @@ class ConvBlock(nn.Layer): ...@@ -31,7 +31,7 @@ class ConvBlock(nn.Layer):
weight_attr=ParamAttr(name=name + "2_weights"), weight_attr=ParamAttr(name=name + "2_weights"),
bias_attr=False) bias_attr=False)
if groups == 3 or groups == 4: if groups == 3 or groups == 4:
self._conv_3 = Conv2d( self._conv_3 = Conv2D(
in_channels=output_channels, in_channels=output_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=3, kernel_size=3,
...@@ -40,7 +40,7 @@ class ConvBlock(nn.Layer): ...@@ -40,7 +40,7 @@ class ConvBlock(nn.Layer):
weight_attr=ParamAttr(name=name + "3_weights"), weight_attr=ParamAttr(name=name + "3_weights"),
bias_attr=False) bias_attr=False)
if groups == 4: if groups == 4:
self._conv_4 = Conv2d( self._conv_4 = Conv2D(
in_channels=output_channels, in_channels=output_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=3, kernel_size=3,
...@@ -49,7 +49,7 @@ class ConvBlock(nn.Layer): ...@@ -49,7 +49,7 @@ class ConvBlock(nn.Layer):
weight_attr=ParamAttr(name=name + "4_weights"), weight_attr=ParamAttr(name=name + "4_weights"),
bias_attr=False) bias_attr=False)
self._pool = MaxPool2d(kernel_size=2, stride=2, padding=0) self._pool = MaxPool2D(kernel_size=2, stride=2, padding=0)
def forward(self, inputs): def forward(self, inputs):
x = self._conv_1(inputs) x = self._conv_1(inputs)
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
import math import math
...@@ -21,7 +21,7 @@ class ConvBNLayer(nn.Layer): ...@@ -21,7 +21,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=num_channels, in_channels=num_channels,
out_channels=num_filters, out_channels=num_filters,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -75,7 +75,7 @@ class EntryFlowBottleneckBlock(nn.Layer): ...@@ -75,7 +75,7 @@ class EntryFlowBottleneckBlock(nn.Layer):
super(EntryFlowBottleneckBlock, self).__init__() super(EntryFlowBottleneckBlock, self).__init__()
self.relu_first = relu_first self.relu_first = relu_first
self._short = Conv2d( self._short = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=1, kernel_size=1,
...@@ -93,7 +93,7 @@ class EntryFlowBottleneckBlock(nn.Layer): ...@@ -93,7 +93,7 @@ class EntryFlowBottleneckBlock(nn.Layer):
output_channels, output_channels,
stride=1, stride=1,
name=name + "_branch2b_weights") name=name + "_branch2b_weights")
self._pool = MaxPool2d(kernel_size=3, stride=stride, padding=1) self._pool = MaxPool2D(kernel_size=3, stride=stride, padding=1)
def forward(self, inputs): def forward(self, inputs):
conv0 = inputs conv0 = inputs
...@@ -104,7 +104,7 @@ class EntryFlowBottleneckBlock(nn.Layer): ...@@ -104,7 +104,7 @@ class EntryFlowBottleneckBlock(nn.Layer):
conv2 = F.relu(conv1) conv2 = F.relu(conv1)
conv2 = self._conv2(conv2) conv2 = self._conv2(conv2)
pool = self._pool(conv2) pool = self._pool(conv2)
return paddle.elementwise_add(x=short, y=pool) return paddle.add(x=short, y=pool)
class EntryFlow(nn.Layer): class EntryFlow(nn.Layer):
...@@ -181,7 +181,7 @@ class MiddleFlowBottleneckBlock(nn.Layer): ...@@ -181,7 +181,7 @@ class MiddleFlowBottleneckBlock(nn.Layer):
conv1 = self._conv_1(conv1) conv1 = self._conv_1(conv1)
conv2 = F.relu(conv1) conv2 = F.relu(conv1)
conv2 = self._conv_2(conv2) conv2 = self._conv_2(conv2)
return paddle.elementwise_add(x=inputs, y=conv2) return paddle.add(x=inputs, y=conv2)
class MiddleFlow(nn.Layer): class MiddleFlow(nn.Layer):
...@@ -249,7 +249,7 @@ class ExitFlowBottleneckBlock(nn.Layer): ...@@ -249,7 +249,7 @@ class ExitFlowBottleneckBlock(nn.Layer):
name): name):
super(ExitFlowBottleneckBlock, self).__init__() super(ExitFlowBottleneckBlock, self).__init__()
self._short = Conv2d( self._short = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=output_channels2, out_channels=output_channels2,
kernel_size=1, kernel_size=1,
...@@ -267,7 +267,7 @@ class ExitFlowBottleneckBlock(nn.Layer): ...@@ -267,7 +267,7 @@ class ExitFlowBottleneckBlock(nn.Layer):
output_channels2, output_channels2,
stride=1, stride=1,
name=name + "_branch2b_weights") name=name + "_branch2b_weights")
self._pool = MaxPool2d(kernel_size=3, stride=2, padding=1) self._pool = MaxPool2D(kernel_size=3, stride=2, padding=1)
def forward(self, inputs): def forward(self, inputs):
short = self._short(inputs) short = self._short(inputs)
...@@ -276,7 +276,7 @@ class ExitFlowBottleneckBlock(nn.Layer): ...@@ -276,7 +276,7 @@ class ExitFlowBottleneckBlock(nn.Layer):
conv2 = F.relu(conv1) conv2 = F.relu(conv1)
conv2 = self._conv_2(conv2) conv2 = self._conv_2(conv2)
pool = self._pool(conv2) pool = self._pool(conv2)
return paddle.elementwise_add(x=short, y=pool) return paddle.add(x=short, y=pool)
class ExitFlow(nn.Layer): class ExitFlow(nn.Layer):
...@@ -289,7 +289,7 @@ class ExitFlow(nn.Layer): ...@@ -289,7 +289,7 @@ class ExitFlow(nn.Layer):
728, 728, 1024, name=name + "_1") 728, 728, 1024, name=name + "_1")
self._conv_1 = SeparableConv(1024, 1536, stride=1, name=name + "_2") self._conv_1 = SeparableConv(1024, 1536, stride=1, name=name + "_2")
self._conv_2 = SeparableConv(1536, 2048, stride=1, name=name + "_3") self._conv_2 = SeparableConv(1536, 2048, stride=1, name=name + "_3")
self._pool = AdaptiveAvgPool2d(1) self._pool = AdaptiveAvgPool2D(1)
stdv = 1.0 / math.sqrt(2048 * 1.0) stdv = 1.0 / math.sqrt(2048 * 1.0)
self._out = Linear( self._out = Linear(
2048, 2048,
......
...@@ -2,8 +2,8 @@ import paddle ...@@ -2,8 +2,8 @@ import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
import paddle.nn.functional as F import paddle.nn.functional as F
from paddle.nn import Conv2d, BatchNorm, Linear, Dropout from paddle.nn import Conv2D, BatchNorm, Linear, Dropout
from paddle.nn import AdaptiveAvgPool2d, MaxPool2d, AvgPool2d from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
__all__ = ["Xception41_deeplab", "Xception65_deeplab", "Xception71_deeplab"] __all__ = ["Xception41_deeplab", "Xception65_deeplab", "Xception71_deeplab"]
...@@ -69,7 +69,7 @@ class ConvBNLayer(nn.Layer): ...@@ -69,7 +69,7 @@ class ConvBNLayer(nn.Layer):
name=None): name=None):
super(ConvBNLayer, self).__init__() super(ConvBNLayer, self).__init__()
self._conv = Conv2d( self._conv = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=output_channels, out_channels=output_channels,
kernel_size=filter_size, kernel_size=filter_size,
...@@ -102,7 +102,7 @@ class Seperate_Conv(nn.Layer): ...@@ -102,7 +102,7 @@ class Seperate_Conv(nn.Layer):
name=None): name=None):
super(Seperate_Conv, self).__init__() super(Seperate_Conv, self).__init__()
self._conv1 = Conv2d( self._conv1 = Conv2D(
in_channels=input_channels, in_channels=input_channels,
out_channels=input_channels, out_channels=input_channels,
kernel_size=filter, kernel_size=filter,
...@@ -121,7 +121,7 @@ class Seperate_Conv(nn.Layer): ...@@ -121,7 +121,7 @@ class Seperate_Conv(nn.Layer):
bias_attr=ParamAttr(name=name + "/depthwise/BatchNorm/beta"), bias_attr=ParamAttr(name=name + "/depthwise/BatchNorm/beta"),
moving_mean_name=name + "/depthwise/BatchNorm/moving_mean", moving_mean_name=name + "/depthwise/BatchNorm/moving_mean",
moving_variance_name=name + "/depthwise/BatchNorm/moving_variance") moving_variance_name=name + "/depthwise/BatchNorm/moving_variance")
self._conv2 = Conv2d( self._conv2 = Conv2D(
input_channels, input_channels,
output_channels, output_channels,
1, 1,
...@@ -244,7 +244,7 @@ class Xception_Block(nn.Layer): ...@@ -244,7 +244,7 @@ class Xception_Block(nn.Layer):
skip = self._short(inputs) skip = self._short(inputs)
else: else:
skip = inputs skip = inputs
return paddle.elementwise_add(x, skip) return paddle.add(x, skip)
class XceptionDeeplab(nn.Layer): class XceptionDeeplab(nn.Layer):
...@@ -347,7 +347,7 @@ class XceptionDeeplab(nn.Layer): ...@@ -347,7 +347,7 @@ class XceptionDeeplab(nn.Layer):
self.stride = s self.stride = s
self._drop = Dropout(p=0.5, mode="downscale_in_infer") self._drop = Dropout(p=0.5, mode="downscale_in_infer")
self._pool = AdaptiveAvgPool2d(1) self._pool = AdaptiveAvgPool2D(1)
self._fc = Linear( self._fc = Linear(
self.chns[1][-1], self.chns[1][-1],
class_dim, class_dim,
......
...@@ -38,8 +38,7 @@ class Loss(object): ...@@ -38,8 +38,7 @@ class Loss(object):
one_hot_target = F.one_hot(target, self._class_dim) one_hot_target = F.one_hot(target, self._class_dim)
else: else:
one_hot_target = target one_hot_target = target
soft_target = F.label_smooth( soft_target = F.label_smooth(one_hot_target, epsilon=self._epsilon)
one_hot_target, epsilon=self._epsilon, dtype="float32")
soft_target = paddle.reshape(soft_target, shape=[-1, self._class_dim]) soft_target = paddle.reshape(soft_target, shape=[-1, self._class_dim])
return soft_target return soft_target
...@@ -47,7 +46,7 @@ class Loss(object): ...@@ -47,7 +46,7 @@ class Loss(object):
if self._label_smoothing: if self._label_smoothing:
target = self._labelsmoothing(target) target = self._labelsmoothing(target)
input = -F.log_softmax(input, axis=-1) input = -F.log_softmax(input, axis=-1)
cost = paddle.reduce_sum(target * input, dim=-1) cost = paddle.sum(target * input, axis=-1)
else: else:
cost = F.cross_entropy(input=input, label=target) cost = F.cross_entropy(input=input, label=target)
avg_cost = paddle.mean(cost) avg_cost = paddle.mean(cost)
......
...@@ -19,15 +19,15 @@ from __future__ import print_function ...@@ -19,15 +19,15 @@ from __future__ import print_function
import sys import sys
import math import math
from paddle.optimizer.lr_scheduler import LinearLrWarmup from paddle.optimizer.lr import LinearWarmup
from paddle.optimizer.lr_scheduler import PiecewiseLR from paddle.optimizer.lr import PiecewiseDecay
from paddle.optimizer.lr_scheduler import CosineAnnealingLR from paddle.optimizer.lr import CosineAnnealingDecay
from paddle.optimizer.lr_scheduler import ExponentialLR from paddle.optimizer.lr import ExponentialDecay
__all__ = ['LearningRateBuilder'] __all__ = ['LearningRateBuilder']
class Cosine(CosineAnnealingLR): class Cosine(CosineAnnealingDecay):
""" """
Cosine learning rate decay Cosine learning rate decay
lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1) lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)
...@@ -46,7 +46,7 @@ class Cosine(CosineAnnealingLR): ...@@ -46,7 +46,7 @@ class Cosine(CosineAnnealingLR):
self.update_specified = False self.update_specified = False
class Piecewise(PiecewiseLR): class Piecewise(PiecewiseDecay):
""" """
Piecewise learning rate decay Piecewise learning rate decay
...@@ -66,7 +66,7 @@ class Piecewise(PiecewiseLR): ...@@ -66,7 +66,7 @@ class Piecewise(PiecewiseLR):
self.update_specified = False self.update_specified = False
class CosineWarmup(LinearLrWarmup): class CosineWarmup(LinearWarmup):
""" """
Cosine learning rate decay with warmup Cosine learning rate decay with warmup
[0, warmup_epoch): linear warmup [0, warmup_epoch): linear warmup
...@@ -96,7 +96,7 @@ class CosineWarmup(LinearLrWarmup): ...@@ -96,7 +96,7 @@ class CosineWarmup(LinearLrWarmup):
self.update_specified = False self.update_specified = False
class ExponentialWarmup(LinearLrWarmup): class ExponentialWarmup(LinearWarmup):
""" """
Exponential learning rate decay with warmup Exponential learning rate decay with warmup
[0, warmup_epoch): linear warmup [0, warmup_epoch): linear warmup
...@@ -120,7 +120,7 @@ class ExponentialWarmup(LinearLrWarmup): ...@@ -120,7 +120,7 @@ class ExponentialWarmup(LinearLrWarmup):
warmup_step = warmup_epoch * step_each_epoch warmup_step = warmup_epoch * step_each_epoch
start_lr = 0.0 start_lr = 0.0
end_lr = lr end_lr = lr
lr_sch = ExponentialLR(lr, decay_rate) lr_sch = ExponentialDecay(lr, decay_rate)
super(ExponentialWarmup, self).__init__( super(ExponentialWarmup, self).__init__(
learning_rate=lr_sch, learning_rate=lr_sch,
......
...@@ -19,7 +19,7 @@ from __future__ import print_function ...@@ -19,7 +19,7 @@ from __future__ import print_function
import sys import sys
import paddle import paddle
import paddle.fluid.regularizer as regularizer import paddle.regularizer as regularizer
__all__ = ['OptimizerBuilder'] __all__ = ['OptimizerBuilder']
......
...@@ -20,8 +20,7 @@ import os ...@@ -20,8 +20,7 @@ import os
import sys import sys
import paddle import paddle
# TODO: need to be fixed in the future. from paddle import is_compiled_with_cuda
from paddle.fluid import is_compiled_with_cuda
from ppcls.modeling import get_architectures from ppcls.modeling import get_architectures
from ppcls.modeling import similar_architectures from ppcls.modeling import similar_architectures
......
...@@ -23,7 +23,7 @@ import shutil ...@@ -23,7 +23,7 @@ import shutil
import tempfile import tempfile
import paddle import paddle
from paddle.io import load_program_state from paddle.static import load_program_state
from ppcls.utils import logger from ppcls.utils import logger
...@@ -65,7 +65,7 @@ def load_dygraph_pretrain(model, path=None, load_static_weights=False): ...@@ -65,7 +65,7 @@ def load_dygraph_pretrain(model, path=None, load_static_weights=False):
model.set_dict(param_state_dict) model.set_dict(param_state_dict)
return return
param_state_dict, optim_state_dict = paddle.load(path) param_state_dict = paddle.load(path + ".pdparams")
model.set_dict(param_state_dict) model.set_dict(param_state_dict)
return return
...@@ -106,7 +106,8 @@ def init_model(config, net, optimizer=None): ...@@ -106,7 +106,8 @@ def init_model(config, net, optimizer=None):
"Given dir {}.pdparams not exist.".format(checkpoints) "Given dir {}.pdparams not exist.".format(checkpoints)
assert os.path.exists(checkpoints + ".pdopt"), \ assert os.path.exists(checkpoints + ".pdopt"), \
"Given dir {}.pdopt not exist.".format(checkpoints) "Given dir {}.pdopt not exist.".format(checkpoints)
para_dict, opti_dict = paddle.load(checkpoints) para_dict = paddle.load(checkpoints + ".pdparams")
opti_dict = paddle.load(checkpoints + ".pdopt")
net.set_dict(para_dict) net.set_dict(para_dict)
optimizer.set_state_dict(opti_dict) optimizer.set_state_dict(opti_dict)
logger.info( logger.info(
...@@ -142,8 +143,8 @@ def save_model(net, optimizer, model_path, epoch_id, prefix='ppcls'): ...@@ -142,8 +143,8 @@ def save_model(net, optimizer, model_path, epoch_id, prefix='ppcls'):
_mkdir_if_not_exist(model_path) _mkdir_if_not_exist(model_path)
model_prefix = os.path.join(model_path, prefix) model_prefix = os.path.join(model_path, prefix)
paddle.save(net.state_dict(), model_prefix) paddle.save(net.state_dict(), model_prefix + ".pdparams")
paddle.save(optimizer.state_dict(), model_prefix) paddle.save(optimizer.state_dict(), model_prefix + ".pdopt")
logger.info( logger.info(
logger.coloring("Already save model in {}".format(model_path), logger.coloring("Already save model in {}".format(model_path),
"HEADER")) "HEADER"))
...@@ -20,7 +20,9 @@ sys.path.append(__dir__) ...@@ -20,7 +20,9 @@ sys.path.append(__dir__)
sys.path.append(os.path.abspath(os.path.join(__dir__, '..'))) sys.path.append(os.path.abspath(os.path.join(__dir__, '..')))
sys.path.append(os.path.abspath(os.path.join(__dir__, '../..'))) sys.path.append(os.path.abspath(os.path.join(__dir__, '../..')))
from multiprocessing import Process, Manager import paddle
from multiprocessing import Manager
import tools.eval as eval import tools.eval as eval
from ppcls.utils.model_zoo import _download, _decompress from ppcls.utils.model_zoo import _download, _decompress
from ppcls.utils import logger from ppcls.utils import logger
...@@ -80,18 +82,25 @@ def main(args): ...@@ -80,18 +82,25 @@ def main(args):
args.config = model_info["config_path"] args.config = model_info["config_path"]
args.override = [ args.override = [
"pretrained_model={}".format(pretrained_path), "pretrained_model={}".format(pretrained_path),
"VALID.batch_size=128", "VALID.batch_size=256",
"VALID.num_workers=16", "VALID.num_workers=16",
"load_static_weights=True", "load_static_weights=True",
"print_interval=100", "print_interval=100",
] ]
manager = Manager() manager = Manager()
return_dict = manager.dict() return_dict = manager.dict()
p = Process(target=eval.main, args=(args, return_dict))
p.start() # A hack method to avoid name conflict.
p.join() # Multi-process maybe a better method here.
# More details can be seen in branch 2.0-beta.
# TODO: fluid needs to be removed in the future.
with paddle.utils.unique_name.guard():
eval.main(args, return_dict)
top1_acc = return_dict.get("top1_acc", 0.0) top1_acc = return_dict.get("top1_acc", 0.0)
except: except Exception as e:
logger.error(e)
top1_acc = 0.0 top1_acc = 0.0
diff = abs(top1_acc - model_info["top1_acc"]) diff = abs(top1_acc - model_info["top1_acc"])
if diff > 0.001: if diff > 0.001:
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
0.8077 InceptionV4 configs/Inception/InceptionV4.yaml https://paddle-imagenet-models-name.bj.bcebos.com/InceptionV4_pretrained.tar 0.8077 InceptionV4 configs/Inception/InceptionV4.yaml https://paddle-imagenet-models-name.bj.bcebos.com/InceptionV4_pretrained.tar
0.8255 ResNeXt101_32x8d_wsl configs/ResNeXt101_wsl/ResNeXt101_32x8d_wsl.yaml https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_32x8d_wsl_pretrained.tar 0.8255 ResNeXt101_32x8d_wsl configs/ResNeXt101_wsl/ResNeXt101_32x8d_wsl.yaml https://paddle-imagenet-models-name.bj.bcebos.com/ResNeXt101_32x8d_wsl_pretrained.tar
0.8035 ResNeSt50_fast_1s1x64d configs/ResNeSt/ResNeSt50_fast_1s1x64d.yaml https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_fast_1s1x64d_pretrained.pdparams 0.8035 ResNeSt50_fast_1s1x64d configs/ResNeSt/ResNeSt50_fast_1s1x64d.yaml https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_fast_1s1x64d_pretrained.pdparams
0.8102 ResNeSt50 configs/ResNeSt/ResNeSt50.yaml https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_pretrained.pdparams 0.8083 ResNeSt50 configs/ResNeSt/ResNeSt50.yaml https://paddle-imagenet-models-name.bj.bcebos.com/ResNeSt50_pretrained.pdparams
0.785 RegNetX_4GF configs/RegNet/RegNetX_4GF.yaml https://paddle-imagenet-models-name.bj.bcebos.com/RegNetX_4GF_pretrained.pdparams 0.785 RegNetX_4GF configs/RegNet/RegNetX_4GF.yaml https://paddle-imagenet-models-name.bj.bcebos.com/RegNetX_4GF_pretrained.pdparams
0.7402 GhostNet_x1_0 configs/GhostNet/GhostNet_x1_0.yaml https://paddle-imagenet-models-name.bj.bcebos.com/GhostNet_x1_0_pretrained.pdparams 0.7402 GhostNet_x1_0 configs/GhostNet/GhostNet_x1_0.yaml https://paddle-imagenet-models-name.bj.bcebos.com/GhostNet_x1_0_pretrained.pdparams
0.567 AlexNet configs/AlexNet/AlexNet.yaml https://paddle-imagenet-models-name.bj.bcebos.com/AlexNet_pretrained.tar 0.567 AlexNet configs/AlexNet/AlexNet.yaml https://paddle-imagenet-models-name.bj.bcebos.com/AlexNet_pretrained.tar
......
...@@ -49,13 +49,11 @@ def parse_args(): ...@@ -49,13 +49,11 @@ def parse_args():
def main(args, return_dict={}): def main(args, return_dict={}):
config = get_config(args.config, overrides=args.override, show=True) config = get_config(args.config, overrides=args.override, show=True)
config.mode = "valid"
# assign place # assign place
use_gpu = config.get("use_gpu", True) use_gpu = config.get("use_gpu", True)
if use_gpu: place = 'gpu:{}'.format(ParallelEnv().dev_id) if use_gpu else 'cpu'
gpu_id = ParallelEnv().dev_id place = paddle.set_device(place)
place = paddle.CUDAPlace(gpu_id)
else:
place = paddle.CPUPlace()
paddle.disable_static(place) paddle.disable_static(place)
......
...@@ -33,7 +33,8 @@ def parse_args(): ...@@ -33,7 +33,8 @@ def parse_args():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-m", "--model", type=str) parser.add_argument("-m", "--model", type=str)
parser.add_argument("-p", "--pretrained_model", type=str) parser.add_argument("-p", "--pretrained_model", type=str)
parser.add_argument("-o", "--output_path", type=str) parser.add_argument(
"-o", "--output_path", type=str, default="./inference/cls_infer")
parser.add_argument("--class_dim", type=int, default=1000) parser.add_argument("--class_dim", type=int, default=1000)
parser.add_argument("--load_static_weights", type=str2bool, default=True) parser.add_argument("--load_static_weights", type=str2bool, default=True)
# parser.add_argument("--img_size", type=int, default=224) # parser.add_argument("--img_size", type=int, default=224)
...@@ -61,7 +62,6 @@ class Net(paddle.nn.Layer): ...@@ -61,7 +62,6 @@ class Net(paddle.nn.Layer):
def main(): def main():
args = parse_args() args = parse_args()
paddle.disable_static()
net = architectures.__dict__[args.model] net = architectures.__dict__[args.model]
model = Net(net, to_static, args.class_dim) model = Net(net, to_static, args.class_dim)
......
...@@ -38,6 +38,7 @@ def parse_args(): ...@@ -38,6 +38,7 @@ def parse_args():
parser.add_argument("-i", "--image_file", type=str) parser.add_argument("-i", "--image_file", type=str)
parser.add_argument("-m", "--model", type=str) parser.add_argument("-m", "--model", type=str)
parser.add_argument("-p", "--pretrained_model", type=str) parser.add_argument("-p", "--pretrained_model", type=str)
parser.add_argument("--class_num", type=int, default=1000)
parser.add_argument("--use_gpu", type=str2bool, default=True) parser.add_argument("--use_gpu", type=str2bool, default=True)
parser.add_argument( parser.add_argument(
"--load_static_weights", "--load_static_weights",
...@@ -114,15 +115,10 @@ def main(): ...@@ -114,15 +115,10 @@ def main():
args = parse_args() args = parse_args()
operators = create_operators() operators = create_operators()
# assign the place # assign the place
if args.use_gpu: place = 'gpu:{}'.format(ParallelEnv().dev_id) if args.use_gpu else 'cpu'
gpu_id = ParallelEnv().dev_id place = paddle.set_device(place)
place = paddle.CUDAPlace(gpu_id)
else:
place = paddle.CPUPlace()
paddle.disable_static(place) net = architectures.__dict__[args.model](class_dim=args.class_num)
net = architectures.__dict__[args.model]()
load_dygraph_pretrain(net, args.pretrained_model, args.load_static_weights) load_dygraph_pretrain(net, args.pretrained_model, args.load_static_weights)
image_list = get_image_list(args.image_file) image_list = get_image_list(args.image_file)
for idx, filename in enumerate(image_list): for idx, filename in enumerate(image_list):
...@@ -133,8 +129,7 @@ def main(): ...@@ -133,8 +129,7 @@ def main():
outputs = net(data) outputs = net(data)
if args.model == "GoogLeNet": if args.model == "GoogLeNet":
outputs = outputs[0] outputs = outputs[0]
else: outputs = F.softmax(outputs)
outputs = F.softmax(outputs)
outputs = outputs.numpy() outputs = outputs.numpy()
probs = postprocess(outputs) probs = postprocess(outputs)
......
...@@ -141,12 +141,12 @@ def create_metric(out, ...@@ -141,12 +141,12 @@ def create_metric(out,
""" """
if architecture["name"] == "GoogLeNet": if architecture["name"] == "GoogLeNet":
assert len(out) == 3, "GoogLeNet should have 3 outputs" assert len(out) == 3, "GoogLeNet should have 3 outputs"
softmax_out = out[0] out = out[0]
else: else:
# just need student label to get metrics # just need student label to get metrics
if use_distillation: if use_distillation:
out = out[1] out = out[1]
softmax_out = F.softmax(out) softmax_out = F.softmax(out)
fetchs = OrderedDict() fetchs = OrderedDict()
# set top1 to fetchs # set top1 to fetchs
......
...@@ -55,17 +55,12 @@ def main(args): ...@@ -55,17 +55,12 @@ def main(args):
config = get_config(args.config, overrides=args.override, show=True) config = get_config(args.config, overrides=args.override, show=True)
# assign the place # assign the place
use_gpu = config.get("use_gpu", True) use_gpu = config.get("use_gpu", True)
if use_gpu: place = 'gpu:{}'.format(ParallelEnv().dev_id) if use_gpu else 'cpu'
gpu_id = ParallelEnv().dev_id place = paddle.set_device(place)
place = paddle.CUDAPlace(gpu_id)
else:
place = paddle.CPUPlace()
use_data_parallel = int(os.getenv("PADDLE_TRAINERS_NUM", 1)) != 1 use_data_parallel = int(os.getenv("PADDLE_TRAINERS_NUM", 1)) != 1
config["use_data_parallel"] = use_data_parallel config["use_data_parallel"] = use_data_parallel
paddle.disable_static(place)
net = program.create_model(config.ARCHITECTURE, config.classes_num) net = program.create_model(config.ARCHITECTURE, config.classes_num)
optimizer, lr_scheduler = program.create_optimizer( optimizer, lr_scheduler = program.create_optimizer(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册