diff --git a/README_ch.md b/README_ch.md
index ee6028d174124eef83e29901bbfb91611057f957..0df8c9b5f9acdaa307c6777d59e4706801d7663b 100644
--- a/README_ch.md
+++ b/README_ch.md
@@ -23,28 +23,17 @@
 
 ## 近期更新
 
-- 🔥️ 2022.9.14 晚上8:30  **商超零售新革命-生鲜智能结算产业应用**,扫码进群获取直播链接
-
-  
-    

-  
  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
diff --git a/docs/zh_CN/introduction/more_demo/index.rst b/docs/zh_CN/introduction/more_demo/index.rst
deleted file mode 100644
index 448e9fefb986e11bbddeacfc55d714c8538d0583..0000000000000000000000000000000000000000
--- a/docs/zh_CN/introduction/more_demo/index.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-介绍
-================================
-
-.. toctree::
-   :maxdepth: 2
-
-   cartoon.md
-   logo.md
-   more_demo.md
-   product.md
-   vehicle.md
diff --git a/docs/zh_CN/introduction/more_demo/logo.md b/docs/zh_CN/introduction/more_demo/logo.md
deleted file mode 100644
index cbed4a6e6a14b0dbeafae00f83378d9a95d2a0b7..0000000000000000000000000000000000000000
--- a/docs/zh_CN/introduction/more_demo/logo.md
+++ /dev/null
@@ -1,65 +0,0 @@
-## 商标图片识别效果图
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
diff --git a/docs/zh_CN/introduction/more_demo/more_demo.md b/docs/zh_CN/introduction/more_demo/more_demo.md
deleted file mode 100644
index 97732e3f2a1eb2404e14954d8ec55142cfc4d5b9..0000000000000000000000000000000000000000
--- a/docs/zh_CN/introduction/more_demo/more_demo.md
+++ /dev/null
@@ -1,40 +0,0 @@
-## 识别效果展示
-- 商品识别
-  
  
-  
  
-  
  
-  
  
-  
  
-
-[更多效果图](product.md)
-
-
-- 动漫人物识别
-
-  
  
-  
  
-  
  
-
-[更多效果图](cartoon.md)
-
-
-- logo识别
-
-  
  
-  
  
-  
  
-  
  
-  
  
-  
  
-
-
-[更多效果图](logo.md)
-
-
-- 车辆识别
-
-  
  
-  
  
-  
  
-
-[更多效果图](vehicle.md)
diff --git a/docs/zh_CN/introduction/more_demo/product.md b/docs/zh_CN/introduction/more_demo/product.md
deleted file mode 100644
index df211f04a52c7ec2f35be2a5bba9e0a00af22b33..0000000000000000000000000000000000000000
--- a/docs/zh_CN/introduction/more_demo/product.md
+++ /dev/null
@@ -1,179 +0,0 @@
-## 商品图片识别效果图
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
diff --git a/docs/zh_CN/introduction/more_demo/vehicle.md b/docs/zh_CN/introduction/more_demo/vehicle.md
deleted file mode 100644
index 975c98bd818895bb503915354602523cecc60622..0000000000000000000000000000000000000000
--- a/docs/zh_CN/introduction/more_demo/vehicle.md
+++ /dev/null
@@ -1,33 +0,0 @@
-## 车辆图片识别效果图
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
-
-  
  
diff --git a/docs/zh_CN/make.bat b/docs/zh_CN/make.bat
deleted file mode 100644
index fca029c5b49971e7b9e2c7fddb3f897ca903f364..0000000000000000000000000000000000000000
--- a/docs/zh_CN/make.bat
+++ /dev/null
@@ -1,37 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-
-set SOURCEDIR=source
-set BUILDDIR=build
-
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
-	echo.
-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
-	echo.installed, then set the SPHINXBUILD environment variable to point
-	echo.to the full path of the 'sphinx-build' executable. Alternatively you
-	echo.may add the Sphinx directory to PATH.
-	echo.
-	echo.If you don't have Sphinx installed, grab it from
-	echo.https://www.sphinx-doc.org/
-	exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
-:end
-popd
diff --git a/docs/zh_CN/models/CSWinTransformer.md b/docs/zh_CN/models/ImageNet1k/CSWinTransformer.md
similarity index 100%
rename from docs/zh_CN/models/CSWinTransformer.md
rename to docs/zh_CN/models/ImageNet1k/CSWinTransformer.md
diff --git a/docs/zh_CN/models/DLA.md b/docs/zh_CN/models/ImageNet1k/DLA.md
similarity index 99%
rename from docs/zh_CN/models/DLA.md
rename to docs/zh_CN/models/ImageNet1k/DLA.md
index 3612b9ed406c31ab3355a14de728966245fa6287..e9db08d15f4fb72b01462f5516512a5805fc3219 100644
--- a/docs/zh_CN/models/DLA.md
+++ b/docs/zh_CN/models/ImageNet1k/DLA.md
@@ -22,7 +22,7 @@ DLA(Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范
 | DLA46x_c            | 1.1        | 0.5       | 64.36     |   86.01   |
 | DLA60               | 22.0       | 4.2       | 76.10    |   92.92   |
 | DLA60x             | 17.4       | 3.5       | 77.53    |   93.78   |
-| DLA60x_c              | 1.3        | 0.6       | 66.45     |   87.54   | 
+| DLA60x_c              | 1.3        | 0.6       | 66.45     |   87.54   |
 | DLA102                | 33.3       | 7.2       | 78.93     |   94.52   |
 | DLA102x             | 26.4       | 5.9       | 78.10     |   94.00   |
 | DLA102x2              | 41.4       | 9.3       | 78.85     |   94.45   |
@@ -42,4 +42,4 @@ DLA(Deep Layer Aggregation)。 视觉识别需要丰富的表示形式,其范
 | DLA46_c  | 224       | 256               | 1.06                           | 2.08                           | 3.23                           |
 | DLA60    | 224       | 256               | 2.78                           | 5.36                           | 8.29                           |
 | DLA60x_c | 224       | 256               | 1.79                           | 3.68                           | 5.19                           |
-| DLA60x   | 224       | 256               | 5.98                           | 9.24                           | 12.52                          |
\ No newline at end of file
+| DLA60x   | 224       | 256               | 5.98                           | 9.24                           | 12.52                          |
diff --git a/docs/zh_CN/models/DPN_DenseNet.md b/docs/zh_CN/models/ImageNet1k/DPN_DenseNet.md
similarity index 96%
rename from docs/zh_CN/models/DPN_DenseNet.md
rename to docs/zh_CN/models/ImageNet1k/DPN_DenseNet.md
index 3a8a0023234f78d8685f9745e7d296d585d42545..a1a841df0a9778452ba92d73fe4711dcd4d00ea2 100644
--- a/docs/zh_CN/models/DPN_DenseNet.md
+++ b/docs/zh_CN/models/ImageNet1k/DPN_DenseNet.md
@@ -15,13 +15,13 @@ DPN 的全称是 Dual Path Networks,即双通道网络。该网络是由 Dense
 
 该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
 
-
+
 
-
+
 
-
+
 
-
+
 
 目前 PaddleClas 开源的这两类模型的预训练模型一共有 10 个,其指标如上图所示,可以看到,在相同的 FLOPS 和参数量下,相比 DenseNet,DPN 拥有更高的精度。但是由于 DPN 有更多的分支,所以其推理速度要慢于 DenseNet。由于 DenseNet264 的网络层数最深,所以该网络是 DenseNet 系列模型中参数量最大的网络,DenseNet161 的网络的宽度最大,导致其是该系列中网络中计算量最大、精度最高的网络。从推理速度来看,计算量大且精度高的的 DenseNet161 比 DenseNet264 具有更快的速度,所以其比 DenseNet264 具有更大的优势。
 
diff --git a/docs/zh_CN/models/ESNet.md b/docs/zh_CN/models/ImageNet1k/ESNet.md
similarity index 100%
rename from docs/zh_CN/models/ESNet.md
rename to docs/zh_CN/models/ImageNet1k/ESNet.md
diff --git a/docs/zh_CN/models/EfficientNet_and_ResNeXt101_wsl.md b/docs/zh_CN/models/ImageNet1k/EfficientNet_and_ResNeXt101_wsl.md
similarity index 97%
rename from docs/zh_CN/models/EfficientNet_and_ResNeXt101_wsl.md
rename to docs/zh_CN/models/ImageNet1k/EfficientNet_and_ResNeXt101_wsl.md
index dfe68ace2b4917d88aa552b5e2016e8ffe4efc94..f4819df1cfc19ef136fe38abfad13c3c76d8e4f7 100644
--- a/docs/zh_CN/models/EfficientNet_and_ResNeXt101_wsl.md
+++ b/docs/zh_CN/models/ImageNet1k/EfficientNet_and_ResNeXt101_wsl.md
@@ -16,13 +16,13 @@ ResNeXt 是 facebook 于 2016 年提出的一种对 ResNet 的改进版网络。
 
 该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
 
-
+
 
-
+
 
-
+
 
-
+
 
 目前 PaddleClas 开源的这两类模型的预训练模型一共有 14 个。从上图中可以看出 EfficientNet 系列网络优势非常明显,ResNeXt101_wsl 系列模型由于用到了更多的数据,最终的精度也更高。EfficientNet_B0_Small 是去掉了 SE_block 的 EfficientNet_B0,其具有更快的推理速度。
 
diff --git a/docs/zh_CN/models/HRNet.md b/docs/zh_CN/models/ImageNet1k/HRNet.md
similarity index 96%
rename from docs/zh_CN/models/HRNet.md
rename to docs/zh_CN/models/ImageNet1k/HRNet.md
index 179c946179bc743def9a981bfeb29b46a8bc6ffb..9b7abb9ee31758eaf9b564f0c9e8a9606c194b4d 100644
--- a/docs/zh_CN/models/HRNet.md
+++ b/docs/zh_CN/models/ImageNet1k/HRNet.md
@@ -14,13 +14,13 @@ HRNet 是 2019 年由微软亚洲研究院提出的一种全新的神经网络
 
 该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
 
-
+
 
-
+
 
-
+
 
-
+
 
 目前 PaddleClas 开源的这类模型的预训练模型一共有 7 个,其指标如图所示,其中 HRNet_W48_C 指标精度异常的原因可能是因为网络训练的正常波动。
 
diff --git a/docs/zh_CN/models/HarDNet.md b/docs/zh_CN/models/ImageNet1k/HarDNet.md
similarity index 99%
rename from docs/zh_CN/models/HarDNet.md
rename to docs/zh_CN/models/ImageNet1k/HarDNet.md
index 3f75fad7bc876843640c888b0c6d80f822b344ac..ddd15c5cd01ae730ef8fdb32086fdb2285e7e581 100644
--- a/docs/zh_CN/models/HarDNet.md
+++ b/docs/zh_CN/models/ImageNet1k/HarDNet.md
@@ -32,4 +32,3 @@ HarDNet(Harmonic DenseNet)是 2019 年由国立清华大学提出的一种
 | HarDNet85    | 224       | 256               | 6.24                           | 14.85                          | 20.57                          |
 | HarDNet39_ds | 224       | 256               | 1.40                           | 2.30                           | 3.33                           |
 | HarDNet68_ds | 224       | 256               | 2.26                           | 3.34                           | 5.06                           |
-
diff --git a/docs/zh_CN/models/Inception.md b/docs/zh_CN/models/ImageNet1k/Inception.md
similarity index 96%
rename from docs/zh_CN/models/Inception.md
rename to docs/zh_CN/models/ImageNet1k/Inception.md
index bed40b3e4a628e7af0aebb0f9b9d7c8f8c073a68..dc8cb449f8b6a44a153cbf25e081d222ef63c280 100644
--- a/docs/zh_CN/models/Inception.md
+++ b/docs/zh_CN/models/ImageNet1k/Inception.md
@@ -22,13 +22,13 @@ InceptionV4 是 2016 年由 Google 设计的新的神经网络,当时残差结
 
 该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
 
-
+
 
-
+
 
-
+
 
-
+
 
 上图反映了 Xception 系列和 InceptionV4 的精度和其他指标的关系。其中 Xception_deeplab 与论文结构保持一致,Xception 是 PaddleClas 的改进模型,在预测速度基本不变的情况下,精度提升约 0.6%。关于该改进模型的详细介绍正在持续更新中,敬请期待。
 
diff --git a/docs/zh_CN/models/LeViT.md b/docs/zh_CN/models/ImageNet1k/LeViT.md
similarity index 100%
rename from docs/zh_CN/models/LeViT.md
rename to docs/zh_CN/models/ImageNet1k/LeViT.md
diff --git a/docs/zh_CN/models/MixNet.md b/docs/zh_CN/models/ImageNet1k/MixNet.md
similarity index 100%
rename from docs/zh_CN/models/MixNet.md
rename to docs/zh_CN/models/ImageNet1k/MixNet.md
diff --git a/docs/zh_CN/models/Mobile.md b/docs/zh_CN/models/ImageNet1k/Mobile.md
similarity index 99%
rename from docs/zh_CN/models/Mobile.md
rename to docs/zh_CN/models/ImageNet1k/Mobile.md
index c4cede55525b1d11ff6fa6c8339e15a6afe57e21..7723e1c83001cf7c28302cde284c78a7fa247f8c 100644
--- a/docs/zh_CN/models/Mobile.md
+++ b/docs/zh_CN/models/ImageNet1k/Mobile.md
@@ -21,13 +21,13 @@ MobileNetV3 是 Google 于 2019 年提出的一种基于 NAS 的新的轻量级
 
 GhostNet 是华为于 2020 年提出的一种全新的轻量化网络结构,通过引入 ghost module,大大减缓了传统深度网络中特征的冗余计算问题,使得网络的参数量和计算量大大降低。
 
-
+
 
-
+
 
-
+
 
-
+
 
 
 目前 PaddleClas 开源的的移动端系列的预训练模型一共有 35 个,其指标如图所示。从图片可以看出,越新的轻量级模型往往有更优的表现,MobileNetV3 代表了目前主流的轻量级神经网络结构。在 MobileNetV3 中,作者为了获得更高的精度,在 global-avg-pooling 后使用了 1x1 的卷积。该操作大幅提升了参数量但对计算量影响不大,所以如果从存储角度评价模型的优异程度,MobileNetV3 优势不是很大,但由于其更小的计算量,使得其有更快的推理速度。此外,我们模型库中的 ssld 蒸馏模型表现优异,从各个考量角度下,都刷新了当前轻量级模型的精度。由于 MobileNetV3 模型结构复杂,分支较多,对 GPU 并不友好,GPU 预测速度不如 MobileNetV1。GhostNet 于 2020 年提出,通过引入 ghost 的网络设计理念,大大降低了计算量和参数量,同时在精度上也超过前期最高的 MobileNetV3 网络结构。
diff --git a/docs/zh_CN/models/MobileViT.md b/docs/zh_CN/models/ImageNet1k/MobileViT.md
similarity index 100%
rename from docs/zh_CN/models/MobileViT.md
rename to docs/zh_CN/models/ImageNet1k/MobileViT.md
diff --git a/docs/zh_CN/models/Others.md b/docs/zh_CN/models/ImageNet1k/Others.md
similarity index 100%
rename from docs/zh_CN/models/Others.md
rename to docs/zh_CN/models/ImageNet1k/Others.md
diff --git a/docs/zh_CN/models/PP-HGNet.md b/docs/zh_CN/models/ImageNet1k/PP-HGNet.md
similarity index 90%
rename from docs/zh_CN/models/PP-HGNet.md
rename to docs/zh_CN/models/ImageNet1k/PP-HGNet.md
index f89c11c84b20723a84f98754d090ea1119931e92..2282b0093f9bd20f42ece313487ffffff4d463d6 100644
--- a/docs/zh_CN/models/PP-HGNet.md
+++ b/docs/zh_CN/models/ImageNet1k/PP-HGNet.md
@@ -44,11 +44,11 @@ PP-HGNet 作者针对 GPU 设备,对目前 GPU 友好的网络做了分析和
 
 PP-HGNet 骨干网络的整体结构如下:
 
-
+
 
 其中,PP-HGNet是由多个HG-Block组成,HG-Block的细节如下:
 
-
+
 
 
 
@@ -65,8 +65,8 @@ PP-HGNet 目前提供的模型的精度、速度指标及预训练权重链接
 | PPHGNet_base_ssld | 85.00| 97.35 | 5.97   | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPHGNet_base_ssld_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPHGNet_base_ssld_infer.tar) |
 
 **备注:**
-    
-* 1. `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../advanced_tutorials/knowledge_distillation.md)。
+
+* 1. `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../../training/advanced/knowledge_distillation.md)。
 * 2. PP-HGNet 更多模型指标及权重,敬请期待。
 
 PP-HGNet 与其他模型的比较如下,其中测试机器为 NVIDIA® Tesla® V100,开启 TensorRT 引擎,精度类型为 FP32。在相同速度下,PP-HGNet 精度均超越了其他 SOTA CNN 模型,在与 SwinTransformer 模型的比较中,在更高精度的同时,速度快 2 倍以上。
@@ -89,8 +89,8 @@ PP-HGNet 与其他模型的比较如下,其中测试机器为 NVIDIA® Tesla®
 | ResNeXt101_32x48d_wsl    | 85.37      | 97.69       | 55.07       |
 | SwinTransformer_base     | 85.2       | 97.5        | 13.53       |  
 | PPHGNet_base_ssld | 85.00| 97.35 | 5.97   |
-    
-    
+
+
 
 
 ## 2. 模型快速体验
@@ -123,31 +123,31 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
 pip3 install paddleclas
 ```
 
- 
-    
+
+
 ### 2.3 预测
 
 * 在命令行中使用 PPHGNet_small 的权重快速预测
-    
+
 ```bash
 paddleclas --model_name=PPHGNet_small  --infer_imgs="docs/images/inference_deployment/whl_demo.jpg"
 ```
-    
+
 结果如下:
 ```
 >>> result
 class_ids: [8, 7, 86, 82, 81], scores: [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], label_names: ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan'], filename: docs/images/inference_deployment/whl_demo.jpg
 Predict complete!
 ```  
-    
-**备注**: 更换 PPHGNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPHGNet_tiny` 时,只需要将 `--model_name=PPHGNet_small` 改为 `--model_name=PPHGNet_tiny` 即可。   
 
-    
+**备注**: 更换 PPHGNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPHGNet_tiny` 时,只需要将 `--model_name=PPHGNet_small` 改为 `--model_name=PPHGNet_tiny` 即可。  
+
+
 * 在 Python 代码中预测
 ```python
 from paddleclas import PaddleClas
 clas = PaddleClas(model_name='PPHGNet_small')
-infer_imgs = 'docs/images/inference_deployment/whl_demo.jpg'
+infer_imgs = 'docs/images/deployment/whl_demo.jpg'
 result = clas.predict(infer_imgs)
 print(next(result))
 ```
@@ -159,19 +159,19 @@ print(next(result))
 >>> result
 [{'class_ids': [8, 7, 86, 82, 81], 'scores': [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan'], 'filename': 'docs/images/inference_deployment/whl_demo.jpg'}]
 ```
-    
-    
- 
-    
+
+
+
+
 ## 3. 模型训练、评估和预测
-    
+
   
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档[环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档[环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
- 
+
 
 ### 3.2 数据准备
 
@@ -200,15 +200,15 @@ cd path_to_PaddleClas
 ```
 
 其中 `train/` 和 `val/` 分别为训练集和验证集。`train_list.txt` 和 `val_list.txt` 分别为训练集和验证集的标签文件。
-    
-**备注:** 
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+**备注:**
+
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
- 
+
 
-### 3.3 模型训练 
+### 3.3 模型训练
 
 
 在 `ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml` 中提供了 PPHGNet_small 训练配置,可以通过如下脚本启动训练:
@@ -218,11 +218,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
 python3 -m paddle.distributed.launch \
     --gpus="0,1,2,3" \
     tools/train.py \
-        -c ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml 
+        -c ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml
 ```
 
 
-**备注:** 
+**备注:**
 
 * 当前精度最佳的模型会保存在 `output/PPHGNet_small/best_model.pdparams`
 
@@ -249,7 +249,7 @@ python3 tools/eval.py \
 ```python
 python3 tools/infer.py \
     -c ppcls/configs/ImageNet/PPHGNet/PPHGNet_small.yaml \
-    -o Global.pretrained_model=output/PPHGNet_small/best_model 
+    -o Global.pretrained_model=output/PPHGNet_small/best_model
 ```
 
 输出结果如下:
@@ -258,30 +258,30 @@ python3 tools/infer.py \
 [{'class_ids': [8, 7, 86, 82, 81], 'scores': [0.71479, 0.08682, 0.00806, 0.0023, 0.00121], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'ptarmigan']}]
 ```
 
-**备注:** 
+**备注:**
 
 * 这里`-o Global.pretrained_model="output/PPHGNet_small/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
-    
+
 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
-    
+
 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
 
 
-    
+
 
 
 ## 4. 模型推理部署
 
- 
+
 
 ### 4.1 推理模型准备
 
 Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于Paddle Inference推理引擎的介绍,可以参考[Paddle Inference官网教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/infer/inference/inference_cn.html)。
-    
+
 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择[直接下载 inference 模型](#6.1.2)的方式。
 
-    
- 
+
+
 
 ### 4.1.1 基于训练得到的权重导出 inference 模型
 
@@ -303,7 +303,7 @@ python3 tools/export_model.py \
 ```
 
 
- 
+
 
 ### 4.1.2 直接下载 inference 模型
 
@@ -324,7 +324,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPHGNet
 │   └── inference.pdmodel
 ```
 
- 
+
 
 ### 4.2 基于 Python 预测引擎推理
 
@@ -375,33 +375,32 @@ ILSVRC2012_val_00030010.jpeg:	class id(s): [80, 83, 136, 23, 93], score(s): [0.8
 ```
 
 
- 
+
 
 ### 4.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
- 
+
 
 ### 4.4 服务化部署
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
-    
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
 
- 
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
+
+
 
 ### 4.5 端侧部署
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
-    
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
 
- 
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
+
+
 
 ### 4.6 Paddle2ONNX 模型转换与预测
-    
-Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/models/PP-LCNet.md b/docs/zh_CN/models/ImageNet1k/PP-LCNet.md
similarity index 93%
rename from docs/zh_CN/models/PP-LCNet.md
rename to docs/zh_CN/models/ImageNet1k/PP-LCNet.md
index 2df3c3e297f3f20cb3ffca62c67397f61364de3f..83fa00ae65c8100b50da5d60be69020d95318ff6 100644
--- a/docs/zh_CN/models/PP-LCNet.md
+++ b/docs/zh_CN/models/ImageNet1k/PP-LCNet.md
@@ -37,8 +37,8 @@
   - [4.5 端侧部署](#4.5)
   - [4.6 Paddle2ONNX 模型转换与预测](#4.6)
 - [5. 引用](#5)
-  
-  
+
+
 
 
 
@@ -49,14 +49,14 @@
 在计算机视觉领域中,骨干网络的好坏直接影响到整个视觉任务的结果。在之前的一些工作中,相关的研究者普遍将 FLOPs 或者 Params 作为优化目的,但是在工业界真实落地的场景中,推理速度才是考量模型好坏的重要指标,然而,推理速度和准确性很难兼得。考虑到工业界有很多基于 Intel CPU 的应用,所以我们本次的工作旨在使骨干网络更好的适应 Intel CPU,从而得到一个速度更快、准确率更高的轻量级骨干网络,与此同时,目标检测、语义分割等下游视觉任务的性能也同样得到提升。
 
 近年来,有很多轻量级的骨干网络问世,尤其最近两年,各种 NAS 搜索出的网络层出不穷,这些网络要么主打 FLOPs 或者 Params 上的优势,要么主打 ARM 设备上的推理速度的优势,很少有网络专门针对 Intel CPU 做特定的优化,导致这些网络在 Intel CPU 端的推理速度并不是很完美。基于此,我们针对 Intel CPU 设备以及其加速库 MKLDNN 设计了特定的骨干网络 PP-LCNet,比起其他的轻量级的 SOTA 模型,该骨干网络可以在不增加推理时间的情况下,进一步提升模型的性能,最终大幅度超越现有的 SOTA 模型。与其他模型的对比图如下。
-
+
 
 
 
 ### 1.2 模型细节
 
 网络结构整体如下图所示。
-
+
 我们经过大量的实验发现,在基于 Intel CPU 设备上,尤其当启用 MKLDNN 加速库后,很多看似不太耗时的操作反而会增加延时,比如 elementwise-add 操作、split-concat 结构等。所以最终我们选用了结构尽可能精简、速度尽可能快的 block 组成我们的 BaseNet(类似 MobileNetV1)。基于 BaseNet,我们通过实验,总结了四条几乎不增加延时但是可以提升模型精度的方法,融合这四条策略,我们组合成了 PP-LCNet。下面对这四条策略一一介绍:
 
 
@@ -83,7 +83,7 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模
 最终,PP-LCNet 中的 SE 模块的位置选用了表格中第三行的方案。
 
 
-    
+
 #### 1.2.3 合适的位置添加更大的卷积核
 
 在 MixNet 的论文中,作者分析了卷积核大小对模型性能的影响,结论是在一定范围内大的卷积核可以提升模型的性能,但是超过这个范围会有损模型的性能,所以作者组合了一种 split-concat 范式的 MixConv,这种组合虽然可以提升模型的性能,但是不利于推理。我们通过实验总结了一些更大的卷积核在不同位置的作用,类似 SE 模块的位置,更大的卷积核在网络的中后部作用更明显,下表展示了 5x5 卷积核的位置对精度的影响:
@@ -96,9 +96,9 @@ SE 模块是 SENet 提出的一种通道注意力机制,可以有效提升模
 
 
 实验表明,更大的卷积核放在网络的中后部即可达到放在所有位置的精度,与此同时,获得更快的推理速度。PP-LCNet 最终选用了表格中第三行的方案。
-    
+
 
-    
+
 #### 1.2.4 GAP 后使用更大的 1x1 卷积层
 
 在 GoogLeNet 之后,GAP(Global-Average-Pooling)后往往直接接分类层,但是在轻量级网络中,这样会导致 GAP 后提取的特征没有得到进一步的融合和加工。如果在此后使用一个更大的 1x1 卷积层(等同于 FC 层),GAP 后的特征便不会直接经过分类层,而是先进行了融合,并将融合的特征进行分类。这样可以在不影响模型推理速度的同时大大提升准确率。
@@ -113,17 +113,17 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步
 | 1       | 1       | 1               | 1                | 63.14 | 2.05 |
 
 
-    
+
 ### 1.3 实验结果
 
 
-    
+
 #### 1.3.1 图像分类
 
 图像分类我们选用了 ImageNet 数据集,相比目前主流的轻量级网络,PP-LCNet 在相同精度下可以获得更快的推理速度。当使用百度自研的 SSLD 蒸馏策略后,精度进一步提升,在 Intel cpu 端约 5ms 的推理速度下 ImageNet 的 Top-1 Acc 超过了 80%。
 
 | Model | Params(M) | FLOPs(M) | Top-1 Acc(\%) | Top-5 Acc(\%) | Latency(ms) | 预训练模型下载地址 | inference模型下载地址 |
-|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:| 
+|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
 | PPLCNet_x0_25  | 1.5 | 18  | 51.86 | 75.65 | 1.74 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_25_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_25_infer.tar) |
 | PPLCNet_x0_35  | 1.6 | 29  | 58.09 | 80.83 | 1.92 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_35_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_35_infer.tar) |
 | PPLCNet_x0_5   | 1.9 | 47  | 63.14 | 84.66 | 2.05 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x0_5_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x0_5_infer.tar) |
@@ -136,7 +136,7 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步
 | PPLCNet_x1_0_ssld | 3.0 | 161 | 74.39 | 92.09 | 2.46 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x1_0_ssld_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x1_0_ssld_infer.tar) |
 | PPLCNet_x2_5_ssld | 9.0 | 906 | 80.82 | 95.33 | 5.39 | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/PPLCNet_x2_5_ssld_pretrained.pdparams) | [下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet_x2_5_ssld_infer.tar) |
 
-其中 `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../advanced_tutorials/knowledge_distillation.md)。
+其中 `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../../training/advanced/knowledge_distillation.md)。
 
 与其他轻量级网络的性能对比:
 
@@ -156,7 +156,7 @@ BaseNet 经过以上四个方面的改进,得到了 PP-LCNet。下表进一步
 | PPLCNet_x1_0     | 3.0 | 161 | 71.32 | 90.03 | 2.46 |
 
 
-    
+
 #### 1.3.2 目标检测
 
 目标检测的方法我们选用了百度自研的 PicoDet,该方法主打轻量级目标检测场景,下表展示了在 COCO 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的结果的比较,无论在精度还是速度上,PP-LCNet 的优势都非常明显。
@@ -169,7 +169,7 @@ MobileNetV3_large_x0_75 | 25.8 | 11.1 |
 PPLCNet_x1_0 | 26.9 | 7.9 |
 
 
-    
+
 #### 1.3.3 语义分割
 
 语义分割的方法我们选用了 DeeplabV3+,下表展示了在 Cityscapes 数据集上、backbone 选用 PP-LCNet 与 MobileNetV3 的比较,在精度和速度方面,PP-LCNet 的优势同样明显。
@@ -186,8 +186,8 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
 ## 1.4 Benchmark
 
 
-    
-#### 1.4.1 基于 Intel Xeon Gold 6148 的预测速度    
+
+#### 1.4.1 基于 Intel Xeon Gold 6148 的预测速度  
 
 | Model | Latency(ms)
bs=1, thread=10 |
 |:--:|:--:|
@@ -199,11 +199,11 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
 | PPLCNet_x1_5   | 3.19 |
 | PPLCNet_x2_0   | 4.27 |
 | PPLCNet_x2_5   | 5.39 |
-    
+
 **备注:** 精度类型为 FP32,推理过程使用 MKLDNN。
 
 
-    
+
 #### 1.4.2 基于 V100 GPU 的预测速度
 
 | Models        | Latency(ms)
bs=1 | Latency(ms)
bs=4 | Latency(ms)
bs=8 |
@@ -215,7 +215,7 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
 | PPLCNet_x1_0  | 0.73                         | 1.64                             | 2.53                           |
 | PPLCNet_x1_5  | 0.82                         | 2.06                             | 3.12                           |
 | PPLCNet_x2_0  | 0.94                         | 2.58                             | 4.08                           |
-    
+
 **备注:** 精度类型为 FP32,推理过程使用 TensorRT。
 
 
@@ -232,15 +232,15 @@ MobileNetV3_large_x0_75 | 64.53 | 151 |
 | PPLCNet_x1_5  | 20.55                            | 12.26                             | 7.54                              |
 | PPLCNet_x2_0  | 33.79                            | 20.17                             | 12.10                             |
 | PPLCNet_x2_5  | 49.89                            | 29.60                             | 17.82                             |
-    
+
 **备注:** 精度类型为 FP32。
 
-   
-    
+  
+
 ## 2. 模型快速体验
 
-   
-    
+  
+
 ### 2.1 安装 paddlepaddle
 
 - 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
@@ -266,32 +266,32 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
 ```  
 pip3 install paddleclas
 ```
-    
- 
-    
+
+
+
 ### 2.3 预测
 
 * 在命令行中使用 PPLCNet_x1_0 的权重快速预测
-    
+
 ```bash
 paddleclas --model_name=PPLCNet_x1_0  --infer_imgs="docs/images/inference_deployment/whl_demo.jpg"
 ```
-    
+
 结果如下:
 ```
 >>> result
 class_ids: [8, 7, 86, 81, 85], scores: [0.91347, 0.03779, 0.0036, 0.00117, 0.00112], label_names: ['hen', 'cock', 'partridge', 'ptarmigan', 'quail'], filename: docs/images/inference_deployment/whl_demo.jpg
 Predict complete!
-```   
-    
-**备注**: 更换 PPLCNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPLCNet_x2_0` 时,只需要将 `--model_name=PPLCNet_x1_0` 改为 `--model_name=PPLCNet_x2_0` 即可。   
+```  
+
+**备注**: 更换 PPLCNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `PPLCNet_x2_0` 时,只需要将 `--model_name=PPLCNet_x1_0` 改为 `--model_name=PPLCNet_x2_0` 即可。  
+
 
-    
 * 在 Python 代码中预测
 ```python
 from paddleclas import PaddleClas
 clas = PaddleClas(model_name='PPLCNet_x1_0')
-infer_imgs='docs/images/inference_deployment/whl_demo.jpg'
+infer_imgs='docs/images/deployment/whl_demo.jpg'
 result=clas.predict(infer_imgs)
 print(next(result))
 ```
@@ -303,18 +303,18 @@ print(next(result))
 >>> result
 [{'class_ids': [8, 7, 86, 81, 85], 'scores': [0.91347, 0.03779, 0.0036, 0.00117, 0.00112], 'label_names': ['hen', 'cock', 'partridge', 'ptarmigan', 'quail'], 'filename': 'docs/images/inference_deployment/whl_demo.jpg'}]
 ```
-        
- 
-    
+
+
+
 ## 3. 模型训练、评估和预测
-    
+
   
 
 ### 3.1 环境配置
 
-* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../../installation.md) 配置 PaddleClas 运行环境。
 
- 
+
 
 ### 3.2 数据准备
 
@@ -343,15 +343,15 @@ cd path_to_PaddleClas
 ```
 
 其中 `train/` 和 `val/` 分别为训练集和验证集。`train_list.txt` 和 `val_list.txt` 分别为训练集和验证集的标签文件。
-    
-**备注:** 
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+**备注:**
 
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
- 
 
-### 3.3 模型训练 
+
+
+### 3.3 模型训练
 
 
 在 `ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml` 中提供了 PPLCNet_x1_0 训练配置,可以通过如下脚本启动训练:
@@ -361,11 +361,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
 python3 -m paddle.distributed.launch \
     --gpus="0,1,2,3" \
     tools/train.py \
-        -c ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml 
+        -c ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml
 ```
 
 
-**备注:** 
+**备注:**
 
 * 当前精度最佳的模型会保存在 `output/PPLCNet_x1_0/best_model.pdparams`
 
@@ -392,7 +392,7 @@ python3 tools/eval.py \
 ```python
 python3 tools/infer.py \
     -c ppcls/configs/ImageNet/PPLCNet/PPLCNet_x1_0.yaml \
-    -o Global.pretrained_model=output/PPLCNet_x1_0/best_model 
+    -o Global.pretrained_model=output/PPLCNet_x1_0/best_model
 ```
 
 输出结果如下:
@@ -401,30 +401,30 @@ python3 tools/infer.py \
 [{'class_ids': [8, 7, 86, 81, 85], 'scores': [0.91347, 0.03779, 0.0036, 0.00117, 0.00112], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ptarmigan', 'quail']}]
 ```
 
-**备注:** 
+**备注:**
 
 * 这里`-o Global.pretrained_model="output/PPLCNet_x1_0/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
-    
+
 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
-    
+
 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
 
 
-    
+
 
 
 ## 4. 模型推理部署
 
- 
+
 
 ### 4.1 推理模型准备
 
 Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于Paddle Inference推理引擎的介绍,可以参考[Paddle Inference官网教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/infer/inference/inference_cn.html)。
-    
+
 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择[直接下载 inference 模型](#6.1.2)的方式。
 
-    
- 
+
+
 
 ### 4.1.1 基于训练得到的权重导出 inference 模型
 
@@ -446,7 +446,7 @@ python3 tools/export_model.py \
 ```
 
 
- 
+
 
 ### 4.1.2 直接下载 inference 模型
 
@@ -467,7 +467,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/PPLCNet
 │   └── inference.pdmodel
 ```
 
- 
+
 
 ### 4.2 基于 Python 预测引擎推理
 
@@ -518,37 +518,37 @@ ILSVRC2012_val_00030010.jpeg:	class id(s): [80, 23, 93, 81, 99], score(s): [0.87
 ```
 
 
- 
+
 
 ### 4.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
- 
+
 
 ### 4.4 服务化部署
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
-    
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
 
- 
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
+
+
 
 ### 4.5 端侧部署
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
-    
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
 
- 
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
+
+
 
 ### 4.6 Paddle2ONNX 模型转换与预测
-    
+
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
 PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](@shuilong)来完成相应的部署工作。
 
-  
+
 
 
 ## 5. 引用
@@ -556,7 +556,7 @@ PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模
 如果你的论文用到了 PP-LCNet 的方法,请添加如下 cite:
 ```
 @misc{cui2021pplcnet,
-      title={PP-LCNet: A Lightweight CPU Convolutional Neural Network}, 
+      title={PP-LCNet: A Lightweight CPU Convolutional Neural Network},
       author={Cheng Cui and Tingquan Gao and Shengyu Wei and Yuning Du and Ruoyu Guo and Shuilong Dong and Bin Lu and Ying Zhou and Xueying Lv and Qiwen Liu and Xiaoguang Hu and Dianhai Yu and Yanjun Ma},
       year={2021},
       eprint={2109.15099},
diff --git a/docs/zh_CN/models/PP-LCNetV2.md b/docs/zh_CN/models/ImageNet1k/PP-LCNetV2.md
similarity index 92%
rename from docs/zh_CN/models/PP-LCNetV2.md
rename to docs/zh_CN/models/ImageNet1k/PP-LCNetV2.md
index 5cb2bfe9a7160bae68fcb72c6e9575a14363a229..75c27cef94fb2ff2d9dc0e80f13f13431da9b4cc 100644
--- a/docs/zh_CN/models/PP-LCNetV2.md
+++ b/docs/zh_CN/models/ImageNet1k/PP-LCNetV2.md
@@ -43,13 +43,13 @@
 
 ### 1.1 模型简介
 
-骨干网络对计算机视觉下游任务的影响不言而喻,不仅对下游模型的性能影响很大,而且模型效率也极大地受此影响,但现有的大多骨干网络在真实应用中的效率并不理想,特别是缺乏针对 Intel CPU 平台所优化的骨干网络,我们测试了现有的主流轻量级模型,发现在 Intel CPU 平台上的效率并不理想,然而目前 Intel CPU 平台在工业界仍有大量使用场景,因此我们提出了 PP-LCNet 系列模型,PP-LCNetV2 是在 [PP-LCNetV1](./PP-LCNet.md) 基础上所改进的。
+骨干网络对计算机视觉下游任务的影响不言而喻,不仅对下游模型的性能影响很大,而且模型效率也极大地受此影响,但现有的大多骨干网络在真实应用中的效率并不理想,特别是缺乏针对 Intel CPU 平台所优化的骨干网络,我们测试了现有的主流轻量级模型,发现在 Intel CPU 平台上的效率并不理想,然而目前 Intel CPU 平台在工业界仍有大量使用场景,因此我们提出了 PP-LCNet 系列模型,PP-LCNetV2 是在 [PP-LCNetV1](PP-LCNet.md) 基础上所改进的。
 
 
 
 ## 1.2 模型细节
 
-
+
 
 PP-LCNetV2 模型的网络整体结构如上图所示。PP-LCNetV2 模型是在 PP-LCNetV1 的基础上优化而来,主要使用重参数化策略组合了不同大小卷积核的深度卷积,并优化了点卷积、Shortcut等。
 
@@ -59,7 +59,7 @@ PP-LCNetV2 模型的网络整体结构如上图所示。PP-LCNetV2 模型是在
 
 卷积核的大小决定了卷积层感受野的大小,通过组合使用不同大小的卷积核,能够获取不同尺度的特征,因此 PPLCNetV2 在 Stage4、Stage5 中,在同一层组合使用 kernel size 分别为 5、3、1 的 DW 卷积,同时为了避免对模型效率的影响,使用重参数化(Re parameterization,Rep)策略对同层的 DW 卷积进行融合,如下图所示。
 
-
+
 
 
 
@@ -67,7 +67,7 @@ PP-LCNetV2 模型的网络整体结构如上图所示。PP-LCNetV2 模型是在
 
 深度可分离卷积通常由一层 DW 卷积和一层 PW 卷积组成,用以替换标准卷积,为了使深度可分离卷积具有更强的拟合能力,我们尝试使用两层 PW 卷积,同时为了控制模型效率不受影响,两层 PW 卷积设置为:第一个在通道维度对特征图压缩,第二个再通过放大还原特征图通道,如下图所示。通过实验发现,该策略能够显著提高模型性能,同时为了平衡对模型效率带来的影响,PPLCNetV2 仅在 Stage4 中使用了该策略。
 
-
+
 
 
 
@@ -75,7 +75,7 @@ PP-LCNetV2 模型的网络整体结构如上图所示。PP-LCNetV2 模型是在
 
 残差结构(residual)自提出以来,被诸多模型广泛使用,但在轻量级卷积神经网络中,由于残差结构所带来的元素级(element-wise)加法操作,会对模型的速度造成影响,我们在 PP-LCNetV2 中,以 Stage 为单位实验了残差结构对模型的影响,发现残差结构的使用并非一定会带来性能的提高,因此 PPLCNetV2 仅在最后一个 Stage 中的使用了残差结构:在 Block 中增加 Shortcut,如下图所示。
 
-
+
 
 
 
@@ -102,7 +102,7 @@ PPLCNetV2 目前提供的模型的精度、速度指标及预训练权重链接
 
 **备注:**
 
-* 1. `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../advanced_tutorials/knowledge_distillation.md)。
+* 1. `_ssld` 表示使用 `SSLD 蒸馏`后的模型。关于 `SSLD蒸馏` 的内容,详情 [SSLD 蒸馏](../../training/advanced/knowledge_distillation.md)。
 * 2. PP-LCNetV2 更多模型指标及权重,敬请期待。
 
 在不使用额外数据的前提下,PPLCNetV2_base 模型在图像分类 ImageNet 数据集上能够取得超过 77% 的 Top1 Acc,同时在 Intel CPU 平台的推理时间在 4.4 ms 以下,如下表所示,其中推理时间基于 Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz 硬件平台,OpenVINO 推理平台。
@@ -169,7 +169,7 @@ Predict complete
 ```python
 from paddleclas import PaddleClas
 clas = PaddleClas(model_name='PPLCNetV2_base')
-infer_imgs='docs/images/inference_deployment/whl_demo.jpg'
+infer_imgs='docs/images/deployment/whl_demo.jpg'
 result=clas.predict(infer_imgs)
 print(next(result))
 ```
@@ -191,7 +191,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档[环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档[环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -225,7 +225,7 @@ cd path_to_PaddleClas
 
 **备注:**
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
 
@@ -401,7 +401,7 @@ ILSVRC2012_val_00030010.jpeg:	class id(s): [80, 143, 81, 137, 98], score(s): [0.
 
 ### 4.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -409,7 +409,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -417,7 +417,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -425,4 +425,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/models/PVTV2.md b/docs/zh_CN/models/ImageNet1k/PVTV2.md
similarity index 100%
rename from docs/zh_CN/models/PVTV2.md
rename to docs/zh_CN/models/ImageNet1k/PVTV2.md
diff --git a/docs/zh_CN/models/ImageNet1k/README.md b/docs/zh_CN/models/ImageNet1k/README.md
new file mode 120000
index 0000000000000000000000000000000000000000..068a5873fdad63f32e3d2acf65b8f81a29464291
--- /dev/null
+++ b/docs/zh_CN/models/ImageNet1k/README.md
@@ -0,0 +1 @@
+model_list.md
\ No newline at end of file
diff --git a/docs/zh_CN/models/ReXNet.md b/docs/zh_CN/models/ImageNet1k/ReXNet.md
similarity index 100%
rename from docs/zh_CN/models/ReXNet.md
rename to docs/zh_CN/models/ImageNet1k/ReXNet.md
diff --git a/docs/zh_CN/models/RedNet.md b/docs/zh_CN/models/ImageNet1k/RedNet.md
similarity index 97%
rename from docs/zh_CN/models/RedNet.md
rename to docs/zh_CN/models/ImageNet1k/RedNet.md
index 2f750608514daab26c30ba627d5c10cd8d5ea3a9..bc6a367ade376e220f4c2602ecaf73b2f1681697 100644
--- a/docs/zh_CN/models/RedNet.md
+++ b/docs/zh_CN/models/ImageNet1k/RedNet.md
@@ -32,4 +32,4 @@
 | RedNet38  | 224       | 256               | 6.24             | 21.39            | 41.26             |
 | RedNet50  | 224       | 256               | 8.04             | 27.71            | 53.73             |
 | RedNet101 | 224       | 256               | 13.07            | 44.12            | 83.28             |
-| RedNet152 | 224       | 256               | 18.66            | 63.27            | 119.48            |
\ No newline at end of file
+| RedNet152 | 224       | 256               | 18.66            | 63.27            | 119.48            |
diff --git a/docs/zh_CN/models/RepVGG.md b/docs/zh_CN/models/ImageNet1k/RepVGG.md
similarity index 100%
rename from docs/zh_CN/models/RepVGG.md
rename to docs/zh_CN/models/ImageNet1k/RepVGG.md
diff --git a/docs/zh_CN/models/ResNeSt_RegNet.md b/docs/zh_CN/models/ImageNet1k/ResNeSt_RegNet.md
similarity index 100%
rename from docs/zh_CN/models/ResNeSt_RegNet.md
rename to docs/zh_CN/models/ImageNet1k/ResNeSt_RegNet.md
diff --git a/docs/zh_CN/models/ResNet.md b/docs/zh_CN/models/ImageNet1k/ResNet.md
similarity index 93%
rename from docs/zh_CN/models/ResNet.md
rename to docs/zh_CN/models/ImageNet1k/ResNet.md
index 7a3f4f6335cab1fff2a4e46555af5e1461c41429..e559bdd6b8ba3f150b990c3ad1ff4d6168b997b5 100644
--- a/docs/zh_CN/models/ResNet.md
+++ b/docs/zh_CN/models/ImageNet1k/ResNet.md
@@ -126,12 +126,12 @@ PaddleClas 提供的 ResNet 系列的模型包括 ResNet50,ResNet50_vd,ResNe
 
 **备注:** 推理过程使用 TensorRT。
 
-   
-    
+  
+
 ## 2. 模型快速体验
 
-   
-    
+  
+
 ### 2.1 安装 paddlepaddle
 
 - 您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
@@ -157,31 +157,31 @@ python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
 ```  
 pip3 install paddleclas
 ```
- 
-    
+
+
 ### 2.3 预测
 
 * 在命令行中使用 ResNet50 的权重快速预测
-    
+
 ```bash
 paddleclas --model_name=ResNet50  --infer_imgs="docs/images/inference_deployment/whl_demo.jpg"
 ```
-    
+
 结果如下:
 ```
 >>> result
 class_ids: [8, 7, 86, 82, 80], scores: [0.97968, 0.02028, 3e-05, 1e-05, 0.0], label_names: ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'black grouse'], filename: docs/images/inference_deployment/whl_demo.jpg
 Predict complete!
 ```
-    
-**备注**: 更换 ResNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `ResNet18` 时,只需要将 `--model_name=ResNet50` 改为 `--model_name=ResNet18` 即可。   
 
-    
+**备注**: 更换 ResNet 的其他 scale 的模型时,只需替换 `model_name`,如将此时的模型改为 `ResNet18` 时,只需要将 `--model_name=ResNet50` 改为 `--model_name=ResNet18` 即可。  
+
+
 * 在 Python 代码中预测
 ```python
 from paddleclas import PaddleClas
 clas = PaddleClas(model_name='ResNet50')
-infer_imgs = 'docs/images/inference_deployment/whl_demo.jpg'
+infer_imgs = 'docs/images/deployment/whl_demo.jpg'
 result = clas.predict(infer_imgs)
 print(next(result))
 ```
@@ -195,17 +195,17 @@ print(next(result))
 ```
 
 
- 
-    
+
+
 ## 3. 模型训练、评估和预测
-    
+
   
 
 ### 3.1 环境配置
 
-* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../../installation.md) 配置 PaddleClas 运行环境。
 
- 
+
 
 ### 3.2 数据准备
 
@@ -234,15 +234,15 @@ cd path_to_PaddleClas
 ```
 
 其中 `train/` 和 `val/` 分别为训练集和验证集。`train_list.txt` 和 `val_list.txt` 分别为训练集和验证集的标签文件。
-    
-**备注:** 
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+**备注:**
+
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
- 
+
 
-### 3.3 模型训练 
+### 3.3 模型训练
 
 
 在 `ppcls/configs/ImageNet/ResNet/ResNet50.yaml` 中提供了 ResNet50 训练配置,可以通过如下脚本启动训练:
@@ -252,11 +252,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
 python3 -m paddle.distributed.launch \
     --gpus="0,1,2,3" \
     tools/train.py \
-        -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml 
+        -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml
 ```
 
 
-**备注:** 
+**备注:**
 
 * 当前精度最佳的模型会保存在 `output/ResNet50/best_model.pdparams`
 
@@ -283,7 +283,7 @@ python3 tools/eval.py \
 ```python
 python3 tools/infer.py \
     -c ppcls/configs/ImageNet/ResNet/ResNet50.yaml \
-    -o Global.pretrained_model=output/ResNet50/best_model 
+    -o Global.pretrained_model=output/ResNet50/best_model
 ```
 
 输出结果如下:
@@ -292,30 +292,30 @@ python3 tools/infer.py \
 [{'class_ids': [8, 7, 86, 82, 80], 'scores': [0.97968, 0.02028, 3e-05, 1e-05, 0.0], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'black grouse']}]
 ```
 
-**备注:** 
+**备注:**
 
 * 这里`-o Global.pretrained_model="output/ResNet50/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
-    
+
 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
-    
+
 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
 
 
-    
+
 
 
 ## 4. 模型推理部署
 
- 
+
 
 ### 4.1 推理模型准备
 
 Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于Paddle Inference推理引擎的介绍,可以参考[Paddle Inference官网教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/infer/inference/inference_cn.html)。
-    
+
 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择[直接下载 inference 模型](#6.1.2)的方式。
 
-    
- 
+
+
 
 ### 4.1.1 基于训练得到的权重导出 inference 模型
 
@@ -337,7 +337,7 @@ python3 tools/export_model.py \
 ```
 
 
- 
+
 
 ### 4.1.2 直接下载 inference 模型
 
@@ -358,7 +358,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet5
 │   └── inference.pdmodel
 ```
 
- 
+
 
 ### 4.2 基于 Python 预测引擎推理
 
@@ -409,32 +409,32 @@ ILSVRC2012_val_00030010.jpeg:	class id(s): [80, 23, 83, 93, 136], score(s): [1.0
 ```
 
 
- 
+
 
 ### 4.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
- 
+
 
 ### 4.4 服务化部署
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
-    
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
 
- 
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
+
+
 
 ### 4.5 端侧部署
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
-    
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
 
- 
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
+
+
 
 ### 4.6 Paddle2ONNX 模型转换与预测
-    
+
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
 PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](@shuilong)来完成相应的部署工作。
diff --git a/docs/zh_CN/models/ResNet_and_vd.md b/docs/zh_CN/models/ImageNet1k/ResNet_and_vd.md
similarity index 97%
rename from docs/zh_CN/models/ResNet_and_vd.md
rename to docs/zh_CN/models/ImageNet1k/ResNet_and_vd.md
index 3e8e600467c48d51f25a86c25c950c8ae47928c1..512ec68ed83ebbf348ebc0dedca8bddfb0056e58 100644
--- a/docs/zh_CN/models/ResNet_and_vd.md
+++ b/docs/zh_CN/models/ImageNet1k/ResNet_and_vd.md
@@ -21,13 +21,13 @@ ResNet 系列模型是在 2015 年提出的,一举在 ILSVRC2015 比赛中取
 
 该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
 
-
+
 
-
+
 
-
+
 
-
+
 
 
 通过上述曲线可以看出,层数越多,准确率越高,但是相应的参数量、计算量和延时都会增加。ResNet50_vd_ssld 通过用更强的 teacher 和更多的数据,将其在 ImageNet-1k 上的验证集 top-1 精度进一步提高,达到了 82.39%,刷新了 ResNet50 系列模型的精度。
diff --git a/docs/zh_CN/models/SEResNext_and_Res2Net.md b/docs/zh_CN/models/ImageNet1k/SEResNext_and_Res2Net.md
similarity index 98%
rename from docs/zh_CN/models/SEResNext_and_Res2Net.md
rename to docs/zh_CN/models/ImageNet1k/SEResNext_and_Res2Net.md
index 30fac650aae367bb9a0cae7428e36af2c05f994d..1b0a7c35d82abd9ea69dd11ba9582b26b777574d 100644
--- a/docs/zh_CN/models/SEResNext_and_Res2Net.md
+++ b/docs/zh_CN/models/ImageNet1k/SEResNext_and_Res2Net.md
@@ -20,13 +20,13 @@ Res2Net 是 2019 年提出的一种全新的对 ResNet 的改进方案,该方
 该系列模型的 FLOPS、参数量以及 T4 GPU 上的预测耗时如下图所示。
 
 
-
+
 
-
+
 
-
+
 
-
+
 
 
 目前 PaddleClas 开源的这三类的预训练模型一共有 24 个,其指标如图所示,从图中可以看出,在同样 Flops 和 Params 下,改进版的模型往往有更高的精度,但是推理速度往往不如 ResNet 系列。另一方面,Res2Net 表现也较为优秀,相比 ResNeXt 中的 group 操作、SEResNet 中的 SE 结构操作,Res2Net 在相同 Flops、Params 和推理速度下往往精度更佳。
diff --git a/docs/zh_CN/models/SwinTransformer.md b/docs/zh_CN/models/ImageNet1k/SwinTransformer.md
similarity index 89%
rename from docs/zh_CN/models/SwinTransformer.md
rename to docs/zh_CN/models/ImageNet1k/SwinTransformer.md
index 1cdd4675d8a3a329824e516455a9a5fda670070d..c64184a6d76a62fc690d28b4517d42f3c700a3c8 100644
--- a/docs/zh_CN/models/SwinTransformer.md
+++ b/docs/zh_CN/models/ImageNet1k/SwinTransformer.md
@@ -70,14 +70,14 @@ Swin Transformer 是一种新的视觉 Transformer 网络,可以用作计算
 
 ## 2. 模型快速体验
 
-安装 paddlepaddle 和 paddleclas 即可快速对图片进行预测,体验方法可以参考[ResNet50 模型快速体验](./ResNet.md#2-模型快速体验)。
+安装 paddlepaddle 和 paddleclas 即可快速对图片进行预测,体验方法可以参考[ResNet50 模型快速体验](./ResNet.md#2)。
 
 
 
 ## 3. 模型训练、评估和预测
 
 
-此部分内容包括训练环境配置、ImageNet数据的准备、SwinTransformer 在 ImageNet 上的训练、评估、预测等内容。在 `ppcls/configs/ImageNet/SwinTransformer/` 中提供了 SwinTransformer 的训练配置,可以通过如下脚本启动训练:此部分内容可以参考[ResNet50 模型训练、评估和预测](./ResNet.md#3-模型训练评估和预测)。
+此部分内容包括训练环境配置、ImageNet数据的准备、SwinTransformer 在 ImageNet 上的训练、评估、预测等内容。在 `ppcls/configs/ImageNet/SwinTransformer/` 中提供了 SwinTransformer 的训练配置,可以通过如下脚本启动训练:此部分内容可以参考[ResNet50 模型训练、评估和预测](./ResNet.md#3)。
 
 **备注:** 由于 SwinTransformer 系列模型默认使用的 GPU 数量为 8 个,所以在训练时,需要指定8个GPU,如`python3 -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" tools/train.py -c xxx.yaml`, 如果使用 4 个 GPU 训练,默认学习率需要减小一半,精度可能有损。
 
@@ -92,19 +92,19 @@ Swin Transformer 是一种新的视觉 Transformer 网络,可以用作计算
 
 Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用 MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于Paddle Inference推理引擎的介绍,可以参考[Paddle Inference官网教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/infer/inference/inference_cn.html)。
 
-Inference 的获取可以参考 [ResNet50 推理模型准备](./ResNet.md#41-推理模型准备) 。
+Inference 的获取可以参考 [ResNet50 推理模型准备](./ResNet.md#4.1) 。
 
 
 
 ### 4.2 基于 Python 预测引擎推理
 
-PaddleClas 提供了基于 python 预测引擎推理的示例。您可以参考[ResNet50 基于 Python 预测引擎推理](./ResNet.md#42-基于-python-预测引擎推理) 对 SwinTransformer 完成推理预测。
+PaddleClas 提供了基于 python 预测引擎推理的示例。您可以参考[ResNet50 基于 Python 预测引擎推理](./ResNet.md#4.2) 对 SwinTransformer 完成推理预测。
 
 
 
 ### 4.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -112,7 +112,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -120,7 +120,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
diff --git a/docs/zh_CN/models/TNT.md b/docs/zh_CN/models/ImageNet1k/TNT.md
similarity index 100%
rename from docs/zh_CN/models/TNT.md
rename to docs/zh_CN/models/ImageNet1k/TNT.md
diff --git a/docs/zh_CN/models/Twins.md b/docs/zh_CN/models/ImageNet1k/Twins.md
similarity index 100%
rename from docs/zh_CN/models/Twins.md
rename to docs/zh_CN/models/ImageNet1k/Twins.md
diff --git a/docs/zh_CN/models/ViT_and_DeiT.md b/docs/zh_CN/models/ImageNet1k/ViT_and_DeiT.md
similarity index 100%
rename from docs/zh_CN/models/ViT_and_DeiT.md
rename to docs/zh_CN/models/ImageNet1k/ViT_and_DeiT.md
diff --git a/docs/zh_CN/algorithm_introduction/ImageNet_models.md b/docs/zh_CN/models/ImageNet1k/model_list.md
similarity index 98%
rename from docs/zh_CN/algorithm_introduction/ImageNet_models.md
rename to docs/zh_CN/models/ImageNet1k/model_list.md
index dfc55c35f51a572931d697a797dfbff093c6ae56..d6d49002632b20eebcff34fd744c20f0fe067f55 100644
--- a/docs/zh_CN/algorithm_introduction/ImageNet_models.md
+++ b/docs/zh_CN/models/ImageNet1k/model_list.md
@@ -1,4 +1,4 @@
-
+
 
 
 # ImageNet 预训练模型库
@@ -49,20 +49,20 @@
 
 常见服务器端模型的精度指标与其预测耗时的变化曲线如下图所示。
 
-
+
 
 常见移动端模型的精度指标与其预测耗时的变化曲线如下图所示。
 
-
+
 
 部分VisionTransformer模型的精度指标与其预测耗时的变化曲线如下图所示.
 
-
+
 
 
 
 ## SSLD 知识蒸馏预训练模型
-基于 SSLD 知识蒸馏的预训练模型列表如下所示,更多关于 SSLD 知识蒸馏方案的介绍可以参考:[SSLD 知识蒸馏文档](./knowledge_distillation.md)。
+基于 SSLD 知识蒸馏的预训练模型列表如下所示,更多关于 SSLD 知识蒸馏方案的介绍可以参考:[SSLD 知识蒸馏文档](../../algorithm_introduction/knowledge_distillation.md)。
 
 
 
@@ -111,7 +111,7 @@
 
 ## PP-LCNet & PP-LCNetV2 系列 [[28](#ref28)]
 
-PP-LCNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[PP-LCNet 系列模型文档](../models/PP-LCNet.md),[PP-LCNetV2 系列模型文档](../models/PP-LCNetV2.md)。
+PP-LCNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[PP-LCNet 系列模型文档](PP-LCNet.md),[PP-LCNetV2 系列模型文档](PP-LCNetV2.md)。
 
 | 模型           | Top-1 Acc | Top-5 Acc | time(ms)*
bs=1 | FLOPs(M) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 |:--:|:--:|:--:|:--:|----|----|----|:--:|
@@ -137,7 +137,7 @@ PP-LCNet 系列模型的精度、速度指标如下表所示,更多关于该
 
 ## PP-HGNet 系列
 
-PP-HGNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[PP-HGNet 系列模型文档](../models/PP-HGNet.md)。
+PP-HGNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[PP-HGNet 系列模型文档](PP-HGNet.md)。
 
 | 模型  | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 | ---  | --- | --- | --- | --- | --- | --- | --- | --- | --- |
@@ -151,7 +151,7 @@ PP-HGNet 系列模型的精度、速度指标如下表所示,更多关于该
 
 ## ResNet 系列 [[1](#ref1)]
 
-ResNet 及其 Vd 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNet 及其 Vd 系列模型文档](../models/ResNet_and_vd.md)。
+ResNet 及其 Vd 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNet 及其 Vd 系列模型文档](ResNet_and_vd.md)。
 
 | 模型                  | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                              | inference模型下载地址                      |
 |---------------------|-----------|-----------|-----------------------|----------------------|----------|-----------|----------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|
@@ -175,7 +175,7 @@ ResNet 及其 Vd 系列模型的精度、速度指标如下表所示,更多关
 
 ## 移动端系列 [[3](#ref3)][[4](#ref4)][[5](#ref5)][[6](#ref6)][[23](#ref23)]
 
-移动端系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[移动端系列模型文档](../models/Mobile.md)。
+移动端系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[移动端系列模型文档](Mobile.md)。
 
 | 模型          | Top-1 Acc | Top-5 Acc | SD855 time(ms)
bs=1, thread=1 | SD855 time(ms)
bs=1, thread=2 | SD855 time(ms)
bs=1, thread=4 | FLOPs(M) | Params(M) | 模型大小(M) | 预训练模型下载地址 | inference模型下载地址 |
 |----------------------------------|-----------|-----------|------------------------|----------|-----------|---------|-----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|
@@ -224,7 +224,7 @@ ResNet 及其 Vd 系列模型的精度、速度指标如下表所示,更多关
 
 ## SEResNeXt 与 Res2Net 系列 [[7](#ref7)][[8](#ref8)][[9](#ref9)]
 
-SEResNeXt 与 Res2Net 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[SEResNeXt 与 Res2Net 系列模型文档](../models/SEResNext_and_Res2Net.md)。
+SEResNeXt 与 Res2Net 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[SEResNeXt 与 Res2Net 系列模型文档](SEResNext_and_Res2Net.md)。
 
 
 | 模型                  | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                              | inference模型下载地址               |
@@ -259,7 +259,7 @@ SEResNeXt 与 Res2Net 系列模型的精度、速度指标如下表所示,更
 
 ## DPN 与 DenseNet 系列 [[14](#ref14)][[15](#ref15)]
 
-DPN 与 DenseNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[DPN 与 DenseNet 系列模型文档](../models/DPN_DenseNet.md)。
+DPN 与 DenseNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[DPN 与 DenseNet 系列模型文档](DPN_DenseNet.md)。
 
 
 | 模型                  | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                              | inference模型下载地址 |
@@ -279,7 +279,7 @@ DPN 与 DenseNet 系列模型的精度、速度指标如下表所示,更多关
 
 ## HRNet 系列 [[13](#ref13)]
 
-HRNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[HRNet 系列模型文档](../models/HRNet.md)。
+HRNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[HRNet 系列模型文档](HRNet.md)。
 
 | 模型          | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                      | inference模型下载地址             |
 |-------------|-----------|-----------|------------------|------------------|----------|-----------|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
@@ -298,7 +298,7 @@ HRNet 系列模型的精度、速度指标如下表所示,更多关于该系
 
 ## Inception 系列 [[10](#ref10)][[11](#ref11)][[12](#ref12)][[26](#ref26)]
 
-Inception 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[Inception 系列模型文档](../models/Inception.md)。
+Inception 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[Inception 系列模型文档](Inception.md)。
 
 | 模型                  | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                              | inference模型下载地址                     |
 |--------------------|-----------|-----------|-----------------------|----------------------|----------|-----------|---------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
@@ -315,7 +315,7 @@ Inception 系列模型的精度、速度指标如下表所示,更多关于该
 
 ## EfficientNet 与 ResNeXt101_wsl 系列 [[16](#ref16)][[17](#ref17)]
 
-EfficientNet 与 ResNeXt101_wsl 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[EfficientNet 与 ResNeXt101_wsl 系列模型文档](../models/EfficientNet_and_ResNeXt101_wsl.md)。
+EfficientNet 与 ResNeXt101_wsl 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[EfficientNet 与 ResNeXt101_wsl 系列模型文档](EfficientNet_and_ResNeXt101_wsl.md)。
 
 | 模型                        | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                                    | inference模型下载地址                           |
 |---------------------------|-----------|-----------|------------------|------------------|----------|-----------|----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|
@@ -338,7 +338,7 @@ EfficientNet 与 ResNeXt101_wsl 系列模型的精度、速度指标如下表所
 
 ## ResNeSt 与 RegNet 系列 [[24](#ref24)][[25](#ref25)]
 
-ResNeSt 与 RegNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNeSt 与 RegNet 系列模型文档](../models/ResNeSt_RegNet.md)。
+ResNeSt 与 RegNet 系列模型的精度、速度指标如下表所示,更多关于该系列的模型介绍可以参考:[ResNeSt 与 RegNet 系列模型文档](ResNeSt_RegNet.md)。
 
 | 模型                   | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                                      | inference模型下载地址                          |
 |------------------------|-----------|-----------|------------------|------------------|----------|-----------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|
@@ -350,7 +350,7 @@ ResNeSt 与 RegNet 系列模型的精度、速度指标如下表所示,更多
 
 ## ViT_and_DeiT 系列 [[31](#ref31)][[32](#ref32)]
 
-ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模型的精度、速度指标如下表所示. 更多关于该系列模型的介绍可以参考: [ViT_and_DeiT 系列模型文档](../models/ViT_and_DeiT.md)。
+ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模型的精度、速度指标如下表所示. 更多关于该系列模型的介绍可以参考: [ViT_and_DeiT 系列模型文档](ViT_and_DeiT.md)。
 
 | 模型                  | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 |------------------------|-----------|-----------|------------------|------------------|----------|------------------------|------------------------|------------------------|------------------------|
@@ -377,7 +377,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## RepVGG 系列 [[36](#ref36)]
 
-关于 RepVGG 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RepVGG 系列模型文档](../models/RepVGG.md)。
+关于 RepVGG 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RepVGG 系列模型文档](RepVGG.md)。
 
 | 模型                     | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 |------------------------|-----------|-----------|------------------|------------------|----------|-----------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|
@@ -396,7 +396,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## MixNet 系列 [[29](#ref29)]
 
-关于 MixNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MixNet 系列模型文档](../models/MixNet.md)。
+关于 MixNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MixNet 系列模型文档](MixNet.md)。
 
 | 模型     | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(M) | Params(M) | 预训练模型下载地址                                           | inference模型下载地址                                        |
 | -------- | --------- | --------- | ---------------- | ---------------- | ----------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -408,7 +408,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## ReXNet 系列 [[30](#ref30)]
 
-关于 ReXNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[ReXNet 系列模型文档](../models/ReXNet.md)。
+关于 ReXNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[ReXNet 系列模型文档](ReXNet.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -422,7 +422,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## SwinTransformer 系列 [[27](#ref27)]
 
-关于 SwinTransformer 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[SwinTransformer 系列模型文档](../models/SwinTransformer.md)。
+关于 SwinTransformer 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[SwinTransformer 系列模型文档](SwinTransformer.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                                               | inference模型下载地址                                      |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -441,7 +441,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## LeViT 系列 [[33](#ref33)]
 
-关于 LeViT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[LeViT 系列模型文档](../models/LeViT.md)。
+关于 LeViT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[LeViT 系列模型文档](LeViT.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(M) | Params(M) | 预训练模型下载地址                                               | inference模型下载地址                                      |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -457,7 +457,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## Twins 系列 [[34](#ref34)]
 
-关于 Twins 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[Twins 系列模型文档](../models/Twins.md)。
+关于 Twins 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[Twins 系列模型文档](Twins.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                                               | inference模型下载地址                                      |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -474,7 +474,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## HarDNet 系列 [[37](#ref37)]
 
-关于 HarDNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[HarDNet 系列模型文档](../models/HarDNet.md)。
+关于 HarDNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[HarDNet 系列模型文档](HarDNet.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -487,7 +487,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## DLA 系列 [[38](#ref38)]
 
-关于 DLA 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[DLA 系列模型文档](../models/DLA.md)。
+关于 DLA 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[DLA 系列模型文档](DLA.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -505,7 +505,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## RedNet 系列 [[39](#ref39)]
 
-关于 RedNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RedNet 系列模型文档](../models/RedNet.md)。
+关于 RedNet 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[RedNet 系列模型文档](RedNet.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -519,7 +519,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## TNT 系列 [[35](#ref35)]
 
-关于 TNT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[TNT 系列模型文档](../models/TNT.md)。
+关于 TNT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[TNT 系列模型文档](TNT.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | FLOPs(G) | Params(M) | 预训练模型下载地址                                               | inference模型下载地址                                      |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -531,7 +531,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## CSWinTransformer 系列 [[40](#ref40)]
 
-关于 CSWinTransformer 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[CSWinTransformer 系列模型文档](../models/CSWinTransformer.md)。
+关于 CSWinTransformer 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[CSWinTransformer 系列模型文档](CSWinTransformer.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                                               | inference模型下载地址                                      |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -547,7 +547,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## PVTV2 系列 [[41](#ref41)]
 
-关于 PVTV2 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[PVTV2 系列模型文档](../models/PVTV2.md)。
+关于 PVTV2 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[PVTV2 系列模型文档](PVTV2.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址                                               | inference模型下载地址                                      |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -564,7 +564,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## MobileViT 系列 [[42](#ref42)]
 
-关于 MobileViT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MobileViT 系列模型文档](../models/MobileViT.md)。
+关于 MobileViT 系列模型的精度、速度指标如下表所示,更多介绍可以参考:[MobileViT 系列模型文档](MobileViT.md)。
 
 | 模型       | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(M) | Params(M) | 预训练模型下载地址                                               | inference模型下载地址                                      |
 | ---------- | --------- | --------- | ---------------- | ---------------- | -------- | --------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
@@ -576,7 +576,7 @@ ViT(Vision Transformer) 与 DeiT(Data-efficient Image Transformers)系列模
 
 ## 其他模型
 
-关于 AlexNet [[18](#ref18)]、SqueezeNet 系列 [[19](#ref19)]、VGG 系列 [[20](#ref20)]、DarkNet53 [[21](#ref21)] 等模型的精度、速度指标如下表所示,更多介绍可以参考:[其他模型文档](../models/Others.md)。
+关于 AlexNet [[18](#ref18)]、SqueezeNet 系列 [[19](#ref19)]、VGG 系列 [[20](#ref20)]、DarkNet53 [[21](#ref21)] 等模型的精度、速度指标如下表所示,更多介绍可以参考:[其他模型文档](Others.md)。
 
 | 模型                     | Top-1 Acc | Top-5 Acc | time(ms)
bs=1 | time(ms)
bs=4 | time(ms)
bs=8 | FLOPs(G) | Params(M) | 预训练模型下载地址 | inference模型下载地址 |
 |------------------------|-----------|-----------|------------------|------------------|----------|-----------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|
diff --git a/docs/zh_CN/others/paddle_mobile_inference.md b/docs/zh_CN/models/ImageNet1k/paddle_lite_benchmark.md
similarity index 95%
rename from docs/zh_CN/others/paddle_mobile_inference.md
rename to docs/zh_CN/models/ImageNet1k/paddle_lite_benchmark.md
index 6cdb19ad4a0bff319e60d378fae6e61a1208bc9c..f5e26402bcfb7ecb482f7046e8c356c7de9e9472 100644
--- a/docs/zh_CN/others/paddle_mobile_inference.md
+++ b/docs/zh_CN/models/ImageNet1k/paddle_lite_benchmark.md
@@ -15,7 +15,7 @@
 
 [Paddle-Lite](https://github.com/PaddlePaddle/Paddle-Lite) 是飞桨推出的一套功能完善、易用性强且性能卓越的轻量化推理引擎。
 轻量化体现在使用较少比特数用于表示神经网络的权重和激活,能够大大降低模型的体积,解决终端设备存储空间有限的问题,推理性能也整体优于其他框架。
-[PaddleClas](https://github.com/PaddlePaddle/PaddleClas) 使用 Paddle-Lite 进行了[移动端模型的性能评估](../models/Mobile.md),本部分以 `ImageNet1k` 数据集的 `MobileNetV1` 模型为例,介绍怎样使用 `Paddle-Lite`,在移动端(基于骁龙855的安卓开发平台)对进行模型速度评估。
+[PaddleClas](https://github.com/PaddlePaddle/PaddleClas) 使用 Paddle-Lite 进行了[移动端模型的性能评估](./Mobile.md),本部分以 `ImageNet1k` 数据集的 `MobileNetV1` 模型为例,介绍怎样使用 `Paddle-Lite`,在移动端(基于骁龙855的安卓开发平台)对进行模型速度评估。
 
 
 
diff --git a/docs/zh_CN/PPShiTu/PPShiTuV2_introduction.md b/docs/zh_CN/models/PP-ShiTu/README.md
similarity index 90%
rename from docs/zh_CN/PPShiTu/PPShiTuV2_introduction.md
rename to docs/zh_CN/models/PP-ShiTu/README.md
index bac4f8acbaf6da54e1bb15a44d151a9a37a20769..d98f1c05f7856fc224a7260e5c608a97d9bb202f 100644
--- a/docs/zh_CN/PPShiTu/PPShiTuV2_introduction.md
+++ b/docs/zh_CN/models/PP-ShiTu/README.md
@@ -40,10 +40,10 @@ PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别
 | :--------- | :---------------------- | :------------------ |
 |            |                         | recall@1            |
 | PP-ShiTuV1 | 64(30+34)MB             | 66.8%                 |
-| PP-ShiTuV2 | 49(30+19)               | 73.8%                 |
+| PP-ShiTuV2 | 49(30+19)MB               | 73.8%                 |
 
 **注:**
-- recall及mAP指标的介绍可以参考 [常用指标](../algorithm_introduction/reid.md#22-常用指标)。
+- recall及mAP指标的介绍可以参考 [常用指标](../../algorithm_introduction/ReID.md#22-常用指标)。
 - 延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。
 
 ## 2. 模型快速体验
@@ -70,10 +70,10 @@ PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别
   ```shell
   # 如果您的机器安装的是 CUDA9 或 CUDA10,请运行以下命令安装
   python3.7 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
-  
+
   # 如果您的机器是CPU,请运行以下命令安装
   python3.7 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
-  
+
   # 安装 faiss 库
   python3.7 -m pip install faiss-cpu==1.7.1post2
   ```
@@ -82,7 +82,7 @@ PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别
   ```shell
   # 进入到PaddleClas根目录下
   cd PaddleClas
-  
+
   # 安装paddleclas
   python3.7 setup.py install
   ```
@@ -92,7 +92,7 @@ PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别
   ```shell
   # 下载并解压demo数据
   wget -nc https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar && tar -xf drink_dataset_v2.0.tar
-  
+
   # 执行识别命令
   paddleclas \
   --model_name=PP-ShiTuV2 \
@@ -109,17 +109,17 @@ PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别
 
 考虑到检测速度、模型大小、检测精度等因素,最终选择 PaddleDetection 自研的轻量级模型 `PicoDet-LCNet_x2_5` 作为 PP-ShiTuV2 的主体检测模型
 
-主体检测模型的数据集、训练、评估、推理等详细信息可以参考文档:[picodet_lcnet_x2_5_640_mainbody](../image_recognition_pipeline/mainbody_detection.md)。
+主体检测模型的数据集、训练、评估、推理等详细信息可以参考文档:[picodet_lcnet_x2_5_640_mainbody](../../training/PP-ShiTu/mainbody_detection.md)。
 
 ### 3.2 特征提取
 
-特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的 [向量检索](./vector_search.md) 。考虑到特征提取模型的速度、模型大小、特征提取性能等因素,最终选择 PaddleClas 自研的 [`PPLCNetV2_base`](../models/PP-LCNetV2.md) 作为特征提取网络。相比 PP-ShiTuV1 所使用的 `PPLCNet_x2_5`, `PPLCNetV2_base` 基本保持了较高的分类精度,并减少了40%的推理时间*。
+特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的 [向量检索](./vector_search.md) 。考虑到特征提取模型的速度、模型大小、特征提取性能等因素,最终选择 PaddleClas 自研的 [`PPLCNetV2_base`](../ImageNet1k/PP-LCNetV2.md) 作为特征提取网络。相比 PP-ShiTuV1 所使用的 `PPLCNet_x2_5`, `PPLCNetV2_base` 基本保持了较高的分类精度,并减少了40%的推理时间*。
 
 **注:** *推理环境基于 Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz 硬件平台,OpenVINO 推理平台。
 
 在实验过程中我们也发现可以对 `PPLCNetV2_base` 进行适当的改进,在保持速度基本不变的情况下,让其在识别任务中得到更高的性能,包括:去掉 `PPLCNetV2_base` 末尾的 `ReLU` 和 `FC`、将最后一个 stage(RepDepthwiseSeparable) 的 stride 改为1。
 
-特征提取模型的数据集、训练、评估、推理等详细信息可以参考文档:[PPLCNetV2_base_ShiTu](../image_recognition_pipeline/feature_extraction.md)。
+特征提取模型的数据集、训练、评估、推理等详细信息可以参考文档:[PPLCNetV2_base_ShiTu](../../training/PP-ShiTu/feature_extraction.md)。
 
 ### 3.3 向量检索
 
@@ -127,7 +127,7 @@ PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别
 
 在 PP-ShiTuV2 识别系统中,我们使用了 [Faiss](https://github.com/facebookresearch/faiss) 向量检索开源库对此部分进行支持,其具有适配性好、安装方便、算法丰富、同时支持CPU与GPU的优点。
 
-PP-ShiTuV2 系统中关于 Faiss 向量检索库的安装及使用可以参考文档:[vector search](../image_recognition_pipeline/vector_search.md)。
+PP-ShiTuV2 系统中关于 Faiss 向量检索库的安装及使用可以参考文档:[vector search](../../deployment/PP-ShiTu/vector_search.md)。
 
 ## 4. 推理部署
 
@@ -137,7 +137,7 @@ Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端
 当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择 [直接下载 inference 模型](#412-直接下载-inference-模型) 的方式。
 
 #### 4.1.1 基于训练得到的权重导出 inference 模型
-- 主体检测模型权重导出请参考文档 [主体检测推理模型准备](../image_recognition_pipeline/mainbody_detection.md#41-推理模型准备),或者参照 [4.1.2](#412-直接下载-inference-模型) 直接下载解压即可。
+- 主体检测模型权重导出请参考文档 [主体检测推理模型准备](../../training/PP-ShiTu/mainbody_detection.md#41-推理模型准备),或者参照 [4.1.2](#412-直接下载-inference-模型) 直接下载解压即可。
 
 - 特征提取模型权重导出可以参考以下命令:
   ```shell
@@ -234,12 +234,12 @@ Inference: 37.95266151428223 ms per batch image
 其中 `bbox` 表示检测出的主体所在位置,`rec_docs` 表示索引库中与检测框最为相似的类别,`rec_scores` 表示对应的相似度。
 
 ### 4.4 基于 C++ 预测引擎推理
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考 [服务器端 C++ 预测](../../../deploy/cpp_shitu/readme.md) 来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考 [基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md) 完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考 [服务器端 C++ 预测](../../../../deploy/cpp_shitu/readme.md) 来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考 [基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md) 完成相应的预测库编译和模型预测工作。
 
 ### 4.5 服务化部署
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考 [Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考 [模型服务化部署](../inference_deployment/recognition_serving_deploy.md) 来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考 [模型服务化部署](../../deployment/PP-ShiTu/paddle_serving.md) 来完成相应的部署工作。
 
 ### 4.6 端侧部署
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考 [Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
@@ -247,7 +247,7 @@ Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深
 ### 4.7 Paddle2ONNX 模型转换与预测
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考 [Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考 [Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md) 来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考 [Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md) 来完成相应的部署工作。
 
 ## 参考文献
 1. Schall, Konstantin, et al. "GPR1200: A Benchmark for General-Purpose Content-Based Image Retrieval." International Conference on Multimedia Modeling. Springer, Cham, 2022.
diff --git a/docs/zh_CN/PULC/PULC_car_exists.md b/docs/zh_CN/models/PULC/PULC_car_exists.md
similarity index 93%
rename from docs/zh_CN/PULC/PULC_car_exists.md
rename to docs/zh_CN/models/PULC/PULC_car_exists.md
index 4107363534f9c76508d660ffb7d69dc705076a1a..cd7dacc3e9e1fb94ae40c83fa647ad91c4651781 100644
--- a/docs/zh_CN/PULC/PULC_car_exists.md
+++ b/docs/zh_CN/models/PULC/PULC_car_exists.md
@@ -59,7 +59,7 @@
 **备注:**
 
 * `Tpr`指标的介绍可以参考 [3.3节](#3.3)的备注部分,延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -140,7 +140,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档[环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档[环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -166,7 +166,7 @@ print(next(result))
 
 处理后的数据集部分数据可视化如下:
 
-
+
 
 此处提供了经过上述方法处理好的数据,可以直接下载得到。
 
@@ -208,9 +208,9 @@ cd ../
 
 **备注:**
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考 [PaddleClas 分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考 [PaddleClas 分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
-* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../advanced_tutorials/ssld.md#3.2)。
+* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../../training/advanced/ssld.md#3.2)。
 
 
 
@@ -285,7 +285,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md)。
 
 
 
@@ -326,7 +326,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -443,7 +443,7 @@ objects365_00001521.jpeg:       class id(s): [0], score(s): [0.99], label_name(s
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -451,7 +451,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -459,7 +459,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -467,4 +467,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_language_classification.md b/docs/zh_CN/models/PULC/PULC_language_classification.md
similarity index 93%
rename from docs/zh_CN/PULC/PULC_language_classification.md
rename to docs/zh_CN/models/PULC/PULC_language_classification.md
index 309f3e9cc8a0c3c519722baeb13e5b90a8312e51..44b0e21bde318955ee97c67467af850007d29e71 100644
--- a/docs/zh_CN/PULC/PULC_language_classification.md
+++ b/docs/zh_CN/models/PULC/PULC_language_classification.md
@@ -53,7 +53,7 @@
 
 **备注:**
 
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -133,7 +133,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -145,7 +145,7 @@ print(next(result))
 
 [第1节](#1)中提供的模型使用内部数据训练得到,该数据集暂时不方便公开。这里基于 [Multi-lingual scene text detection and recognition](https://rrc.cvc.uab.es/?ch=15&com=downloads) 开源数据集构造了一个多语种demo数据集,用于体验本案例的预测过程。
 
-
+
 
 
 
@@ -198,7 +198,7 @@ cd ../
 ***备注:***
 
 -  这里的`label_list.txt`是4类语种分类模型对应的类别列表,如果自己构造的数据集语种类别发生变化,需要自行调整。
--  如果想要自己构造训练集和验证集,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+-  如果想要自己构造训练集和验证集,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
 
@@ -265,7 +265,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md)。
 
 
 
@@ -309,7 +309,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -426,7 +426,7 @@ word_35404.png:    class id(s): [4, 6], score(s): [0.89, 0.01], label_name(s): [
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -434,7 +434,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -442,7 +442,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -450,4 +450,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_person_attribute.md b/docs/zh_CN/models/PULC/PULC_person_attribute.md
similarity index 89%
rename from docs/zh_CN/PULC/PULC_person_attribute.md
rename to docs/zh_CN/models/PULC/PULC_person_attribute.md
index b6d833a9df9898b9e2d01746e520b0c386376e8d..2354f353fde67a8eaa66162761b084270600a6eb 100644
--- a/docs/zh_CN/PULC/PULC_person_attribute.md
+++ b/docs/zh_CN/models/PULC/PULC_person_attribute.md
@@ -60,7 +60,7 @@
 **备注:**
 
 * 延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -132,6 +132,26 @@ print(next(result))
 [{'attributes': ['Male', 'Age18-60', 'Back', 'Glasses: False', 'Hat: False', 'HoldObjectsInFront: False', 'Backpack', 'Upper: LongSleeve UpperPlaid', 'Lower:  Trousers', 'No boots'], 'output': [0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1], 'filename': 'pulc_demo_imgs/person_attribute/090004.jpg'}]
 ```
 
+**备注**:其中 `output` 的值索引为0表示是否佩戴帽子,索引值为1表示是否佩戴眼镜,索引值2-7表示上衣风格,索引值8-13表示下装风格,索引值14表示是否穿靴子,索引值15-17表示背的包的类型,索引值18表示正面是否持物,索引值19-21表示年龄,索引值22表示性别,索引值23-25表示朝向。详情可以查看[代码](../../../../ppcls/data/postprocess/attr_rec.py#L84)。具体地,属性包含以下类型:
+
+```
+- 性别:男、女
+- 年龄:小于18、18-60、大于60
+- 朝向:朝前、朝后、侧面
+- 配饰:眼镜、帽子、无
+- 正面持物:是、否
+- 包:双肩包、单肩包、手提包
+- 上衣风格:带条纹、带logo、带格子、拼接风格
+- 下装风格:带条纹、带图案
+- 短袖上衣:是、否
+- 长袖上衣:是、否
+- 长外套:是、否
+- 长裤:是、否
+- 短裤:是、否
+- 短裙&裙子:是、否
+- 穿靴:是、否
+```
+
 
 
 ## 3. 模型训练、评估和预测
@@ -140,7 +160,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -273,7 +293,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md)。
 
 
 
@@ -314,7 +334,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -426,7 +446,7 @@ python3.7 python/predict_cls.py -c configs/PULC/person_attribute/inference_perso
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -434,7 +454,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -442,7 +462,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -450,4 +470,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_person_exists.md b/docs/zh_CN/models/PULC/PULC_person_exists.md
similarity index 93%
rename from docs/zh_CN/PULC/PULC_person_exists.md
rename to docs/zh_CN/models/PULC/PULC_person_exists.md
index b3b830a893a4648645beab3a447ec8d894a5da4c..0775cfcbaffbeae3abec166eace43fe0e5a3bf97 100644
--- a/docs/zh_CN/PULC/PULC_person_exists.md
+++ b/docs/zh_CN/models/PULC/PULC_person_exists.md
@@ -59,7 +59,7 @@
 **备注:**
 
 * `Tpr`指标的介绍可以参考 [3.2 小节](#3.2)的备注部分,延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -139,7 +139,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档[环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档[环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -163,7 +163,7 @@ print(next(result))
 
 处理后的数据集部分数据可视化如下:
 
-
+
 
 此处提供了经过上述方法处理好的数据,可以直接下载得到。
 
@@ -210,9 +210,9 @@ cd ../
 
 **备注:**
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考 [PaddleClas 分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考 [PaddleClas 分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
-* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../advanced_tutorials/ssld.md#3.2)。
+* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../../training/advanced/ssld.md#3.2)。
 
 
 
@@ -287,7 +287,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md)。
 
 
 
@@ -328,7 +328,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -445,7 +445,7 @@ objects365_02035329.jpg:	class id(s): [1], score(s): [1.00], label_name(s): ['so
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -453,7 +453,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -461,7 +461,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -469,4 +469,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_safety_helmet.md b/docs/zh_CN/models/PULC/PULC_safety_helmet.md
similarity index 92%
rename from docs/zh_CN/PULC/PULC_safety_helmet.md
rename to docs/zh_CN/models/PULC/PULC_safety_helmet.md
index 0467b61b12c629ebc7a6e2a2268b4c82fe512abe..8af6a6147f3ebee0617bb334fc358d4620fabf3d 100644
--- a/docs/zh_CN/PULC/PULC_safety_helmet.md
+++ b/docs/zh_CN/models/PULC/PULC_safety_helmet.md
@@ -59,7 +59,7 @@
 
 * `Tpr`指标的介绍可以参考 [3.3小节](#3.3)的备注部分,延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启MKLDNN加速策略,线程数为10。
 
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -139,7 +139,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -165,7 +165,7 @@ print(next(result))
 
 处理后的数据集部分数据可视化如下:
 
-
+
 
 此处提供了经过上述方法处理好的数据,可以直接下载得到。
 
@@ -201,7 +201,7 @@ cd ../
 
 **备注:**
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
 
@@ -273,7 +273,7 @@ python3 tools/infer.py \
 
 ### 4.1 UDML 知识蒸馏
 
-UDML 知识蒸馏是一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[UDML 知识蒸馏](../advanced_tutorials/knowledge_distillation.md#1.2.3)。
+UDML 知识蒸馏是一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[UDML 知识蒸馏](../../training/advanced/knowledge_distillation.md#1.2.3)。
 
 
 
@@ -295,7 +295,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注**:此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -411,7 +411,7 @@ safety_helmet_test_2.png:       class id(s): [0], score(s): [1.00], label_name(s
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -419,7 +419,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -427,7 +427,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -435,4 +435,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_text_image_orientation.md b/docs/zh_CN/models/PULC/PULC_text_image_orientation.md
similarity index 92%
rename from docs/zh_CN/PULC/PULC_text_image_orientation.md
rename to docs/zh_CN/models/PULC/PULC_text_image_orientation.md
index d89396f0a0c4a67dd0990bd4e19725684b894020..92a2382f97a0bfc26cf20ecbae96d3e866157d8c 100644
--- a/docs/zh_CN/PULC/PULC_text_image_orientation.md
+++ b/docs/zh_CN/models/PULC/PULC_text_image_orientation.md
@@ -52,7 +52,7 @@
 
 **备注:**
 
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -131,7 +131,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -143,7 +143,7 @@ print(next(result))
 
 [第1节](#1)中提供的模型使用内部数据训练得到,该数据集暂时不方便公开。这里基于 [ICDAR2019-ArT](https://ai.baidu.com/broad/introduction?dataset=art)、 [XFUND](https://github.com/doc-analysis/XFUND) 和 [ICDAR2015](https://rrc.cvc.uab.es/?ch=4&com=introduction) 三个公开数据集构造了一个小规模含文字图像方向分类数据集,用于体验本案例。
 
-
+
 
 
 
@@ -155,7 +155,7 @@ print(next(result))
 
 处理后的数据集部分数据可视化如下:
 
-
+
 
 此处提供了经过上述方法处理好的数据,可以直接下载得到。
 
@@ -205,13 +205,13 @@ cd ../
 └── label_list.txt
 ```
 
-其中`img_0/`、`img_90/`、`img_180/`和`img_270/`分别存放了4个角度的训练集和验证集数据。`train_list.txt`和`test_list.txt`分别为训练集和验证集的标签文件,`train_list.txt.debug`和`test_list.txt.debug`分别为训练集和验证集的`debug`标签文件,其分别是`train_list.txt`和`test_list.txt`的子集,用该文件可以快速体验本案例的流程。`distill_data/`是补充文字数据,该集合和`train`集合的混合数据用于本案例的`SKL-UGI知识蒸馏策略`,对应的训练标签文件为`train_list_for_distill.txt`。关于如何得到蒸馏的标签可以参考[知识蒸馏标签获得](../advanced_tutorials/ssld.md#3.2)。
+其中`img_0/`、`img_90/`、`img_180/`和`img_270/`分别存放了4个角度的训练集和验证集数据。`train_list.txt`和`test_list.txt`分别为训练集和验证集的标签文件,`train_list.txt.debug`和`test_list.txt.debug`分别为训练集和验证集的`debug`标签文件,其分别是`train_list.txt`和`test_list.txt`的子集,用该文件可以快速体验本案例的流程。`distill_data/`是补充文字数据,该集合和`train`集合的混合数据用于本案例的`SKL-UGI知识蒸馏策略`,对应的训练标签文件为`train_list_for_distill.txt`。关于如何得到蒸馏的标签可以参考[知识蒸馏标签获得](../../training/advanced/ssld.md#3.2)。
 
 **备注:**
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
-* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../advanced_tutorials/ssld.md#3.2)。
+* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../../training/advanced/ssld.md#3.2)。
 
 
 
@@ -277,7 +277,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md)。
 
 
 
@@ -319,7 +319,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -433,7 +433,7 @@ img_rot180_demo.jpg:    class id(s): [2, 1], score(s): [0.88, 0.04], label_name(
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -441,7 +441,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -449,7 +449,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -457,4 +457,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_textline_orientation.md b/docs/zh_CN/models/PULC/PULC_textline_orientation.md
similarity index 92%
rename from docs/zh_CN/PULC/PULC_textline_orientation.md
rename to docs/zh_CN/models/PULC/PULC_textline_orientation.md
index eea10307532eb0a8a323a82108b0c5f9691a82f8..39eafd6bfa6dd0edd6ed84618e23ebd922772f76 100644
--- a/docs/zh_CN/PULC/PULC_textline_orientation.md
+++ b/docs/zh_CN/models/PULC/PULC_textline_orientation.md
@@ -59,9 +59,9 @@
 
 **备注:**
 
-* 其中不带\*的模型表示分辨率为224x224,带\*的模型表示分辨率为48x192(h\*w),数据增强从网络中的 stride 改为 `[2, [2, 1], [2, 1], [2, 1], [2, 1]]`,其中,外层列表中的每一个元素代表网络结构下采样层的stride,该策略为 [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR) 提供的文本行方向分类器方案。带\*\*的模型表示分辨率为80x160(h\*w), 网络中的 stride 改为 `[2, [2, 1], [2, 1], [2, 1], [2, 1]]`,其中,外层列表中的每一个元素代表网络结构下采样层的stride,此分辨率是经过[超参数搜索策略](PULC_train.md#4-超参搜索)搜索得到的。
+* 其中不带\*的模型表示分辨率为224x224,带\*的模型表示分辨率为48x192(h\*w),数据增强从网络中的 stride 改为 `[2, [2, 1], [2, 1], [2, 1], [2, 1]]`,其中,外层列表中的每一个元素代表网络结构下采样层的stride,该策略为 [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR) 提供的文本行方向分类器方案。带\*\*的模型表示分辨率为80x160(h\*w), 网络中的 stride 改为 `[2, [2, 1], [2, 1], [2, 1], [2, 1]]`,其中,外层列表中的每一个元素代表网络结构下采样层的stride,此分辨率是经过[超参数搜索策略](../../training/PULC.md#4-超参搜索)搜索得到的。
 * 延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -139,7 +139,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -165,7 +165,7 @@ print(next(result))
 
 处理后的数据集部分数据可视化如下:
 
-
+
 
 此处提供了经过上述方法处理好的数据,可以直接下载得到。
 
@@ -203,7 +203,7 @@ cd ../
 
 **备注:**
 
-* 关于 `train_list.txt`、`val_list.txt` 的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `train_list.txt`、`val_list.txt` 的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
 
@@ -273,7 +273,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md)。
 
 
 
@@ -314,7 +314,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。
 
@@ -430,7 +430,7 @@ textline_orientation_test_1_1.png:    class id(s): [1], score(s): [1.00], label_
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -438,7 +438,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -446,7 +446,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -454,4 +454,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_traffic_sign.md b/docs/zh_CN/models/PULC/PULC_traffic_sign.md
similarity index 93%
rename from docs/zh_CN/PULC/PULC_traffic_sign.md
rename to docs/zh_CN/models/PULC/PULC_traffic_sign.md
index 700cbd58b89501ec8b7fe9add5bdceb373a36936..5a838b1322f0472d13979b7fae8694838073c982 100644
--- a/docs/zh_CN/PULC/PULC_traffic_sign.md
+++ b/docs/zh_CN/models/PULC/PULC_traffic_sign.md
@@ -58,7 +58,7 @@
 
 **备注:**
 
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -138,7 +138,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -234,9 +234,9 @@ traffic_sign
 
 **备注:**
 
-* 关于 `label_list_train.txt`、`label_list_test.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `label_list_train.txt`、`label_list_test.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../../training/single_label_classification/dataset.md#1-数据集格式说明) 。
 
-* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../advanced_tutorials/ssld.md)。
+* 关于如何得到蒸馏的标签文件可以参考[知识蒸馏标签获得方法](../../training/advanced/ssld.md)。
 
 
 
@@ -303,7 +303,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md#3.2)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md#3.2)。
 
 
 
@@ -344,7 +344,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.2 节](#3.2)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -458,7 +458,7 @@ python3.7 python/predict_cls.py -c configs/PULC/traffic_sign/inference_traffic_s
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -466,7 +466,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -474,7 +474,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -482,4 +482,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/PULC/PULC_vehicle_attribute.md b/docs/zh_CN/models/PULC/PULC_vehicle_attribute.md
similarity index 91%
rename from docs/zh_CN/PULC/PULC_vehicle_attribute.md
rename to docs/zh_CN/models/PULC/PULC_vehicle_attribute.md
index 03f67321fd04e1e33be0f7829da8bfce1c2be0a8..d9a81f6249cd37e7b26335480ee78a36906a5bf5 100644
--- a/docs/zh_CN/PULC/PULC_vehicle_attribute.md
+++ b/docs/zh_CN/models/PULC/PULC_vehicle_attribute.md
@@ -60,7 +60,7 @@
 **备注:**
 
 * 延时是基于 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 测试得到,开启 MKLDNN 加速策略,线程数为10。
-* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../models/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
+* 关于PP-LCNet的介绍可以参考[PP-LCNet介绍](../ImageNet1k/PP-LCNet.md),相关论文可以查阅[PP-LCNet paper](https://arxiv.org/abs/2109.15099)。
 
 
 
@@ -132,6 +132,7 @@ print(next(result))
 [{'attributes': 'Color: (yellow, prob: 0.9893476963043213), Type: (hatchback, prob: 0.9734097719192505)', 'output': [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], 'filename': 'pulc_demo_imgs/vehicle_attribute/0002_c002_00030670_0.jpg'}]
 ```
 
+**备注**:其中 `output` 的值索引为0-9表示颜色属性,对应的颜色分别是:yellow(黄色), orange(橙色), green(绿色), gray(灰色), red(红色), blue(蓝色), white(白色), golden(金色), brown(棕色), black(黑色);索引为10-18表示车型属性,对应的车型分别是sedan(轿车), suv(越野车), van(面包车), hatchback(掀背车), mpv(多用途汽车), pickup(皮卡车), bus(公共汽车), truck(卡车), estate(旅行车)。
 
 
 
@@ -141,7 +142,7 @@ print(next(result))
 
 ### 3.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -297,7 +298,7 @@ python3 tools/infer.py \
 
 ### 4.1 SKL-UGI 知识蒸馏
 
-SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../advanced_tutorials/ssld.md)。
+SKL-UGI 知识蒸馏是 PaddleClas 提出的一种简单有效的知识蒸馏方法,关于该方法的介绍,可以参考[SKL-UGI 知识蒸馏](../../training/advanced/ssld.md)。
 
 
 
@@ -338,7 +339,7 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 超参搜索
 
-在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](PULC_train.md#4-超参搜索)来获得更好的训练超参数。
+在 [3.3 节](#3.3)和 [4.1 节](#4.1)所使用的超参数是根据 PaddleClas 提供的 `超参数搜索策略` 搜索得到的,如果希望在自己的数据集上得到更好的结果,可以参考[超参数搜索策略](../../training/PULC.md#4-超参搜索)来获得更好的训练超参数。
 
 **备注:** 此部分内容是可选内容,搜索过程需要较长的时间,您可以根据自己的硬件情况来选择执行。如果没有更换数据集,可以忽略此节内容。
 
@@ -450,7 +451,7 @@ python3.7 python/predict_cls.py -c configs/PULC/vehicle_attribute/inference_vehi
 
 ### 6.3 基于 C++ 预测引擎推理
 
-PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../inference_deployment/cpp_deploy.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../inference_deployment/cpp_deploy_on_windows.md)完成相应的预测库编译和模型预测工作。
+PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服务器端 C++ 预测](../../deployment/image_classification/cpp/linux.md)来完成相应的推理部署。如果您使用的是 Windows 平台,可以参考[基于 Visual Studio 2019 Community CMake 编译指南](../../deployment/image_classification/cpp/windows.md)完成相应的预测库编译和模型预测工作。
 
 
 
@@ -458,7 +459,7 @@ PaddleClas 提供了基于 C++ 预测引擎推理的示例,您可以参考[服
 
 Paddle Serving 提供高性能、灵活易用的工业级在线推理服务。Paddle Serving 支持 RESTful、gRPC、bRPC 等多种协议,提供多种异构硬件和多种操作系统环境下推理解决方案。更多关于Paddle Serving 的介绍,可以参考[Paddle Serving 代码仓库](https://github.com/PaddlePaddle/Serving)。
 
-PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../inference_deployment/paddle_serving_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示例,您可以参考[模型服务化部署](../../deployment/image_classification/paddle_serving.md)来完成相应的部署工作。
 
 
 
@@ -466,7 +467,7 @@ PaddleClas 提供了基于 Paddle Serving 来完成模型服务化部署的示
 
 Paddle Lite 是一个高性能、轻量级、灵活性强且易于扩展的深度学习推理框架,定位于支持包括移动端、嵌入式以及服务器端在内的多硬件平台。更多关于 Paddle Lite 的介绍,可以参考[Paddle Lite 代码仓库](https://github.com/PaddlePaddle/Paddle-Lite)。
 
-PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../inference_deployment/paddle_lite_deploy.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,您可以参考[端侧部署](../../deployment/image_classification/paddle_lite.md)来完成相应的部署工作。
 
 
 
@@ -474,4 +475,4 @@ PaddleClas 提供了基于 Paddle Lite 来完成模型端侧部署的示例,
 
 Paddle2ONNX 支持将 PaddlePaddle 模型格式转化到 ONNX 模型格式。通过 ONNX 可以完成将 Paddle 模型到多种推理引擎的部署,包括TensorRT/OpenVINO/MNN/TNN/NCNN,以及其它对 ONNX 开源格式进行支持的推理引擎或硬件。更多关于 Paddle2ONNX 的介绍,可以参考[Paddle2ONNX 代码仓库](https://github.com/PaddlePaddle/Paddle2ONNX)。
 
-PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../../deploy/paddle2onnx/readme.md)来完成相应的部署工作。
+PaddleClas 提供了基于 Paddle2ONNX 来完成 inference 模型转换 ONNX 模型并作推理预测的示例,您可以参考[Paddle2ONNX 模型转换与预测](../../deployment/image_classification/paddle2onnx.md)来完成相应的部署工作。
diff --git a/docs/zh_CN/models/PULC/README.md b/docs/zh_CN/models/PULC/README.md
new file mode 120000
index 0000000000000000000000000000000000000000..068a5873fdad63f32e3d2acf65b8f81a29464291
--- /dev/null
+++ b/docs/zh_CN/models/PULC/README.md
@@ -0,0 +1 @@
+model_list.md
\ No newline at end of file
diff --git a/docs/zh_CN/PULC/PULC_model_list.md b/docs/zh_CN/models/PULC/model_list.md
similarity index 100%
rename from docs/zh_CN/PULC/PULC_model_list.md
rename to docs/zh_CN/models/PULC/model_list.md
diff --git a/docs/zh_CN/models/index.rst b/docs/zh_CN/models/index.rst
deleted file mode 100644
index 7873e3a5ae86ae99cc62c87b5d65c20494823d16..0000000000000000000000000000000000000000
--- a/docs/zh_CN/models/index.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-模型库
-================================
-
-.. toctree::
-   :maxdepth: 2
-
-   DPN_DenseNet.md
-   models_intro.md
-   RepVGG.md
-   EfficientNet_and_ResNeXt101_wsl.md
-   ViT_and_DeiT.md
-   SwinTransformer.md
-   Others.md
-   SEResNext_and_Res2Net.md
-   ESNet.md
-   HRNet.md
-   ReXNet.md
-   Inception.md
-   TNT.md
-   RedNet.md
-   DLA.md
-   ResNeSt_RegNet.md
-   PP-LCNet.md
-   HarDNet.md
-   ResNet_and_vd.md
-   LeViT.md
-   Mobile.md
-   MixNet.md
-   Twins.md
diff --git a/docs/zh_CN/models_training/index.rst b/docs/zh_CN/models_training/index.rst
deleted file mode 100644
index 41ea472967e72399df0b3498b0e9d194c3424898..0000000000000000000000000000000000000000
--- a/docs/zh_CN/models_training/index.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-模型训练
-================================
-
-.. toctree::
-   :maxdepth: 2
-
-   config_description.md
-   classification.md
-   recognition.md
-   train_strategy.md
diff --git a/docs/zh_CN/others/index.rst b/docs/zh_CN/others/index.rst
deleted file mode 100644
index 1141b41b26085cefb3509ac872432c64517a13f3..0000000000000000000000000000000000000000
--- a/docs/zh_CN/others/index.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-其他
-================================
-
-.. toctree::
-   :maxdepth: 2
-
-   transfer_learning.md
-   train_with_DALI.md
-   VisualDL.md
-   train_on_xpu.md
-   feature_visiualization.md
-   paddle_mobile_inference.md
-   course_link.md
-   competition_support.md
-   update_history.md
-   versions.md
-   
-   
-   
-   
diff --git a/docs/zh_CN/others/versions.md b/docs/zh_CN/others/versions.md
deleted file mode 100644
index 7399bdcb75d129fdec0e9961b998a627a137e051..0000000000000000000000000000000000000000
--- a/docs/zh_CN/others/versions.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# 版本更新信息
-----------
-## 目录
-* [1. v2.3](#1)
-* [2. v2.2](#2)
-
-
-
-## 1. v2.3
-
-- 模型更新
-  - 添加轻量化模型预训练权重,包括检测模型、特征模型
-  - 发布 PP-LCNet 系列模型,此系列模型是专门在 CPU 上设计运行的自研模型
-  - SwinTransformer、Twins、Deit 支持从 scrach 直接训练,达到论文精度
-- 框架基础能力
-  - 添加 DeepHash 模块,支持特征模型直接输出二值特征
-  - 添加 PKSampler,特征模型不能多机多卡的训练的问题
-  - 支持 PaddleSlim:支持分类模型、特征模型的量化、裁剪训练及离线量化功能
-  - Legendary models 支持模型中间结果输出
-  - 支持多标签分类训练
-- 预测部署
-  - 使用 Faiss 替换原有特征检索库,提升平台适配性
-  - 支持 PaddleServing:支持分类模型、图像识别流程的部署
-
-- 推荐库版本
-  - python 版本:3.7
-  - PaddlePaddle 版本:2.1.3
-  - PaddleSlim 版本:2.2.0
-  - PaddleServing 版本:0.6.1
-
-
-
-## 2. v2.2
-
-- 模型更新
-  - 添加 LeViT、Twins、TNT、DLA、HardNet、RedNet、SwinTransfomer 模型
-- 框架基础能力
-  - 将分类模型分为两类
-    -  legendary models:引入 TheseusLayer 基类,及增加了修改网络功能接口,同时支持网络截断输出功能
-    - model zoo:其他普通分类模型
-  - 添加 Metric Learning 算法支持
-    - 添加多种相关 Loss 算法,及基础网络模块 gears(支持与 backbone、loss 组合)方便使用
-    - 同时支持普通分类及 metric learning 相关任务训练
-  - 支持静态图训练
-  - 分类训练支持 dali 加速
-  - 支持 fp16 训练
-- 应用更新
-  - 添加商品识别、车辆识别(车辆细粒度分类、车辆 ReID)、logo 识别、动漫人物识别应用具体案例及相关模型
-  - 添加图像识别完整 pipeline,包含检测模块、特征提取模块、向量检索模块
-- 预测部署
-  - 添加百度自研向量检索模块 Mobius,支持图像识别系统预测部署
-  - 图像识别,建立特征库支持 batch_size>1
-- 文档更新
-  - 添加图像识别相关文档
-  - 修复之前文档 bug
-- 推荐库版本
-  - python 版本:3.7
-  - PaddlePaddle:2.1.2
diff --git a/docs/zh_CN/PULC/PULC_quickstart.md b/docs/zh_CN/quick_start/PULC.md
similarity index 85%
rename from docs/zh_CN/PULC/PULC_quickstart.md
rename to docs/zh_CN/quick_start/PULC.md
index c7c6980625d6325bddbd5a6fed619147534c43b7..5a365f825fcaac1541045ab4b966ac61020c8c68 100644
--- a/docs/zh_CN/PULC/PULC_quickstart.md
+++ b/docs/zh_CN/quick_start/PULC.md
@@ -7,8 +7,8 @@
 ## 目录
 
 - [1. 安装](#1)
-  - [1.1 安装PaddlePaddle](#11)
-  - [1.2 安装PaddleClas whl包](#12)
+  - [1.1 安装PaddlePaddle](#1.1)
+  - [1.2 安装PaddleClas whl包](#1.2)
 - [2. 快速体验](#2)
   - [2.1 命令行使用](#2.1)
   - [2.2 Python脚本使用](#2.2)
@@ -122,4 +122,4 @@ PULC 系列模型的名称和简介如下:
 
 通过本节内容,相信您已经熟练掌握 PaddleClas whl 包的 PULC 模型使用方法并获得了初步效果。
 
-PULC 方法产出的系列模型在人、车、OCR等方向的多个场景中均验证有效,用超轻量模型就可实现与 SwinTransformer 模型接近的精度,预测速度提高 40+ 倍。并且打通数据、模型训练、压缩和推理部署全流程,具体地,您可以参考[PULC有人/无人分类模型](PULC_person_exists.md)、[PULC人体属性识别模型](PULC_person_attribute.md)、[PULC佩戴安全帽分类模型](PULC_safety_helmet.md)、[PULC交通标志分类模型](PULC_traffic_sign.md)、[PULC车辆属性识别模型](PULC_vehicle_attribute.md)、[PULC有车/无车分类模型](PULC_car_exists.md)、[PULC含文字图像方向分类模型](PULC_text_image_orientation.md)、[PULC文本行方向分类模型](PULC_textline_orientation.md)、[PULC语种分类模型](PULC_language_classification.md)。
+PULC 方法产出的系列模型在人、车、OCR等方向的多个场景中均验证有效,用超轻量模型就可实现与 SwinTransformer 模型接近的精度,预测速度提高 40+ 倍。并且打通数据、模型训练、压缩和推理部署全流程,具体地,您可以参考[PULC有人/无人分类模型](../models/PULC/PULC_person_exists.md)、[PULC人体属性识别模型](../models/PULC/PULC_person_attribute.md)、[PULC佩戴安全帽分类模型](../models/PULC/PULC_safety_helmet.md)、[PULC交通标志分类模型](../models/PULC/PULC_traffic_sign.md)、[PULC车辆属性识别模型](../models/PULC/PULC_vehicle_attribute.md)、[PULC有车/无车分类模型](../models/PULC/PULC_car_exists.md)、[PULC含文字图像方向分类模型](../models/PULC/PULC_text_image_orientation.md)、[PULC文本行方向分类模型](../models/PULC/PULC_textline_orientation.md)、[PULC语种分类模型](../models/PULC/PULC_language_classification.md)。
diff --git a/docs/zh_CN/quick_start/index.rst b/docs/zh_CN/quick_start/index.rst
deleted file mode 100644
index 50af4716038a06c8b4bd02263aa5ac501e049b38..0000000000000000000000000000000000000000
--- a/docs/zh_CN/quick_start/index.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-快速开始
-================================
-
-.. toctree::
-   :maxdepth: 2
-
-   quick_start_classification_new_user.md
-   quick_start_classification_professional.md
-   quick_start_recognition.md
-   quick_start_multilabel_classification.md
diff --git a/docs/zh_CN/advanced_tutorials/code_overview.md b/docs/zh_CN/quick_start/overview.md
similarity index 94%
rename from docs/zh_CN/advanced_tutorials/code_overview.md
rename to docs/zh_CN/quick_start/overview.md
index ef4e5035cd63703b6f661cf538ab5acfa49fe141..0a2f0ba307aafb12634a13b588683af1981b5e7c 100644
--- a/docs/zh_CN/advanced_tutorials/code_overview.md
+++ b/docs/zh_CN/quick_start/overview.md
@@ -245,15 +245,15 @@ Slim:
     name: pact
 ```
 
-训练方法详见模型[裁剪量化使用介绍](../advanced_tutorials/model_prune_quantization.md),
-算法介绍详见[裁剪量化算法介绍](../algorithm_introduction/model_prune_quantization.md)。
+训练方法详见模型[裁剪量化使用介绍](../training/advanced/prune_quantization.md),
+算法介绍详见[裁剪量化算法介绍](../algorithm_introduction/prune_quantization.md)。
 
 
 ## 3. 预测部署代码和方式
 
-* 如果希望将对分类模型进行离线量化,可以参考 [模型量化裁剪教程](../advanced_tutorials/model_prune_quantization.md) 中离线量化部分。
-* 如果希望在服务端使用 python 进行部署,可以参考 [python inference 预测教程](../inference_deployment/python_deploy.md)。
-* 如果希望在服务端使用 cpp 进行部署,可以参考 [cpp inference 预测教程](../inference_deployment/cpp_deploy.md)。
-* 如果希望将分类模型部署为服务,可以参考 [hub serving 预测部署教程](../inference_deployment/paddle_hub_serving_deploy.md)。
-* 如果希望在移动端使用分类模型进行预测,可以参考 [PaddleLite 预测部署教程](../inference_deployment/paddle_lite_deploy.md)。
-* 如果希望使用 whl 包对分类模型进行预测,可以参考 [whl 包预测](../inference_deployment/whl_deploy.md)。
+* 如果希望将对分类模型进行离线量化,可以参考 [模型量化裁剪教程](../training/advanced/prune_quantization.md) 中离线量化部分。
+* 如果希望在服务端使用 python 进行部署,可以参考 [python inference 预测教程](../deployment/image_classification/python.md)。
+* 如果希望在服务端使用 cpp 进行部署,可以参考 [cpp inference 预测教程](../deployment/image_classification/cpp/linux.md)。
+* 如果希望将分类模型部署为服务,可以参考 [hub serving 预测部署教程](../deployment/image_classification/paddle_hub.md)。
+* 如果希望在移动端使用分类模型进行预测,可以参考 [PaddleLite 预测部署教程](../deployment/image_classification/paddle_lite.md)。
+* 如果希望使用 whl 包对分类模型进行预测,可以参考 [whl 包预测](../deployment/image_classification/whl.md)。
diff --git a/docs/zh_CN/quick_start/quick_start_classification_new_user.md b/docs/zh_CN/quick_start/quick_start_classification_new_user.md
index fdc61193c88b4b8b522842c7685bcdcf315dc4b5..ca2a89d18a181ebc33188365089d9adb3fcc9408 100644
--- a/docs/zh_CN/quick_start/quick_start_classification_new_user.md
+++ b/docs/zh_CN/quick_start/quick_start_classification_new_user.md
@@ -8,12 +8,12 @@
 * [2. 环境安装与配置](#2)
 * [3. 数据的准备与处理](#3)
 * [4. 模型训练](#4)
-	* [4.1 使用CPU进行模型训练](#4.1)
-		* [4.1.1 不使用预训练模型](#4.1.1)
-		* [4.1.2 使用预训练模型](#4.1.2)
-	* [4.2 使用GPU进行模型训练](#4.2)
-		* [4.2.1 不使用预训练模型](#4.2.1)
-		* [4.2.2 使用预训练模型进行训练](#4.2.2)
+    * [4.1 使用CPU进行模型训练](#4.1)
+        * [4.1.1 不使用预训练模型](#4.1.1)
+        * [4.1.2 使用预训练模型](#4.1.2)
+    * [4.2 使用GPU进行模型训练](#4.2)
+        * [4.2.1 不使用预训练模型](#4.2.1)
+        * [4.2.2 使用预训练模型进行训练](#4.2.2)
 * [5. 模型预测](#5)
 
 
@@ -48,7 +48,7 @@
 
 ##  2. 环境安装与配置
 
-具体安装步骤可详看[环境准备](../installation/install_paddleclas.md)。
+具体安装步骤可详看[环境准备](../installation.md)。
 
 
 
diff --git a/docs/zh_CN/quick_start/quick_start_classification_professional.md b/docs/zh_CN/quick_start/quick_start_classification_professional.md
index 9a44d939ce999e291120c006801b374d302ab8ba..0cd66a0c7eb2ac2798e249bac4a9a0f40988e227 100644
--- a/docs/zh_CN/quick_start/quick_start_classification_professional.md
+++ b/docs/zh_CN/quick_start/quick_start_classification_professional.md
@@ -1,6 +1,6 @@
 # 30 分钟玩转 PaddleClas(进阶版)
 
-此处提供了专业用户在 linux 操作系统上使用 PaddleClas 的快速上手教程,主要内容基于 CIFAR-100 数据集,快速体验不同模型的训练、加载不同预训练模型、SSLD 知识蒸馏方案和数据增广的效果。请事先参考[安装指南](../installation/install_paddleclas.md)配置运行环境和克隆 PaddleClas 代码。
+此处提供了专业用户在 linux 操作系统上使用 PaddleClas 的快速上手教程,主要内容基于 CIFAR-100 数据集,快速体验不同模型的训练、加载不同预训练模型、SSLD 知识蒸馏方案和数据增广的效果。请事先参考[安装指南](../installation.md)配置运行环境和克隆 PaddleClas 代码。
 
 ------
 
@@ -37,7 +37,7 @@
 cd path_to_PaddleClas
 ```
 
- 
+
 
 #### 1.1.1 准备 CIFAR100
 
@@ -54,11 +54,11 @@ cd ../
 
 ## 2. 模型训练
 
- 
+
 
 ### 2.1 单标签训练
 
- 
+
 
 #### 2.1.1 零基础训练:不加载预训练模型的训练
 
@@ -87,12 +87,12 @@ python3 -m paddle.distributed.launch \
         -o Optimizer.lr.learning_rate=0.01
 ```
 
-* **注意**: 
+* **注意**:
 
 * `--gpus`中指定的 GPU 可以是 `CUDA_VISIBLE_DEVICES` 指定的 GPU 的子集。
 * 由于初始学习率和 batch-size 需要保持线性关系,所以训练从 4 个 GPU 切换到 1 个 GPU 训练时,总 batch-size 缩减为原来的 1/4,学习率也需要缩减为原来的 1/4,所以改变了默认的学习率从 0.04 到 0.01。
 
- 
+
 
 
 #### 2.1.2 迁移学习
@@ -145,13 +145,13 @@ python3 -m paddle.distributed.launch \
 
 ## 3. 数据增广
 
-PaddleClas 包含了很多数据增广的方法,如 Mixup、Cutout、RandomErasing 等,具体的方法可以参考[数据增广的章节](../algorithm_introduction/DataAugmentation.md)。
+PaddleClas 包含了很多数据增广的方法,如 Mixup、Cutout、RandomErasing 等,具体的方法可以参考[数据增广的章节](../algorithm_introduction/data_augmentation.md)。
 
- 
+
 
 ### 3.1 数据增广的尝试-Mixup
 
-基于[数据增广的章节](../algorithm_introduction/DataAugmentation.md) `3.3 节` 中的训练方法,结合 Mixup 的数据增广方式进行训练,具体的训练脚本如下所示。
+基于[数据增广的章节](../algorithm_introduction/data_augmentation.md) `3.3 节` 中的训练方法,结合 Mixup 的数据增广方式进行训练,具体的训练脚本如下所示。
 
 ```shell
 export CUDA_VISIBLE_DEVICES=0,1,2,3
@@ -243,11 +243,11 @@ python3 -m paddle.distributed.launch \
 
 ## 5. 模型评估与推理
 
- 
+
 
 ### 5.1 单标签分类模型评估与推理
 
- 
+
 
 #### 5.1.1 单标签分类模型评估。
 
@@ -259,7 +259,7 @@ python3 tools/eval.py \
     -o Global.pretrained_model="output_CIFAR/ResNet50_vd/best_model"
 ```
 
- 
+
 
 #### 5.1.2 单标签分类模型预测
 
@@ -272,7 +272,7 @@ python3 tools/infer.py \
     -o Global.pretrained_model=output_CIFAR/ResNet50_vd/best_model
 ```
 
- 
+
 
 #### 5.1.3 单标签分类使用 inference 模型进行模型推理
 
diff --git a/docs/zh_CN/quick_start/quick_start_multilabel_classification.md b/docs/zh_CN/quick_start/quick_start_multilabel_classification.md
index ea6e691c1ef51fb1371a5ff747c4cfc4fe72a79d..355310970b96e84a89238b060b243092a99241c0 100644
--- a/docs/zh_CN/quick_start/quick_start_multilabel_classification.md
+++ b/docs/zh_CN/quick_start/quick_start_multilabel_classification.md
@@ -1,6 +1,6 @@
 # 多标签分类 quick start
 
-基于 [NUS-WIDE-SCENE](https://lms.comp.nus.edu.sg/wp-content/uploads/2019/research/nuswide/NUS-WIDE.html) 数据集,体验多标签分类的训练、评估、预测的过程,该数据集是 NUS-WIDE 数据集的一个子集。请首先安装 PaddlePaddle 和 PaddleClas,具体安装步骤可详看 [环境准备](../installation/install_paddleclas.md)。
+基于 [NUS-WIDE-SCENE](https://lms.comp.nus.edu.sg/wp-content/uploads/2019/research/nuswide/NUS-WIDE.html) 数据集,体验多标签分类的训练、评估、预测的过程,该数据集是 NUS-WIDE 数据集的一个子集。请首先安装 PaddlePaddle 和 PaddleClas,具体安装步骤可详看 [环境准备](../installation.md)。
 
 
 ## 目录
@@ -50,6 +50,10 @@ python3 -m paddle.distributed.launch \
 
 训练 10 epoch 之后,验证集最好的正确率应该在 0.95 左右。
 
+**注意:**
+1. 目前多标签分类的损失函数仅支持`MultiLabelLoss`(BCE Loss)。
+2. 目前多标签分类的评估指标支持`AccuracyScore`和`HammingDistance`,其他评估指标敬请期待。
+
 
 
 ## 3. 模型评估
@@ -70,8 +74,8 @@ python3 tools/infer.py \
 ```
 
 得到类似下面的输出:
-```  
-[{'class_ids': [6, 13, 17, 23, 26, 30], 'scores': [0.95683, 0.5567, 0.55211, 0.99088, 0.5943, 0.78767], 'file_name': './deploy/images/0517_2715693311.jpg', 'label_names': []}]
+```
+[{'class_ids': [6, 13, 17, 23, 30], 'scores': [0.98217, 0.78129, 0.64377, 0.9942, 0.96109], 'label_names': ['clouds', 'lake', 'ocean', 'sky', 'water'], 'file_name': 'deploy/images/0517_2715693311.jpg'}]
 ```
 
 
@@ -100,10 +104,13 @@ cd ./deploy
 
 ```
 python3 python/predict_cls.py \
-     -c configs/inference_multilabel_cls.yaml
+     -c configs/inference_cls_multilabel.yaml
 ```
+推理图片如下:
 
-得到类似下面的输出:
+
+
+执行推理命令后,得到类似下面的输出:
 ```
-0517_2715693311.jpg:    class id(s): [6, 13, 17, 23, 26, 30], score(s): [0.96, 0.56, 0.55, 0.99, 0.59, 0.79], label_name(s): []
+0517_2715693311.jpg:    class id(s): [6, 13, 17, 23, 30], score(s): [0.98, 0.78, 0.64, 0.99, 0.96], label_name(s): ['clouds', 'lake', 'ocean', 'sky', 'water']
 ```
diff --git a/docs/zh_CN/quick_start/quick_start_recognition.md b/docs/zh_CN/quick_start/quick_start_recognition.md
index 550e455228f65b6886b13d8627413d4dd1387990..63ef47eb997726af67c2f4b762872b0cc3efd266 100644
--- a/docs/zh_CN/quick_start/quick_start_recognition.md
+++ b/docs/zh_CN/quick_start/quick_start_recognition.md
@@ -82,7 +82,7 @@
 
 ### 2.1 环境配置
 
-* 安装:请先参考文档 [环境准备](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考文档 [环境准备](../installation.md) 配置 PaddleClas 运行环境。
 
 * 进入 `deploy` 运行目录。本部分所有内容与命令均需要在 `deploy` 目录下运行,可以通过下面的命令进入 `deploy` 目录。
 
@@ -107,7 +107,7 @@
 
 本章节 demo 数据下载地址如下: [drink_dataset_v2.0.tar(瓶装饮料数据)](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/drink_dataset_v2.0.tar),
 
-下面以 **drink_dataset_v2.0.tar** 为例介绍PC端的 PP-ShiTu 快速体验流程。用户也可以自行下载并解压其它场景的数据进行体验:[22种场景数据下载](../introduction/ppshitu_application_scenarios.md#1-应用场景介绍)。
+下面以 **drink_dataset_v2.0.tar** 为例介绍PC端的 PP-ShiTu 快速体验流程。用户也可以自行下载并解压其它场景的数据进行体验:[22种场景数据下载](../deployment/PP-ShiTu/application_scenarios.md#1-应用场景介绍)。
 
 如果希望体验服务端主体检测和各垂类方向的识别模型,可以参考 [2.4 服务端识别模型列表](#24-服务端识别模型列表)
 
@@ -300,7 +300,7 @@ python3.7 python/predict_system.py -c configs/inference_general.yaml -o Global.i
 python3.7 python/build_gallery.py -c configs/inference_general.yaml -o IndexProcess.data_file="./drink_dataset_v2.0/gallery/drink_label_all.txt" -o IndexProcess.index_dir="./drink_dataset_v2.0/index_all"
 ```
 
-最终构建完毕的新的索引库保存在文件夹 `./drink_dataset_v2.0/index_all` 下。具体 `yaml` 请参考[向量检索文档](../image_recognition_pipeline/vector_search.md)。
+最终构建完毕的新的索引库保存在文件夹 `./drink_dataset_v2.0/index_all` 下。具体 `yaml` 请参考[向量检索文档](../deployment/PP-ShiTu/vector_search.md)。
 
 
 
@@ -377,4 +377,4 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognit
 
 按照上述步骤下载模型和测试数据后,您可以重新建立索引库,并进行相关方向识别模型的测试。
 
-* 更多关于主体检测的介绍可以参考:[主体检测教程文档](../image_recognition_pipeline/mainbody_detection.md);关于特征提取的介绍可以参考:[特征提取教程文档](../image_recognition_pipeline/feature_extraction.md);关于向量检索的介绍可以参考:[向量检索教程文档](../image_recognition_pipeline/vector_search.md)。
+* 更多关于主体检测的介绍可以参考:[主体检测教程文档](../training/PP-ShiTu/mainbody_detection.md);关于特征提取的介绍可以参考:[特征提取教程文档](../training/PP-ShiTu/feature_extraction.md);关于向量检索的介绍可以参考:[向量检索教程文档](../deployment/PP-ShiTu/vector_search.md)。
diff --git a/docs/zh_CN/samples/Fresh_Food_Recogniiton/README.md b/docs/zh_CN/samples/Fresh_Food_Recogniiton/README.md
index cca051cec89d9ef5a86a3edc2cb8745a5bc69a2e..21ed2581b73376accacbe8a5e3508b574bd1625e 100644
--- a/docs/zh_CN/samples/Fresh_Food_Recogniiton/README.md
+++ b/docs/zh_CN/samples/Fresh_Food_Recogniiton/README.md
@@ -12,10 +12,9 @@
 
 深圳市银歌云技术有限公司基于飞桨的图像识别开发套件PaddleClas,提供了一套基于计算机视觉的完整生鲜品自主结算方案,其通过结算平台的摄像头拍摄的图像,自动的识别称上的商品,整个流程在1秒内完成,无需售卖人员的操作及称重。整个流程,实现了精度高、速度快,无需人工干预的自动结算效果。减少人工成本的同时,大大提高了效率和用户体验。
 
-本案例使用了飞桨图像分类开发套件中的通用图像识别系统[PP-ShiTuV2](../../PPShiTu/PPShiTuV2_introduction.md)。
+本案例使用了飞桨图像分类开发套件中的通用图像识别系统[PP-ShiTuV2](../../models/PP-ShiTu/README.md)。
 
 
 
 
 **注**: AI Studio在线运行代码请参考[生鲜品自主结算](https://aistudio.baidu.com/aistudio/projectdetail/4486158)
-
diff --git a/docs/zh_CN/algorithm_introduction/action_rec_by_classification.md b/docs/zh_CN/samples/action_rec_by_classification.md
similarity index 95%
rename from docs/zh_CN/algorithm_introduction/action_rec_by_classification.md
rename to docs/zh_CN/samples/action_rec_by_classification.md
index bf8272be99128eef40a4bdbfbc6a0273b2f51c8e..9fbd2eb3eb5d4a3f248971cfec6aaa32681a769c 100644
--- a/docs/zh_CN/algorithm_introduction/action_rec_by_classification.md
+++ b/docs/zh_CN/samples/action_rec_by_classification.md
@@ -44,7 +44,7 @@
 
 
 ### 2.1 PaddleClas 环境安装
-请根据[环境准备](../installation/install_paddleclas.md)完成PaddleClas的环境依赖准备。
+请根据[环境准备](../installation.md)完成PaddleClas的环境依赖准备。
 
 
 
@@ -71,7 +71,7 @@
 
 
 #### 2.2.3 标注文件准备
-根据[PaddleClas数据集格式说明](../data_preparation/classification_dataset.md),标注文件样例如下,其中`0`,`1`分别是图片对应所属的类别:
+根据[PaddleClas数据集格式说明](../training/single_label_classification/dataset.md),标注文件样例如下,其中`0`,`1`分别是图片对应所属的类别:
 ```
     # 每一行采用"空格"分隔图像路径与标注
     train/000001.jpg 0
@@ -88,9 +88,9 @@
 
 完成上述内容后,放置于`dataset`目录下,文件结构如下:
 ```
-data/ 
+data/
 ├── images  # 放置所有图片
-├── phone_label_list.txt # 标签文件 
+├── phone_label_list.txt # 标签文件
 ├── phone_train_list.txt # 训练列表,包含图片及其对应类型
 └── phone_val_list.txt   # 测试列表,包含图片及其对应类型
 ```
@@ -104,7 +104,7 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
 python3 -m paddle.distributed.launch \
     --gpus="0,1,2,3" \
     tools/train.py \
-        -c ./ppcls/configs/practical_models/PPHGNet_tiny_calling_halfbody.yaml \ 
+        -c ./ppcls/configs/practical_models/PPHGNet_tiny_calling_halfbody.yaml \
         -o Arch.pretrained=True
 ```
 其中 `Arch.pretrained` 为 `True`表示使用预训练权重帮助训练。
diff --git a/docs/zh_CN/image_recognition_pipeline/deep_hashing.md b/docs/zh_CN/training/PP-ShiTu/deep_hashing.md
similarity index 87%
rename from docs/zh_CN/image_recognition_pipeline/deep_hashing.md
rename to docs/zh_CN/training/PP-ShiTu/deep_hashing.md
index 03413dac84e4b9974d03ad230a04e13171d8c01f..9912c59574393da92a9afc88290bad5ef020d249 100644
--- a/docs/zh_CN/image_recognition_pipeline/deep_hashing.md
+++ b/docs/zh_CN/training/PP-ShiTu/deep_hashing.md
@@ -10,8 +10,8 @@
 ## 目录
 
 - [1. 特征模型二值特征训练](#1)
-	- [1.1 PP-ShiTu特征提取模型二值训练](#1.1)
-	- [1.2 其他特征模型二值训练](#1.2)
+    - [1.1 PP-ShiTu特征提取模型二值训练](#1.1)
+    - [1.2 其他特征模型二值训练](#1.2)
 - [2. 检索算法配置](#2)
 
 
@@ -47,15 +47,15 @@ python3.7 -m paddle.distributed.launch tools/train.py \
 
 ### 1.2 其他特征模型二值训练
 
-其他二值特征训练模型的配置文件位于`ppcls/configs/DeepHash/`文件夹下,此文件夹下的相关配置文件主要是复现相关`deep hashing`相关算法。包括:`DCH, DSHSD, LCDSH`三种算法。这三种算法相关介绍,详见[Deep Hashing相关算法介绍](../algorithm_introduction/deep_hashing_introduction.md)。
+其他二值特征训练模型的配置文件位于`ppcls/configs/DeepHash/`文件夹下,此文件夹下的相关配置文件主要是复现相关`deep hashing`相关算法。包括:`DCH, DSHSD, LCDSH`三种算法。这三种算法相关介绍,详见[Deep Hashing相关算法介绍](../../algorithm_introduction/deep_hashing.md)。
 
-相关训练方法,请参考[分类模型训练文档](../models_training/classification.md)。
+相关训练方法,请参考[分类模型训练文档](../single_label_classification/training.md)。
 
 
 
 ## 2. 检索算法配置
 
-在PP-ShiTu中使用二值特征,部署及离线推理配置请参考`deploy/configs/inference_general_binary.yaml`。配置文件中相关参数介绍请参考[向量检索文档](./vector_search.md).
+在PP-ShiTu中使用二值特征,部署及离线推理配置请参考`deploy/configs/inference_general_binary.yaml`。配置文件中相关参数介绍请参考[向量检索文档](../../deployment/PP-ShiTu/vector_search.md).
 
 其中需值得注意的是,二值检索相关配置应设置如下:
 
diff --git a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md b/docs/zh_CN/training/PP-ShiTu/feature_extraction.md
similarity index 75%
rename from docs/zh_CN/image_recognition_pipeline/feature_extraction.md
rename to docs/zh_CN/training/PP-ShiTu/feature_extraction.md
index f037dc25a72f2d0f452194fe15879b8c7edced90..64e1858f76e267bea2d52abdb99a56e06e9774e5 100644
--- a/docs/zh_CN/image_recognition_pipeline/feature_extraction.md
+++ b/docs/zh_CN/training/PP-ShiTu/feature_extraction.md
@@ -1,45 +1,47 @@
-简体中文 | [English](../../en/image_recognition_pipeline/feature_extraction_en.md)
+简体中文 | [English](../../../en/image_recognition_pipeline/feature_extraction_en.md)
 # 特征提取
 
 ## 目录
 
-- [1. 摘要](#1-摘要)
-- [2. 介绍](#2-介绍)
-- [3. 方法](#3-方法)
-    - [3.1 Backbone](#31-backbone)
-    - [3.2 Neck](#32-neck)
-    - [3.3 Head](#33-head)
-    - [3.4 Loss](#34-loss)
-    - [3.5 Data Augmentation](#35-data-augmentation)
-- [4. 实验部分](#4-实验部分)
-- [5. 自定义特征提取](#5-自定义特征提取)
-  - [5.1 数据准备](#51-数据准备)
-  - [5.2 模型训练](#52-模型训练)
-  - [5.3 模型评估](#53-模型评估)
-  - [5.4 模型推理](#54-模型推理)
-    - [5.4.1 导出推理模型](#541-导出推理模型)
-    - [5.4.2 获取特征向量](#542-获取特征向量)
-- [6. 总结](#6-总结)
-- [7. 参考文献](#7-参考文献)
+- [特征提取](#特征提取)
+  - [目录](#目录)
+  - [1. 摘要](#1-摘要)
+  - [2. 介绍](#2-介绍)
+  - [3. 方法](#3-方法)
+      - [3.1 Backbone](#31-backbone)
+      - [3.2 Neck](#32-neck)
+      - [3.3 Head](#33-head)
+      - [3.4 Loss](#34-loss)
+      - [3.5 Data Augmentation](#35-data-augmentation)
+  - [4. 实验部分](#4-实验部分)
+  - [5. 自定义特征提取](#5-自定义特征提取)
+    - [5.1 数据准备](#51-数据准备)
+    - [5.2 模型训练](#52-模型训练)
+    - [5.3 模型评估](#53-模型评估)
+    - [5.4 模型推理](#54-模型推理)
+      - [5.4.1 导出推理模型](#541-导出推理模型)
+      - [5.4.2 获取特征向量](#542-获取特征向量)
+  - [6. 总结](#6-总结)
+  - [7. 参考文献](#7-参考文献)
 
 
 
 ## 1. 摘要
 
-特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的[向量检索](./vector_search.md)。一个好的特征需要具备“相似度保持性”,即相似度高的图片对,其特征的相似度也比较高(特征空间中的距离比较近),相似度低的图片对,其特征相似度要比较低(特征空间中的距离比较远)。为此[Deep Metric Learning](../algorithm_introduction/metric_learning.md)领域内提出了不少方法用以研究如何通过深度学习来获得具有强表征能力的特征。
+特征提取是图像识别中的关键一环,它的作用是将输入的图片转化为固定维度的特征向量,用于后续的[向量检索](../../deployment/PP-ShiTu/vector_search.md)。一个好的特征需要具备“相似度保持性”,即相似度高的图片对,其特征的相似度也比较高(特征空间中的距离比较近),相似度低的图片对,其特征相似度要比较低(特征空间中的距离比较远)。为此[Deep Metric Learning](../../algorithm_introduction/metric_learning.md)领域内提出了不少方法用以研究如何通过深度学习来获得具有强表征能力的特征。
 
 
 
 ## 2. 介绍
 
 为了图像识别任务的灵活定制,我们将整个网络分为 Backbone、 Neck、 Head 以及 Loss 部分,整体结构如下图所示:
-
+
 图中各个模块的功能为:
 
-- **Backbone**: 用于提取输入图像初步特征的骨干网络,一般由配置文件中的 [Backbone](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L33-L37) 以及 [BackboneStopLayer](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L38-L39) 字段共同指定。
-- **Neck**: 用以特征增强及特征维度变换。可以是一个简单的 FC Layer,用来做特征维度变换;也可以是较复杂的 FPN 结构,用以做特征增强,一般由配置文件中的 [Neck](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L40-L51) 字段指定。
-- **Head**: 用来将 `Neck` 的输出 feature 转化为 logits,让模型在训练阶段能以分类任务的形式进行训练。除了常用的 FC Layer 外,还可以替换为 [CosMargin](../../../ppcls/arch/gears/cosmargin.py), [ArcMargin](../../../ppcls/arch/gears/arcmargin.py), [CircleMargin](../../../ppcls/arch/gears/circlemargin.py) 等模块,一般由配置文件中的 [Head](`../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L52-L60) 字段指定。
-- **Loss**: 指定所使用的 Loss 函数。我们将 Loss 设计为组合 loss 的形式,可以方便地将 Classification Loss 和 Metric learning Loss 组合在一起,一般由配置文件中的 [Loss](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L63-L77) 字段指定。
+- **Backbone**: 用于提取输入图像初步特征的骨干网络,一般由配置文件中的 [Backbone](../../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L33-L37) 以及 [BackboneStopLayer](../../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L38-L39) 字段共同指定。
+- **Neck**: 用以特征增强及特征维度变换。可以是一个简单的 FC Layer,用来做特征维度变换;也可以是较复杂的 FPN 结构,用以做特征增强,一般由配置文件中的 [Neck](../../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L40-L51) 字段指定。
+- **Head**: 用来将 `Neck` 的输出 feature 转化为 logits,让模型在训练阶段能以分类任务的形式进行训练。除了常用的 FC Layer 外,还可以替换为 [CosMargin](../../../../ppcls/arch/gears/cosmargin.py), [ArcMargin](../../../../ppcls/arch/gears/arcmargin.py), [CircleMargin](../../../../ppcls/arch/gears/circlemargin.py) 等模块,一般由配置文件中的 [Head](../../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L52-L60) 字段指定。
+- **Loss**: 指定所使用的 Loss 函数。我们将 Loss 设计为组合 loss 的形式,可以方便地将 Classification Loss 和 Metric learning Loss 组合在一起,一般由配置文件中的 [Loss](../../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L63-L77) 字段指定。
 
 
 
@@ -47,26 +49,26 @@
 
 #### 3.1 Backbone
 
-Backbone 部分采用了 [PP-LCNetV2_base](../models/PP-LCNetV2.md),其在 `PPLCNet_V1` 的基础上,加入了包括Rep 策略、PW 卷积、Shortcut、激活函数改进、SE 模块改进等多个优化点,使得最终分类精度与 `PPLCNet_x2_5` 相近,且推理延时减少了40%*。在实验过程中我们对 `PPLCNetV2_base` 进行了适当的改进,在保持速度基本不变的情况下,让其在识别任务中得到更高的性能,包括:去掉 `PPLCNetV2_base` 末尾的 `ReLU` 和 `FC`、将最后一个 stage(RepDepthwiseSeparable) 的 stride 改为1。
+Backbone 部分采用了 [PP-LCNetV2_base](../../models/ImageNet1k/PP-LCNetV2.md),其在 `PPLCNet_V1` 的基础上,加入了包括Rep 策略、PW 卷积、Shortcut、激活函数改进、SE 模块改进等多个优化点,使得最终分类精度与 `PPLCNet_x2_5` 相近,且推理延时减少了40%*。在实验过程中我们对 `PPLCNetV2_base` 进行了适当的改进,在保持速度基本不变的情况下,让其在识别任务中得到更高的性能,包括:去掉 `PPLCNetV2_base` 末尾的 `ReLU` 和 `FC`、将最后一个 stage(RepDepthwiseSeparable) 的 stride 改为1。
 
 
 **注:** *推理环境基于 Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz 硬件平台,OpenVINO 推理平台。
 
 #### 3.2 Neck
 
-Neck 部分采用了 [BN Neck](../../../ppcls/arch/gears/bnneck.py),对 Backbone 抽取得到的特征的每个维度进行标准化操作,减少了同时优化度量学习损失函数和分类损失函数的难度,加快收敛速度。
+Neck 部分采用了 [BN Neck](../../../../ppcls/arch/gears/bnneck.py),对 Backbone 抽取得到的特征的每个维度进行标准化操作,减少了同时优化度量学习损失函数和分类损失函数的难度,加快收敛速度。
 
 #### 3.3 Head
 
-Head 部分选用 [FC Layer](../../../ppcls/arch/gears/fc.py),使用分类头将 feature 转换成 logits 供后续计算分类损失。
+Head 部分选用 [FC Layer](../../../../ppcls/arch/gears/fc.py),使用分类头将 feature 转换成 logits 供后续计算分类损失。
 
 #### 3.4 Loss
 
-Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [TripletAngularMarginLoss](../../../ppcls/loss/tripletangularmarginloss.py),在训练时以分类损失和基于角度的三元组损失来指导网络进行优化。我们基于原始的 TripletLoss (困难三元组损失)进行了改进,将优化目标从 L2 欧几里得空间更换成余弦空间,并加入了 anchor 与 positive/negtive 之间的硬性距离约束,让训练与测试的目标更加接近,提升模型的泛化能力。详细的配置文件见 [GeneralRecognitionV2_PPLCNetV2_base.yaml](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L63-77)。
+Loss 部分选用 [Cross entropy loss](../../../../ppcls/loss/celoss.py) 和 [TripletAngularMarginLoss](../../../../ppcls/loss/tripletangularmarginloss.py),在训练时以分类损失和基于角度的三元组损失来指导网络进行优化。我们基于原始的 TripletLoss (困难三元组损失)进行了改进,将优化目标从 L2 欧几里得空间更换成余弦空间,并加入了 anchor 与 positive/negtive 之间的硬性距离约束,让训练与测试的目标更加接近,提升模型的泛化能力。详细的配置文件见 [GeneralRecognitionV2_PPLCNetV2_base.yaml](../../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L63-77)。
 
 #### 3.5 Data Augmentation
 
-我们考虑到实际相机拍摄时目标主体可能出现一定的旋转而不一定能保持正立状态,因此我们在数据增强中加入了适当的 [随机旋转增强](../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L117),以提升模型在真实场景中的检索能力。
+我们考虑到实际相机拍摄时目标主体可能出现一定的旋转而不一定能保持正立状态,因此我们在数据增强中加入了适当的 [随机旋转增强](../../../../ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml#L117),以提升模型在真实场景中的检索能力。
 
 
 
@@ -121,7 +123,7 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [Tripl
 
 ### 5.1 数据准备
 
-首先需要基于任务定制自己的数据集。数据集格式与文件结构详见 [数据集格式说明](../data_preparation/recognition_dataset.md)。
+首先需要基于任务定制自己的数据集。数据集格式与文件结构详见 [数据集格式说明](../metric_learning/dataset.md)。
 
 准备完毕之后还需要在配置文件中修改数据配置相关的内容, 主要包括数据集的地址以及类别数量。对应到配置文件中的位置如下所示:
 
@@ -185,14 +187,14 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [Tripl
 **注意:**
 配置文件中默认采用`在线评估`的方式,如果你想加快训练速度,可以关闭`在线评估`功能,只需要在上述命令的后面,增加 `-o Global.eval_during_train=False`。
 
-训练完毕后,在 output 目录下会生成最终模型文件 `latest.pdparams`,`best_model.pdarams` 和训练日志文件 `train.log`。其中,`best_model` 保存了当前评测指标下的最佳模型,`latest` 用来保存最新生成的模型, 方便在任务中断的情况下从断点位置恢复训练。通过在上述训练命令的末尾加上`-o Global.checkpoint="path_to_resume_checkpoint"`即可从断点恢复训练,示例如下。
+训练完毕后,在 output 目录下会生成最终模型文件 `latest.pdparams`,`best_model.pdarams` 和训练日志文件 `train.log`。其中,`best_model` 保存了当前评测指标下的最佳模型,`latest` 用来保存最新生成的模型, 方便在任务中断的情况下从断点位置恢复训练。通过在上述训练命令的末尾加上`-o Global.checkpoints="path_to_resume_checkpoint"`即可从断点恢复训练,示例如下。
 
 - 单机单卡断点恢复训练
   ```shell
   export CUDA_VISIBLE_DEVICES=0
   python3.7 tools/train.py \
   -c ./ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml \
-  -o Global.checkpoint="output/RecModel/latest"
+  -o Global.checkpoints="output/RecModel/latest"
   ```
 - 单机多卡断点恢复训练
   ```shell
@@ -200,7 +202,7 @@ Loss 部分选用 [Cross entropy loss](../../../ppcls/loss/celoss.py) 和 [Tripl
   python3.7 -m paddle.distributed.launch --gpus="0,1,2,3" \
   tools/train.py \
   -c ./ppcls/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base.yaml \
-  -o Global.checkpoint="output/RecModel/latest"
+  -o Global.checkpoints="output/RecModel/latest"
   ```
 
 
@@ -265,7 +267,7 @@ wangzai.jpg:    [-7.82453567e-02  2.55877394e-02 -3.66694555e-02  1.34572461e-02
  -3.40284109e-02  8.35561901e-02  2.10910216e-02 -3.27066667e-02]
 ```
 
-在实际使用过程中,仅仅得到特征可能并不能满足业务需求。如果想进一步通过特征检索来进行图像识别,可以参照文档 [向量检索](./vector_search.md)。
+在实际使用过程中,仅仅得到特征可能并不能满足业务需求。如果想进一步通过特征检索来进行图像识别,可以参照文档 [向量检索](../../deployment/PP-ShiTu/vector_search.md)。
 
 
 
diff --git a/docs/zh_CN/image_recognition_pipeline/mainbody_detection.md b/docs/zh_CN/training/PP-ShiTu/mainbody_detection.md
similarity index 97%
rename from docs/zh_CN/image_recognition_pipeline/mainbody_detection.md
rename to docs/zh_CN/training/PP-ShiTu/mainbody_detection.md
index 5434a464c56cb20bf203a98261ac834101263efd..c2826b7201ac22e391590e56aa9812c7bc1905a2 100644
--- a/docs/zh_CN/image_recognition_pipeline/mainbody_detection.md
+++ b/docs/zh_CN/training/PP-ShiTu/mainbody_detection.md
@@ -116,7 +116,7 @@ pip install -r requirements.txt
 
 我们使用 [mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/configs/picodet/application/mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml) 配置进行训练,配置文件摘要如下:
 
-
+
 
 从上图看到 `mainbody_detection/picodet_lcnet_x2_5_640_mainbody.yml` 配置需要依赖其他的配置文件,这些配置文件的含义如下:
 
@@ -221,7 +221,7 @@ python tools/export_model.py -c configs/picodet/application/mainbody_detection/p
 
 导出模型之后,在主体检测与识别任务中,就可以将检测模型的路径更改为该 inference 模型路径,完成预测。
 
-以商品识别为例,其配置文件为 [inference_product.yaml](../../../deploy/configs/inference_product.yaml),修改其中的 `Global.det_inference_model_dir` 字段为导出的主体检测 inference 模型目录,参考[图像识别快速开始教程](../quick_start/quick_start_recognition.md),即可完成商品检测与识别过程。
+以商品识别为例,其配置文件为 [inference_product.yaml](../../../../deploy/configs/inference_product.yaml),修改其中的 `Global.det_inference_model_dir` 字段为导出的主体检测 inference 模型目录,参考[图像识别快速开始教程](../../quick_start/quick_start_recognition.md),即可完成商品检测与识别过程。
 
 
 ### 4.3 其他推理方式
diff --git a/docs/zh_CN/PULC/PULC_train.md b/docs/zh_CN/training/PULC.md
similarity index 89%
rename from docs/zh_CN/PULC/PULC_train.md
rename to docs/zh_CN/training/PULC.md
index 035535c7f9eb04af952c628fca85cedaaffc97b8..52ab17590bc7bc28cef8086f852d2ad9e1781802 100644
--- a/docs/zh_CN/PULC/PULC_train.md
+++ b/docs/zh_CN/training/PULC.md
@@ -32,7 +32,7 @@ PULC 方案在人、车、OCR等方向的多个场景中均验证有效,用超
 
 方案主要包括 4 部分,分别是:PP-LCNet轻量级骨干网络、SSLD预训练权重、数据增强策略集成(EDA)和 SKL-UGI 知识蒸馏算法。此外,我们还采用了超参搜索的方法,高效优化训练中的超参数。下面,我们以有人/无人场景为例,对方案进行说明。
 
-**备注**:针对一些特定场景,我们提供了基础的训练文档供参考,例如[有人/无人分类模型](PULC_person_exists.md)等,您可以在[这里](./PULC_model_list.md)找到这些文档。如果这些文档中的方法不能满足您的需求,或者您需要自定义训练任务,您可以参考本文档。
+**备注**:针对一些特定场景,我们提供了基础的训练文档供参考,例如[有人/无人分类模型](../models/PULC/PULC_person_exists.md)等,您可以在[这里](../models/PULC/model_list.md)找到这些文档。如果这些文档中的方法不能满足您的需求,或者您需要自定义训练任务,您可以参考本文档。
 
 
 
@@ -51,7 +51,7 @@ train/10.jpg 1
 ...
 ```
 
-如果您想获取更多常用分类数据集的信息,可以参考文档可以参考 [PaddleClas 分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+如果您想获取更多常用分类数据集的信息,可以参考文档可以参考 [PaddleClas 分类数据集格式说明](single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
 
@@ -105,7 +105,7 @@ cd ../
 
 #### 3.1 骨干网络PP-LCNet
 
-PULC 采用了轻量骨干网络 PP-LCNet,相比同精度竞品速度快 50%,您可以在[PP-LCNet介绍](../models/PP-LCNet.md)查阅该骨干网络的详细介绍。
+PULC 采用了轻量骨干网络 PP-LCNet,相比同精度竞品速度快 50%,您可以在[PP-LCNet介绍](../models/ImageNet1k/PP-LCNet.md)查阅该骨干网络的详细介绍。
 直接使用 PP-LCNet 训练的命令为:
 
 ```shell
@@ -152,14 +152,14 @@ python3 -m paddle.distributed.launch \
 
 #### 3.2 SSLD预训练权重
 
-SSLD 是百度自研的半监督蒸馏算法,在 ImageNet 数据集上,模型精度可以提升 3-7 个点,您可以在 [SSLD 介绍](../advanced_tutorials/ssld.md)找到详细介绍。我们发现,使用SSLD预训练权重,可以有效提升应用分类模型的精度。此外,在训练中使用更小的分辨率,可以有效提升模型精度。同时,我们也对学习率进行了优化。
+SSLD 是百度自研的半监督蒸馏算法,在 ImageNet 数据集上,模型精度可以提升 3-7 个点,您可以在 [SSLD 介绍](advanced/ssld.md)找到详细介绍。我们发现,使用SSLD预训练权重,可以有效提升应用分类模型的精度。此外,在训练中使用更小的分辨率,可以有效提升模型精度。同时,我们也对学习率进行了优化。
 基于以上三点改进,我们训练得到模型精度为 92.1%,提升 2.6%。
 
 
 
 #### 3.3 EDA数据增强策略
 
-数据增强是视觉算法中常用的优化策略,可以对模型精度有明显提升。除了传统的 RandomCrop,RandomFlip 等方法之外,我们还应用了 RandomAugment 和 RandomErasing。您可以在[数据增强介绍](../advanced_tutorials/DataAugmentation.md)找到详细介绍。
+数据增强是视觉算法中常用的优化策略,可以对模型精度有明显提升。除了传统的 RandomCrop,RandomFlip 等方法之外,我们还应用了 RandomAugment 和 RandomErasing。您可以在[数据增强介绍](config_discription/data_augmentation.md)找到详细介绍。
 由于这两种数据增强对图片的修改较大,使分类任务变难,在一些小数据集上可能会导致模型欠拟合,我们将提前设置好这两种方法启用的概率。
 基于以上改进,我们训练得到模型精度为 93.43%,提升 1.3%。
 
@@ -167,7 +167,7 @@ SSLD 是百度自研的半监督蒸馏算法,在 ImageNet 数据集上,模
 
 #### 3.4 SKL-UGI模型蒸馏
 
-模型蒸馏是一种可以有效提升小模型精度的方法,您可以在[知识蒸馏介绍](../advanced_tutorials/ssld.md)找到详细介绍。我们选择 ResNet101_vd 作为教师模型进行蒸馏。为了适应蒸馏过程,我们在此也对网络不同 stage 的学习率进行了调整。基于以上改进,我们训练得到模型精度为 95.6%,提升 1.4%。
+模型蒸馏是一种可以有效提升小模型精度的方法,您可以在[知识蒸馏介绍](advanced/ssld.md)找到详细介绍。我们选择 ResNet101_vd 作为教师模型进行蒸馏。为了适应蒸馏过程,我们在此也对网络不同 stage 的学习率进行了调整。基于以上改进,我们训练得到模型精度为 95.6%,提升 1.4%。
 
 
 
diff --git a/docs/zh_CN/others/feature_visiualization.md b/docs/zh_CN/training/advanced/feature_visiualization.md
similarity index 79%
rename from docs/zh_CN/others/feature_visiualization.md
rename to docs/zh_CN/training/advanced/feature_visiualization.md
index ee2eadcbed5d5531bcda4bbc4eef6e4229d36eac..22c1173c074115fa3df6613ac560e3e3b7096815 100644
--- a/docs/zh_CN/others/feature_visiualization.md
+++ b/docs/zh_CN/training/advanced/feature_visiualization.md
@@ -17,13 +17,13 @@
 
 ## 2. 准备工作
 
-首先需要选定研究的模型,本文设定 ResNet50 作为研究模型,将模型组网代码[resnet.py](../../../ppcls/arch/backbone/legendary_models/resnet.py)拷贝到[目录](../../../ppcls/utils/feature_maps_visualization/)下,并下载[ResNet50 预训练模型](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams),或使用以下命令下载。
+首先需要选定研究的模型,本文设定 ResNet50 作为研究模型,将模型组网代码[resnet.py](../../../../ppcls/arch/backbone/legendary_models/resnet.py)拷贝到[目录](../../../../ppcls/utils/feature_maps_visualization/)下,并下载[ResNet50 预训练模型](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams),或使用以下命令下载。
 
 ```bash
 wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrained.pdparams
 ```
 
-其他模型网络结构代码及预训练模型请自行下载:[模型库](../../../ppcls/arch/backbone/),[预训练模型](../algorithm_introduction/ImageNet_models.md)。
+其他模型网络结构代码及预训练模型请自行下载:[模型库](../../../ppcls/arch/backbone/),[预训练模型](../../models/ImageNet1k/model_list.md)。
 
  
 
@@ -49,7 +49,7 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/ResNet50_pretrain
         return x, fm
 ```
 
-然后修改代码[fm_vis.py](../../../ppcls/utils/feature_maps_visualization/fm_vis.py),引入 `ResNet50`,实例化 `net` 对象:
+然后修改代码[fm_vis.py](../../../../ppcls/utils/feature_maps_visualization/fm_vis.py),引入 `ResNet50`,实例化 `net` 对象:
 
 ```python
 from resnet import ResNet50
@@ -82,7 +82,7 @@ python tools/feature_maps_visualization/fm_vis.py \
 
 * 输入图片:  
 
-
+
 
 * 运行下面的特征图可视化脚本
 
@@ -99,4 +99,4 @@ python tools/feature_maps_visualization/fm_vis.py \
 
 * 输出特征图保存为 `output.png`,如下所示。
 
-
+
diff --git a/docs/zh_CN/advanced_tutorials/knowledge_distillation.md b/docs/zh_CN/training/advanced/knowledge_distillation.md
similarity index 87%
rename from docs/zh_CN/advanced_tutorials/knowledge_distillation.md
rename to docs/zh_CN/training/advanced/knowledge_distillation.md
index c7fbef0c23ef25f9ba8697784e879f4afda59c50..41c6f0e22e662d9850c55a2bfb292a6f5ab6bd7a 100644
--- a/docs/zh_CN/advanced_tutorials/knowledge_distillation.md
+++ b/docs/zh_CN/training/advanced/knowledge_distillation.md
@@ -16,6 +16,7 @@
         - [1.2.5 DKD](#1.2.5)
         - [1.2.6 DIST](#1.2.6)
         - [1.2.7 MGD](#1.2.7)
+        - [1.2.8 WSL](#1.2.8)
 - [2. 使用方法](#2)
     - [2.1 环境配置](#2.1)
     - [2.2 数据准备](#2.2)
@@ -91,7 +92,7 @@ Park 等人提出了 RKD [10],基于关系的知识蒸馏算法,RKD 中进
 
 SSLD是百度于2021年提出的一种简单的半监督知识蒸馏方案,通过设计一种改进的JS散度作为损失函数,结合基于ImageNet22k数据集的数据挖掘策略,最终帮助15个骨干网络模型的精度平均提升超过3%。
 
-更多关于SSLD的原理、模型库与使用介绍,请参考:[SSLD知识蒸馏算法介绍](./ssld.md)。
+更多关于SSLD的原理、模型库与使用介绍,请参考:[SSLD知识蒸馏算法介绍](ssld.md)。
 
 
 ##### 1.2.1.2 SSLD 配置
@@ -152,8 +153,8 @@ DML论文中,在蒸馏的过程中,不依赖于教师模型,两个结构
 
 | 策略 | 骨干网络 | 配置文件 | Top-1 acc | 下载链接 |
 | --- | --- | --- | --- | --- |
-| baseline | PPLCNet_x2_5 | [PPLCNet_x2_5.yaml](../../../ppcls/configs/ImageNet/PPLCNet/PPLCNet_x2_5.yaml) | 74.93% | - |
-| DML | PPLCNet_x2_5 | [PPLCNet_x2_5_dml.yaml](../../../ppcls/configs/ImageNet/Distillation/PPLCNet_x2_5_dml.yaml) | 76.68%(**+1.75%**) | - |
+| baseline | PPLCNet_x2_5 | [PPLCNet_x2_5.yaml](../../../../ppcls/configs/ImageNet/PPLCNet/PPLCNet_x2_5.yaml) | 74.93% | - |
+| DML | PPLCNet_x2_5 | [PPLCNet_x2_5_dml.yaml](../../../../ppcls/configs/ImageNet/Distillation/PPLCNet_x2_5_dml.yaml) | 76.68%(**+1.75%**) | - |
 
 
 * 注:完整的PPLCNet_x2_5模型训练了360epoch,这里为了方便对比,baseline和DML均训练了100epoch,因此指标比官网最终开源出来的模型精度(76.60%)低一些。
@@ -211,8 +212,8 @@ UDML 是百度飞桨视觉团队提出的无需依赖教师模型的知识蒸馏
 
 | 策略 | 骨干网络 | 配置文件 | Top-1 acc | 下载链接 |
 | --- | --- | --- | --- | --- |
-| baseline | PPLCNet_x2_5 | [PPLCNet_x2_5.yaml](../../../ppcls/configs/ImageNet/PPLCNet/PPLCNet_x2_5.yaml) | 74.93% | - |
-| UDML | PPLCNet_x2_5 | [PPLCNet_x2_5_dml.yaml](../../../ppcls/configs/ImageNet/Distillation/PPLCNet_x2_5_udml.yaml) | 76.74%(**+1.81%**) | - |
+| baseline | PPLCNet_x2_5 | [PPLCNet_x2_5.yaml](../../../../ppcls/configs/ImageNet/PPLCNet/PPLCNet_x2_5.yaml) | 74.93% | - |
+| UDML | PPLCNet_x2_5 | [PPLCNet_x2_5_dml.yaml](../../../../ppcls/configs/ImageNet/Distillation/PPLCNet_x2_5_udml.yaml) | 76.74%(**+1.81%**) | - |
 
 
 ##### 1.2.3.2 UDML 配置
@@ -263,7 +264,7 @@ Loss:
         weight: 1.0
 ```
 
-**注意(:** 上述在网络中指定`return_patterns`,返回中间层特征的功能是基于TheseusLayer,更多关于TheseusLayer的使用说明,请参考:[TheseusLayer 使用说明](./theseus_layer.md)。
+**注意(:** 上述在网络中指定`return_patterns`,返回中间层特征的功能是基于TheseusLayer,更多关于TheseusLayer的使用说明,请参考:[TheseusLayer 使用说明](theseus_layer.md)。
 
 
 
@@ -287,8 +288,8 @@ AFD提出在蒸馏的过程中,利用基于注意力的元网络学习特征
 
 | 策略 | 骨干网络 | 配置文件 | Top-1 acc | 下载链接 |
 | --- | --- | --- | --- | --- |
-| baseline | ResNet18 | [ResNet18.yaml](../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
-| AFD | ResNet18 | [resnet34_distill_resnet18_afd.yaml](../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_afd.yaml) | 71.68%(**+0.88%**) | - |
+| baseline | ResNet18 | [ResNet18.yaml](../../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
+| AFD | ResNet18 | [resnet34_distill_resnet18_afd.yaml](../../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_afd.yaml) | 71.68%(**+0.88%**) | - |
 
 注意:这里为了与论文的训练配置保持对齐,设置训练的迭代轮数为100epoch,因此baseline精度低于PaddleClas中开源出的模型精度(71.0%)
 
@@ -375,7 +376,7 @@ Loss:
         weight: 1.0
 ```
 
-**注意(:** 上述在网络中指定`return_patterns`,返回中间层特征的功能是基于TheseusLayer,更多关于TheseusLayer的使用说明,请参考:[TheseusLayer 使用说明](./theseus_layer.md)。
+**注意(:** 上述在网络中指定`return_patterns`,返回中间层特征的功能是基于TheseusLayer,更多关于TheseusLayer的使用说明,请参考:[TheseusLayer 使用说明](theseus_layer.md)。
 
 
 
@@ -398,8 +399,8 @@ DKD将蒸馏中常用的 KD Loss 进行了解耦成为Target Class Knowledge Dis
 
 | 策略 | 骨干网络 | 配置文件 | Top-1 acc | 下载链接 |
 | --- | --- | --- | --- | --- |
-| baseline | ResNet18 | [ResNet18.yaml](../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
-| AFD | ResNet18 | [resnet34_distill_resnet18_dkd.yaml](../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_dkd.yaml) | 72.59%(**+1.79%**) | - |
+| baseline | ResNet18 | [ResNet18.yaml](../../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
+| DKD | ResNet18 | [resnet34_distill_resnet18_dkd.yaml](../../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_dkd.yaml) | 72.59%(**+1.79%**) | - |
 
 
 ##### 1.2.5.2 DKD 配置
@@ -466,8 +467,8 @@ Loss:
 
 | 策略 | 骨干网络 | 配置文件 | Top-1 acc | 下载链接 |
 | --- | --- | --- | --- | --- |
-| baseline | ResNet18 | [ResNet18.yaml](../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
-| DIST | ResNet18 | [resnet34_distill_resnet18_dist.yaml](../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_dist.yaml) | 71.99%(**+1.19%**) | - |
+| baseline | ResNet18 | [ResNet18.yaml](../../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
+| DIST | ResNet18 | [resnet34_distill_resnet18_dist.yaml](../../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_dist.yaml) | 71.99%(**+1.19%**) | - |
 
 
 ##### 1.2.6.2 DIST 配置
@@ -532,8 +533,8 @@ Loss:
 
 | 策略 | 骨干网络 | 配置文件 | Top-1 acc | 下载链接 |
 | --- | --- | --- | --- | --- |
-| baseline | ResNet18 | [ResNet18.yaml](../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
-| MGD | ResNet18 | [resnet34_distill_resnet18_mgd.yaml](../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_mgd.yaml) | 71.86%(**+1.06%**) | - |
+| baseline | ResNet18 | [ResNet18.yaml](../../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
+| MGD | ResNet18 | [resnet34_distill_resnet18_mgd.yaml](../../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_mgd.yaml) | 71.86%(**+1.06%**) | - |
 
 
 ##### 1.2.7.2 MGD 配置
@@ -583,6 +584,73 @@ Loss:
         weight: 1.0
 ```
 
+
+
+#### 1.2.8 WSL
+
+##### 1.2.8.1 WSL 算法介绍
+
+论文信息:
+
+
+> [Rethinking Soft Labels For Knowledge Distillation: A Bias-variance Tradeoff Perspective](https://arxiv.org/abs/2102.0650)
+>
+> Helong Zhou, Liangchen Song, Jiajie Chen, Ye Zhou, Guoli Wang, Junsong Yuan, Qian Zhang
+>
+> ICLR, 2021
+
+WSL (Weighted Soft Labels) 损失函数根据教师模型与学生模型关于真值标签的 CE Loss 比值,对每个样本的 KD Loss 分别赋予权重。若学生模型相对教师模型在某个样本上预测结果更好,则对该样本赋予较小的权重。该方法简单、有效,使各个样本的权重可自适应调节,提升了蒸馏精度。
+
+在ImageNet1k公开数据集上,效果如下所示。
+
+| 策略 | 骨干网络 | 配置文件 | Top-1 acc | 下载链接 |
+| --- | --- | --- | --- | --- |
+| baseline | ResNet18 | [ResNet18.yaml](../../../../ppcls/configs/ImageNet/ResNet/ResNet18.yaml) | 70.8% | - |
+| WSL | ResNet18 | [resnet34_distill_resnet18_wsl.yaml](../../../../ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_wsl.yaml) | 72.23%(**+1.43%**) | - |
+
+
+##### 1.2.8.2 WSL 配置
+
+WSL 配置如下所示。在模型构建Arch字段中,需要同时定义学生模型与教师模型,教师模型固定参数,且需要加载预训练模型。在损失函数Loss字段中,需要定义`DistillationGTCELoss`(学生与真值标签之间的CE loss)以及`DistillationWSLLoss`(学生与教师之间的WSL loss),作为训练的损失函数。
+
+
+```yaml
+# model architecture
+Arch:
+  name: "DistillationModel"
+  # if not null, its lengths should be same as models
+  pretrained_list:
+  # if not null, its lengths should be same as models
+  freeze_params_list:
+  - True
+  - False
+  models:
+    - Teacher:
+        name: ResNet34
+        pretrained: True
+
+    - Student:
+        name: ResNet18
+        pretrained: False
+
+  infer_model_name: "Student"
+
+
+# loss function config for traing/eval process
+Loss:
+  Train:
+    - DistillationGTCELoss:
+        weight: 1.0
+        model_names: ["Student"]
+    - DistillationWSLLoss:
+        weight: 2.5
+        model_name_pairs: [["Student", "Teacher"]]
+        temperature: 2
+  Eval:
+    - CELoss:
+        weight: 1.0
+```
+
 
 
 ## 2. 模型训练、评估和预测
@@ -591,7 +659,7 @@ Loss:
 
 ### 2.1 环境配置
 
-* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../../installation.md) 配置 PaddleClas 运行环境。
 
 
 
@@ -633,7 +701,7 @@ cat train_list.txt train_list_unlabel.txt > train_list_all.txt
 
 **备注:**
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
 
@@ -641,7 +709,7 @@ cat train_list.txt train_list_unlabel.txt > train_list_all.txt
 ### 2.3 模型训练
 
 
-以SSLD知识蒸馏算法为例,介绍知识蒸馏算法的模型训练、评估、预测等过程。配置文件为 [PPLCNet_x2_5_ssld.yaml](../../../ppcls/configs/ImageNet/Distillation/PPLCNet_x2_5_ssld.yaml) ,使用下面的命令可以完成模型训练。
+以SSLD知识蒸馏算法为例,介绍知识蒸馏算法的模型训练、评估、预测等过程。配置文件为 [PPLCNet_x2_5_ssld.yaml](../../../../ppcls/configs/ImageNet/Distillation/PPLCNet_x2_5_ssld.yaml) ,使用下面的命令可以完成模型训练。
 
 
 ```shell
@@ -710,7 +778,7 @@ python3 tools/export_model.py \
 
 最终在`inference`目录下会产生`inference.pdiparams`、`inference.pdiparams.info`、`inference.pdmodel` 3个文件。
 
-关于更多模型推理相关的教程,请参考:[Python 预测推理](../inference_deployment/python_deploy.md)。
+关于更多模型推理相关的教程,请参考:[Python 预测推理](../../deployment/image_classification/python.md)。
 
 
 
diff --git a/docs/zh_CN/advanced_tutorials/model_prune_quantization.md b/docs/zh_CN/training/advanced/prune_quantization.md
similarity index 88%
rename from docs/zh_CN/advanced_tutorials/model_prune_quantization.md
rename to docs/zh_CN/training/advanced/prune_quantization.md
index f6b4afcece45505c40f32cce7b6b09586961ca51..103b1c60be79dc14d009a0670d942c079dfefdd4 100644
--- a/docs/zh_CN/advanced_tutorials/model_prune_quantization.md
+++ b/docs/zh_CN/training/advanced/prune_quantization.md
@@ -11,7 +11,7 @@
 本教程将介绍如何使用飞桨模型压缩库 PaddleSlim 做 PaddleClas 模型的压缩,即裁剪、量化功能。
 [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim)集成了模型剪枝、量化(包括量化训练和离线量化)、蒸馏和神经网络搜索等多种业界常用且领先的模型压缩功能,如果您感兴趣,可以关注并了解。
 
-在开始本教程之前,建议先了解 [PaddleClas 模型的训练方法](../models_training/classification.md)以及 [PaddleSlim](https://paddleslim.readthedocs.io/zh_CN/latest/index.html),相关裁剪、量化方法可以参考[模型裁剪量化算法介绍文档](../algorithm_introduction/model_prune_quantization.md)。
+在开始本教程之前,建议先了解 [PaddleClas 模型的训练方法](../single_label_classification/training.md)以及 [PaddleSlim](https://paddleslim.readthedocs.io/zh_CN/latest/index.html),相关裁剪、量化方法可以参考[模型裁剪量化算法介绍文档](../../algorithm_introduction/prune_quantization.md)。
 
 -----------
 
@@ -61,7 +61,7 @@ python3.7 setup.py install
 
 ### 1.2 准备训练好的模型
 
-PaddleClas 提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../models_training/classification.md)方法得到训练好的模型。
+PaddleClas 提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../single_label_classification/training.md)方法得到训练好的模型。
 
 
 ## 2. 快速开始
@@ -92,7 +92,7 @@ cd PaddleClas
 python3.7 tools/train.py -c ppcls/configs/slim/ResNet50_vd_quantization.yaml -o Global.device=cpu
 ```
 
-其中 `yaml` 文件解析详见[参考文档](../models_training/config_description.md)。为了保证精度,`yaml` 文件中已经使用 `pretrained model`.
+其中 `yaml` 文件解析详见[参考文档](../config_discription/basic.md)。为了保证精度,`yaml` 文件中已经使用 `pretrained model`.
 
 
 * 单机多卡/多机多卡启动
@@ -108,7 +108,7 @@ python3.7 -m paddle.distributed.launch \
 
 #### 2.1.2 离线量化
 
-**注意**:目前离线量化,必须使用已经训练好的模型,导出的 `inference model` 进行量化。一般模型导出 `inference model` 可参考[教程](../inference_deployment/export_model.md).
+**注意**:目前离线量化,必须使用已经训练好的模型,导出的 `inference model` 进行量化。一般模型导出 `inference model` 可参考[教程](../../deployment/export_model.md).
 
 一般来说,离线量化损失模型精度较多。
 
@@ -160,10 +160,10 @@ python3.7 tools/export.py \
 
 ## 4. 模型部署
 
-上述步骤导出的模型可以直接使用 inferecne 进行部署,参考 [inference 部署](../inference_deployment/)。
+上述步骤导出的模型可以直接使用 inferecne 进行部署,参考 [inference 部署](../../deployment/)。
 
 也通过 PaddleLite 的 opt 模型转换工具,完成 inference 模型到移动端模型转换,用于移动端的模型部署。
-移动端模型部署的可参考 [移动端模型部署](../inference_deployment/paddle_lite_deploy.md)。
+移动端模型部署的可参考 [移动端模型部署](../../deployment/image_classification/paddle_lite.md)。
 
 
 ## 5. 训练超参数建议
diff --git a/docs/zh_CN/advanced_tutorials/ssld.md b/docs/zh_CN/training/advanced/ssld.md
similarity index 98%
rename from docs/zh_CN/advanced_tutorials/ssld.md
rename to docs/zh_CN/training/advanced/ssld.md
index e19a98cbc866bc02f0ca9df6d8e939b3342663f5..44b0ff14b99747a4ba8103f33283be89f5e7360c 100644
--- a/docs/zh_CN/advanced_tutorials/ssld.md
+++ b/docs/zh_CN/training/advanced/ssld.md
@@ -80,7 +80,7 @@ SSLD 蒸馏方案的一大特色就是无需使用图像的真值标签,因此
 
 此外,在无标注数据选择的过程中,我们发现使用更加通用的数据,即使不需要严格的数据筛选过程,也可以帮助知识蒸馏任务获得稳定的精度提升,因而提出了SKL-UGI (Symmetrical-KL Unlabeled General Images distillation)知识蒸馏方案。
 
-通用数据可以使用ImageNet数据或者与场景相似的数据集。更多关于SKL-UGI的应用,请参考:[超轻量图像分类方案PULC使用教程](../PULC/PULC_train.md)。
+通用数据可以使用ImageNet数据或者与场景相似的数据集。更多关于SKL-UGI的应用,请参考:[超轻量图像分类方案PULC使用教程](../PULC.md)。
 
 
 
@@ -154,9 +154,9 @@ python3 -m paddle.distributed.launch --gpus="0,1,2,3" tools/train.py -c ppcls/co
 cat train_list.txt train_list_unlabel.txt > train_list_all.txt
 ```
 
-更多关于图像分类任务的数据标签说明,请参考:[PaddleClas图像分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明)
+更多关于图像分类任务的数据标签说明,请参考:[PaddleClas图像分类数据集格式说明](../single_label_classification/dataset.md#1-数据集格式说明)
 
-PaddleClas中集成了PULC超轻量图像分类实用方案,里面包含SSLD ImageNet预训练模型的使用以及更加通用的无标签数据的知识蒸馏方案,更多详细信息,请参考[PULC超轻量图像分类实用方案使用教程](../PULC/PULC_train.md)。
+PaddleClas中集成了PULC超轻量图像分类实用方案,里面包含SSLD ImageNet预训练模型的使用以及更加通用的无标签数据的知识蒸馏方案,更多详细信息,请参考[PULC超轻量图像分类实用方案使用教程](../PULC.md)。
 
 
 
diff --git a/docs/zh_CN/advanced_tutorials/theseus_layer.md b/docs/zh_CN/training/advanced/theseus_layer.md
similarity index 97%
rename from docs/zh_CN/advanced_tutorials/theseus_layer.md
rename to docs/zh_CN/training/advanced/theseus_layer.md
index b0006ed15fc0e007d1061bff686644b516ff624c..9ae7937b00b8b828fc94ed914b35dd751aff5886 100644
--- a/docs/zh_CN/advanced_tutorials/theseus_layer.md
+++ b/docs/zh_CN/training/advanced/theseus_layer.md
@@ -44,7 +44,7 @@ class net(TheseusLayer):
 * 以 `.` 作为网络层级的分隔符;
 * 对于 `nn.Sequential` 类型或是 `nn.LayerList` 类型的层,使用 `["index"]` 指定其子层。
 
-以 `MobileNetV1` 网络为例,其模型结构定义在 [MobileNetV1](../../../ppcls/arch/backbone/legendary_models/mobilenet_v1.py),为方便说明,可参考下方网络结构及不同网络层所对应的网络层描述符。可以清晰看出,对于 `MobileNetV1` 网络的任一子层,均可按层级结构逐层指定,不同层级结构间使用 `.` 进行分隔即可。
+以 `MobileNetV1` 网络为例,其模型结构定义在 [MobileNetV1](../../../../ppcls/arch/backbone/legendary_models/mobilenet_v1.py),为方便说明,可参考下方网络结构及不同网络层所对应的网络层描述符。可以清晰看出,对于 `MobileNetV1` 网络的任一子层,均可按层级结构逐层指定,不同层级结构间使用 `.` 进行分隔即可。
 
 ```shell
 # 网络层对象的变量名(该对象所属类)....................(该网络层对应的网络层描述符)
diff --git a/docs/zh_CN/others/train_on_xpu.md b/docs/zh_CN/training/advanced/train_on_xpu.md
similarity index 86%
rename from docs/zh_CN/others/train_on_xpu.md
rename to docs/zh_CN/training/advanced/train_on_xpu.md
index 429119b588a53ecbaa29a7d71485a7d47308c871..17e20262d059c0e78279191989f9d30ddcbfa8c6 100644
--- a/docs/zh_CN/others/train_on_xpu.md
+++ b/docs/zh_CN/training/advanced/train_on_xpu.md
@@ -3,10 +3,10 @@
 ## 目录
 * [1. 前言](#1)
 * [2. 昆仑训练](#2)
-	* [2.1 ResNet50](#2.1)
-	* [2.2 MobileNetV3](#2.2)
-	* [2.3 HRNet](#2.3)
-	* [2.4 VGG16/19](#2.4)
+    * [2.1 ResNet50](#2.1)
+    * [2.2 MobileNetV3](#2.2)
+    * [2.3 HRNet](#2.3)
+    * [2.4 VGG16/19](#2.4)
 
  
 
@@ -17,7 +17,7 @@
 
 
 ## 2. 昆仑训练
-* 数据来源和预训练模型参考[quick_start](../quick_start/quick_start_classification_new_user.md)。昆仑训练效果与 CPU/GPU 对齐。
+* 数据来源和预训练模型参考[quick_start](../../quick_start/quick_start_classification_new_user.md)。昆仑训练效果与 CPU/GPU 对齐。
 
 
 
diff --git a/docs/zh_CN/others/VisualDL.md b/docs/zh_CN/training/config_discription/VisualDL.md
similarity index 97%
rename from docs/zh_CN/others/VisualDL.md
rename to docs/zh_CN/training/config_discription/VisualDL.md
index b1ccb961736b18b7f03db4b68af16d325d0e833e..4e866d8568976976d2c329d237ec478a0d75e61d 100644
--- a/docs/zh_CN/others/VisualDL.md
+++ b/docs/zh_CN/training/config_discription/VisualDL.md
@@ -53,4 +53,4 @@ python3 tools/train.py -c config.yaml
 
 在启动 VisualDL 后,即可在浏览器中查看训练过程,输入地址 `127.0.0.1:8840`:
 
-
+
diff --git a/docs/zh_CN/models_training/config_description.md b/docs/zh_CN/training/config_discription/basic.md
similarity index 95%
rename from docs/zh_CN/models_training/config_description.md
rename to docs/zh_CN/training/config_discription/basic.md
index 8c51d7abcfe5baeb19cad1043f73df10832dcada..64567ba42ad0e8da3a7b2335ae9da0cc38fe9391 100644
--- a/docs/zh_CN/models_training/config_description.md
+++ b/docs/zh_CN/training/config_discription/basic.md
@@ -30,12 +30,12 @@
 - [3. 识别模型](#3)
   - [3.1 结构(Arch)](#3.1)
   - [3.2 评估指标(Metric)](#3.2)
-  
+
 
 
 ### 1.分类模型
 
-此处以 `ResNet50_vd` 在 `ImageNet-1k` 上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml)。
+此处以 `ResNet50_vd` 在 `ImageNet-1k` 上的训练配置为例,详解各个参数的意义。[配置路径](../../../../ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml)。
 
 
 #### 1.1 全局配置(Global)
@@ -102,7 +102,7 @@
     values: [0.1, 0.01, 0.001, 0.0001]
 ```
 
-添加方法及参数请查看 [learning_rate.py](../../../ppcls/optimizer/learning_rate.py)。
+添加方法及参数请查看 [learning_rate.py](../../../../ppcls/optimizer/learning_rate.py)。
 
 
 #### 1.5 数据读取模块(DataLoader)
@@ -181,7 +181,7 @@ batch_transform_ops 中参数的含义:
 
 ### 2.蒸馏模型
 
-**注**:此处以 `MobileNetV3_large_x1_0` 在 `ImageNet-1k` 上蒸馏 `MobileNetV3_small_x1_0` 的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/ImageNet/Distillation/mv3_large_x1_0_distill_mv3_small_x1_0.yaml)。这里只介绍与分类模型有区别的参数。
+**注**:此处以 `MobileNetV3_large_x1_0` 在 `ImageNet-1k` 上蒸馏 `MobileNetV3_small_x1_0` 的训练配置为例,详解各个参数的意义。[配置路径](../../../../ppcls/configs/ImageNet/Distillation/mv3_large_x1_0_distill_mv3_small_x1_0.yaml)。这里只介绍与分类模型有区别的参数。
 
 
 #### 2.1 结构(Arch)
@@ -234,7 +234,7 @@ batch_transform_ops 中参数的含义:
 
 ### 3. 识别模型
 
-**注**:此处以 `ResNet50` 在 `LogoDet-3k` 上的训练配置为例,详解各个参数的意义。[配置路径](../../../ppcls/configs/Logo/ResNet50_ReID.yaml)。这里只介绍与分类模型有区别的参数。
+**注**:此处以 `ResNet50` 在 `LogoDet-3k` 上的训练配置为例,详解各个参数的意义。[配置路径](../../../../ppcls/configs/Logo/ResNet50_ReID.yaml)。这里只介绍与分类模型有区别的参数。
 
 
 #### 3.1 结构(Arch)
diff --git a/docs/zh_CN/advanced_tutorials/DataAugmentation.md b/docs/zh_CN/training/config_discription/data_augmentation.md
similarity index 95%
rename from docs/zh_CN/advanced_tutorials/DataAugmentation.md
rename to docs/zh_CN/training/config_discription/data_augmentation.md
index 7097ff637b9f204f19d596445b2d0376e7b52d3b..0a4f9e13059741b172ff662ff570e8977ef361d8 100644
--- a/docs/zh_CN/advanced_tutorials/DataAugmentation.md
+++ b/docs/zh_CN/training/config_discription/data_augmentation.md
@@ -51,7 +51,7 @@
 
 在图像分类任务中,图像数据的增广是一种常用的正则化方法,常用于数据量不足或者模型参数较多的场景。在本章节中,我们将对除 ImageNet 分类任务标准数据增强外的 8 种数据增强方式进行简单的介绍和对比,用户也可以将这些增广方法应用到自己的任务中,以获得模型精度的提升。这 8 种数据增强方式在 ImageNet 上的精度指标如下所示。
 
-
+
 
 更具体的指标如下表所示:
 
@@ -91,7 +91,7 @@
 
 增广后的可视化效果如下所示。
 
-
+
 
 具体如下表所示:
 
@@ -147,7 +147,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策
 
 `AotoAugment` 的图像增广方式的配置如下。`AutoAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
 
-```yaml        
+```yaml  
       transform_ops:
         - DecodeImage:
             to_rgb: True
@@ -192,7 +192,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策
 
 `RandAugment` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `num_layers` 与 `magnitude`,默认的数值分别是 `2` 和 `5`。`RandAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
 
-```yaml        
+```yaml  
       transform_ops:
         - DecodeImage:
             to_rgb: True
@@ -229,7 +229,7 @@ PaddleClas 中集成了上述所有的数据增强策略,每种数据增强策
 
 `TimmAutoAugment` 的图像增广方式的配置如下,其中用户需要指定其中的参数 `config_str`、`interpolation`、`img_size`,默认的数值分别是 `rand-m9-mstd0.5-inc1`、`bicubic`、`224`。`TimmAutoAugment` 是在 uint8 的数据格式上转换的,所以其处理过程应该放在归一化操作(`NormalizeImage`)之前。
 
-```yaml        
+```yaml  
       transform_ops:
         - DecodeImage:
             to_rgb: True
@@ -604,14 +604,14 @@ Mixup 是最先提出的图像混叠增广方案,其原理简单、方便实
 
 
 ## 2. 模型训练、评估和预测
-    
+
   
 
 ### 2.1 环境配置
 
-* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../installation/install_paddleclas.md) 配置 PaddleClas 运行环境。
+* 安装:请先参考 [Paddle 安装教程](../installation/install_paddle.md) 以及 [PaddleClas 安装教程](../../installation.md) 配置 PaddleClas 运行环境。
 
- 
+
 
 ### 2.2 数据准备
 
@@ -640,15 +640,15 @@ cd path_to_PaddleClas
 ```
 
 其中 `train/` 和 `val/` 分别为训练集和验证集。`train_list.txt` 和 `val_list.txt` 分别为训练集和验证集的标签文件。
-    
-**备注:** 
 
-* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../data_preparation/classification_dataset.md#1-数据集格式说明) 。
+**备注:**
+
+* 关于 `train_list.txt`、`val_list.txt`的格式说明,可以参考[PaddleClas分类数据集格式说明](../single_label_classification/dataset.md#1-数据集格式说明) 。
 
 
- 
+
 
-### 2.3 模型训练 
+### 2.3 模型训练
 
 
 在 `ppcls/configs/ImageNet/DataAugment` 中提供了基于 ResNet50 的不同的数据增强的训练配置,这里以使用 `AutoAugment` 为例,介绍数据增强的使用方法。可以通过如下脚本启动训练:
@@ -658,11 +658,11 @@ export CUDA_VISIBLE_DEVICES=0,1,2,3
 python3 -m paddle.distributed.launch \
     --gpus="0,1,2,3" \
     tools/train.py \
-        -c ppcls/configs/ImageNet/DataAugment/ResNet50_AutoAugment.yaml 
+        -c ppcls/configs/ImageNet/DataAugment/ResNet50_AutoAugment.yaml
 ```
 
 
-**备注:** 
+**备注:**
 
 * 1.当前精度最佳的模型会保存在 `output/ResNet50/best_model.pdparams`。
 * 2.如需更改数据增强类型,只需要替换`ppcls/configs/ImageNet/DataAugment`中的其他的配置文件即可。
@@ -670,7 +670,7 @@ python3 -m paddle.distributed.launch \
 * 4.由于图像混叠时需对 label 进行混叠,无法计算训练数据的准确率,所以在训练过程中没有打印训练准确率。
 * 5.在使用数据增强后,由于训练数据更难,所以训练损失函数可能较大,训练集的准确率相对较低,但其有拥更好的泛化能力,所以验证集的准确率相对较高。
 * 6.在使用数据增强后,模型可能会趋于欠拟合状态,建议可以适当的调小 `l2_decay` 的值来获得更高的验证集准确率。
-* 7.几乎每一类图像增强均含有超参数,我们只提供了基于 ImageNet-1k 的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考[训练技巧](../models_training/train_strategy.md)。
+* 7.几乎每一类图像增强均含有超参数,我们只提供了基于 ImageNet-1k 的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考[训练技巧](../single_label_classification/training_strategy.md)。
 
 
 
@@ -695,7 +695,7 @@ python3 tools/eval.py \
 ```python
 python3 tools/infer.py \
     -c ppcls/configs/ImageNet/DataAugment/ResNet50_AutoAugment.yaml \
-    -o Global.pretrained_model=output/ResNet50/best_model 
+    -o Global.pretrained_model=output/ResNet50/best_model
 ```
 
 输出结果如下:
@@ -704,12 +704,12 @@ python3 tools/infer.py \
 [{'class_ids': [8, 7, 86, 81, 85], 'scores': [0.91347, 0.03779, 0.0036, 0.00117, 0.00112], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ptarmigan', 'quail']}]
 ```
 
-**备注:** 
+**备注:**
 
 * 这里`-o Global.pretrained_model="output/ResNet50/best_model"` 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
-    
+
 * 默认是对 `docs/images/inference_deployment/whl_demo.jpg` 进行预测,此处也可以通过增加字段 `-o Infer.infer_imgs=xxx` 对其他图片预测。
-    
+
 * 默认输出的是 Top-5 的值,如果希望输出 Top-k 的值,可以指定`-o Infer.PostProcess.topk=k`,其中,`k` 为您指定的值。
 
 
@@ -737,14 +737,14 @@ python3 tools/infer.py \
 
 
 
-[test_baseline]: ../../images/image_aug/test_baseline.jpeg
-[test_autoaugment]: ../../images/image_aug/test_autoaugment.jpeg
-[test_cutout]: ../../images/image_aug/test_cutout.jpeg
-[test_gridmask]: ../../images/image_aug/test_gridmask.jpeg
-[gridmask-0]: ../../images/image_aug/gridmask-0.png
-[test_hideandseek]: ../../images/image_aug/test_hideandseek.jpeg
-[test_randaugment]: ../../images/image_aug/test_randaugment.jpeg
-[test_randomerassing]: ../../images/image_aug/test_randomerassing.jpeg
-[hide_and_seek_mask_expanation]: ../../images/image_aug/hide-and-seek-visual.png
-[test_mixup]: ../../images/image_aug/test_mixup.png
-[test_cutmix]: ../../images/image_aug/test_cutmix.png
+[test_baseline]: ../../../images/image_aug/test_baseline.jpeg
+[test_autoaugment]: ../../../images/image_aug/test_autoaugment.jpeg
+[test_cutout]: ../../../images/image_aug/test_cutout.jpeg
+[test_gridmask]: ../../../images/image_aug/test_gridmask.jpeg
+[gridmask-0]: ../../../images/image_aug/gridmask-0.png
+[test_hideandseek]: ../../../images/image_aug/test_hideandseek.jpeg
+[test_randaugment]: ../../../images/image_aug/test_randaugment.jpeg
+[test_randomerassing]: ../../../images/image_aug/test_randomerassing.jpeg
+[hide_and_seek_mask_expanation]: ../../../images/image_aug/hide-and-seek-visual.png
+[test_mixup]: ../../../images/image_aug/test_mixup.png
+[test_cutmix]: ../../../images/image_aug/test_cutmix.png
diff --git a/docs/zh_CN/others/train_with_DALI.md b/docs/zh_CN/training/config_discription/train_with_DALI.md
similarity index 100%
rename from docs/zh_CN/others/train_with_DALI.md
rename to docs/zh_CN/training/config_discription/train_with_DALI.md
diff --git a/docs/zh_CN/data_preparation/recognition_dataset.md b/docs/zh_CN/training/metric_learning/dataset.md
similarity index 100%
rename from docs/zh_CN/data_preparation/recognition_dataset.md
rename to docs/zh_CN/training/metric_learning/dataset.md
diff --git a/docs/zh_CN/models_training/recognition.md b/docs/zh_CN/training/metric_learning/training.md
similarity index 95%
rename from docs/zh_CN/models_training/recognition.md
rename to docs/zh_CN/training/metric_learning/training.md
index 32777d6acc686453dfd43e51a037de4b79081320..07c86e1af8d840b7e832cf245267761c3558b09d 100644
--- a/docs/zh_CN/models_training/recognition.md
+++ b/docs/zh_CN/training/metric_learning/training.md
@@ -14,11 +14,11 @@
 
  -在Android端或PC端体验整体图像识别系统,或查看特征库建立方法,可以参考 [图像识别快速开始文档](../quick_start/quick_start_recognition.md)。
+在Android端或PC端体验整体图像识别系统,或查看特征库建立方法,可以参考 [图像识别快速开始文档](../../quick_start/quick_start_recognition.md)。
 
 以下内容,主要对上述三个步骤的训练部分进行介绍。
 
-在训练开始之前,请参考 [安装指南](../installation/install_paddleclas.md) 配置运行环境。
+在训练开始之前,请参考 [安装指南](../../installation.md) 配置运行环境。
 
 ##  目录
 
@@ -45,7 +45,7 @@
 
 关于主体检测数据集构造与模型训练方法可以参考: [30分钟快速上手PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/docs/tutorials/GETTING_STARTED_cn.md#30%E5%88%86%E9%92%9F%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8Bpaddledetection)。
 
-更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../image_recognition_pipeline/mainbody_detection.md)。
+更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../PP-ShiTu/mainbody_detection.md)。
 
 
 
@@ -163,7 +163,7 @@ python3.7 -m paddle.distributed.launch tools/train.py \
 
 **注**:其中,`-c` 用于指定配置文件的路径,`-o` 用于指定需要修改或者添加的参数,其中 `-o Arch.Backbone.pretrained=True` 表示 Backbone 在训练开始前会加载预训练模型;`-o Arch.Backbone.pretrained` 也可以指定为模型权重文件的路径,使用时换成自己的预训练模型权重文件的路径即可;`-o Global.device=gpu` 表示使用 GPU 进行训练。如果希望使用 CPU 进行训练,则设置 `-o Global.device=cpu`即可。
 
-更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md)。
+更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](../config_discription/basic.md)。
 
 运行上述训练命令,可以看到输出日志,示例如下:
 
@@ -177,7 +177,7 @@ python3.7 -m paddle.distributed.launch tools/train.py \
 
 此处配置文件的 Backbone 是 MobileNetV1,如果想使用其他 Backbone,可以重写参数 `Arch.Backbone.name`,比如命令中增加 `-o Arch.Backbone.name={其他 Backbone 的名字}`。此外,由于不同模型 `Neck` 部分的输入维度不同,更换 Backbone 后可能需要改写 `Neck` 的输入大小,改写方式类似替换 Backbone 的名字。
 
-在训练 Loss 部分,此处使用了 [CELoss](../../../ppcls/loss/celoss.py) 和 [TripletLossV2](../../../ppcls/loss/triplet.py),配置文件如下:
+在训练 Loss 部分,此处使用了 [CELoss](../../../../ppcls/loss/celoss.py) 和 [TripletLossV2](../../../../ppcls/loss/triplet.py),配置文件如下:
 
 ```yaml
 Loss:
@@ -189,7 +189,7 @@ Loss:
         margin: 0.5
 ```
 
-最终的总 Loss 是所有 Loss 的加权和,其中 weight 定义了特定 Loss 在最终总 Loss 的权重。如果想替换其他 Loss,也可以在配置文件中更改 Loss 字段,目前支持的 Loss 请参考 [Loss](../../../ppcls/loss/__init__.py)。
+最终的总 Loss 是所有 Loss 的加权和,其中 weight 定义了特定 Loss 在最终总 Loss 的权重。如果想替换其他 Loss,也可以在配置文件中更改 Loss 字段,目前支持的 Loss 请参考 [Loss](../../../../ppcls/loss/__init__.py)。
 
 
 
@@ -257,7 +257,7 @@ python3.7 -m paddle.distributed.launch tools/eval.py \
 
 可配置的部分评估参数说明如下:
 * `Global.pretrained_model`:待评估的模型的预训练模型文件路径,不同于 `Global.Backbone.pretrained`,此处的预训练模型是整个模型的权重,而 `Global.Backbone.pretrained` 只是 Backbone 部分的权重。当需要做模型评估时,需要加载整个模型的权重。
-* `Metric.Eval`:待评估的指标,默认评估 `recall@1`、`recall@5`、`mAP`。当你不准备评测某一项指标时,可以将对应的试标从配置文件中删除;当你想增加某一项评测指标时,也可以参考 [Metric](../../../ppcls/metric/metrics.py) 部分在配置文件 `Metric.Eval` 中添加相关的指标。
+* `Metric.Eval`:待评估的指标,默认评估 `recall@1`、`recall@5`、`mAP`。当你不准备评测某一项指标时,可以将对应的试标从配置文件中删除;当你想增加某一项评测指标时,也可以参考 [Metric](../../../../ppcls/metric/metrics.py) 部分在配置文件 `Metric.Eval` 中添加相关的指标。
 
 **注意:**
 
@@ -280,7 +280,7 @@ python3.7 tools/export_model.py \
 
 其中,`Global.pretrained_model` 用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[2.2.2 特征提取模型恢复训练](#2.2.2))。当执行后,会在当前目录下生成 `./inference` 目录,目录下包含 `inference.pdiparams`、`inference.pdiparams.info`、`inference.pdmodel` 文件。`Global.save_inference_dir` 可以指定导出 inference 模型文件夹的路径。此处保存的 inference 模型在 embedding 特征层做了截断,即模型的推理输出为 n 维特征。
 
-有了上述命令将生成的模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),接下来就可以使用预测引擎进行推理。使用 inference 模型推理的流程可以参考[基于 Python 预测引擎预测推理](../inference_deployment/python_deploy.md)。
+有了上述命令将生成的模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),接下来就可以使用预测引擎进行推理。使用 inference 模型推理的流程可以参考[基于 Python 预测引擎预测推理](../../deployment/image_classification/python.md)。
 
 
 
@@ -325,7 +325,7 @@ python3.7 -m pip install faiss-cpu==1.7.1post2
 
 - 度量学习(Metric Learning)
 
-  度量学习研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法(kNN、k-means 等)取得较好的性能。深度度量学习(Deep Metric Learning)是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间(嵌入空间,embedding space)的映射,使得同类对象在嵌入空间上使用常用的距离函数(欧氏距离、cosine 距离等)计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、商品识别、图像检索、行人重识别等。更详细的介绍请参考[此文档](../algorithm_introduction/metric_learning.md)。
+  度量学习研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法(kNN、k-means 等)取得较好的性能。深度度量学习(Deep Metric Learning)是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间(嵌入空间,embedding space)的映射,使得同类对象在嵌入空间上使用常用的距离函数(欧氏距离、cosine 距离等)计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、商品识别、图像检索、行人重识别等。更详细的介绍请参考[此文档](../../algorithm_introduction/metric_learning.md)。
 
 
 
diff --git a/docs/zh_CN/data_preparation/classification_dataset.md b/docs/zh_CN/training/single_label_classification/dataset.md
similarity index 100%
rename from docs/zh_CN/data_preparation/classification_dataset.md
rename to docs/zh_CN/training/single_label_classification/dataset.md
diff --git a/docs/zh_CN/models_training/distributed_training.md b/docs/zh_CN/training/single_label_classification/distributed_training.md
similarity index 91%
rename from docs/zh_CN/models_training/distributed_training.md
rename to docs/zh_CN/training/single_label_classification/distributed_training.md
index 59532a5ed3d0c9f676ecb733b42b02052eb79752..6c5eed294d43d2378b534a2a6ff8f299c6183ef9 100644
--- a/docs/zh_CN/models_training/distributed_training.md
+++ b/docs/zh_CN/training/single_label_classification/distributed_training.md
@@ -42,7 +42,7 @@ python3 -m paddle.distributed.launch \
 
 ## 3. 性能效果测试
 
-* 在单机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced_tutorials/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及单机8卡加速比情况如下所示。
+* 在单机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及单机8卡加速比情况如下所示。
 
 
 | 模型    | 精度     | 单机单卡耗时 | 单机8卡耗时 | 加速比  |
@@ -52,7 +52,7 @@ python3 -m paddle.distributed.launch \
 | PPLCNet_x0_25_ssld  | 53.43% | 21.8d   | 6.2d  | **3.99** |
 
 
-* 在4机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced_tutorials/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及多机加速比情况如下所示。
+* 在4机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及多机加速比情况如下所示。
 
 
 | 模型    | 精度     | 单机8卡耗时 | 4机8卡耗时 | 加速比  |
diff --git a/docs/zh_CN/models_training/classification.md b/docs/zh_CN/training/single_label_classification/training.md
similarity index 92%
rename from docs/zh_CN/models_training/classification.md
rename to docs/zh_CN/training/single_label_classification/training.md
index dd950156d0b31828f705e825475e1fbaa9b7caaa..94975bdcd248544f68a37b710740c8fe9913655c 100644
--- a/docs/zh_CN/models_training/classification.md
+++ b/docs/zh_CN/training/single_label_classification/training.md
@@ -6,7 +6,7 @@
 
 图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。
 
-具体图像分类算法介绍详见[文档](../algorithm_introduction/image_classification.md)。
+具体图像分类算法介绍详见[文档](../../algorithm_introduction/image_classification.md)。
 
 ## 目录
 
@@ -54,20 +54,20 @@ CIFAR-10 数据集由 10 个类的 60000 个彩色图像组成,图像分辨率
 
 ### 2.1 数据及其预处理
 
-数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas 提供了训练 ImageNet-1k 的标准图像变换,也提供了多种数据增强的方法,相关代码可以查看[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment),相关数据增强算法详见[增强介绍文档](../algorithm_introduction/DataAugmentation.md)。
+数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas 提供了训练 ImageNet-1k 的标准图像变换,也提供了多种数据增强的方法,相关代码可以查看[数据处理](../../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../../ppcls/configs/ImageNet/DataAugment),相关数据增强算法详见[增强介绍文档](../../algorithm_introduction/data_augmentation.md)。
 
 
 
 ### 2.2 模型准备
 
-在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas 提供了 35 个系列共 164 个 ImageNet 预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](../algorithm_introduction/ImageNet_models.md)。
+在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas 提供了 35 个系列共 164 个 ImageNet 预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](../../models/ImageNet1k/model_list.md)。
 
 
 ### 2.3 模型训练
 
-在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas 提供了一些列的[训练调优方法](./train_strategy.md),可以快速助你获得高精度的模型。
+在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas 提供了一些列的[训练调优方法](training_strategy.md),可以快速助你获得高精度的模型。
 
-同时,PaddleClas 还支持使用VisualDL 可视化训练过程。VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看[VisualDL](../others/VisualDL.md)。
+同时,PaddleClas 还支持使用VisualDL 可视化训练过程。VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看[VisualDL](../config_discription/VisualDL.md)。
 
 
 ### 2.4 模型评估
@@ -77,7 +77,7 @@ CIFAR-10 数据集由 10 个类的 60000 个彩色图像组成,图像分辨率
 
 ## 3. 使用方法介绍
 
-请参考[安装指南](../installation/install_paddleclas.md)配置运行环境,并根据[快速开始](../quick_start/quick_start_classification_new_user.md)文档准备 flower102 数据集,本章节下面所有的实验均以 flower102 数据集为例。
+请参考[安装指南](../../installation.md)配置运行环境,并根据[快速开始](../../quick_start/quick_start_classification_new_user.md)文档准备 flower102 数据集,本章节下面所有的实验均以 flower102 数据集为例。
 
 PaddleClas 目前支持的训练/评估环境如下:
 ```shell
@@ -109,7 +109,7 @@ python3 tools/train.py \
 
 其中,`-c` 用于指定配置文件的路径,`-o` 用于指定需要修改或者添加的参数,其中 `-o Arch.pretrained=False` 表示不使用预训练模型,`-o Global.device=gpu` 表示使用 GPU 进行训练。如果希望使用 CPU 进行训练,则需要将 `Global.device` 设置为 `cpu`。
 
-更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md)。
+更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](../config_discription/basic.md)。
 
 运行上述命令,可以看到输出日志,示例如下:
 
@@ -132,7 +132,7 @@ python3 tools/train.py \
     ...
     ```
 
-训练期间也可以通过 VisualDL 实时观察 loss 变化,详见 [VisualDL](../others/VisualDL.md)。
+训练期间也可以通过 VisualDL 实时观察 loss 变化,详见 [VisualDL](../config_discription/VisualDL.md)。
 
 
 #### 3.1.2 模型微调
@@ -148,7 +148,7 @@ python3 tools/train.py \
 
 其中 `Arch.pretrained` 设置为 `True` 表示加载 ImageNet 的预训练模型,此外,`Arch.pretrained` 也可以指定具体的模型权重文件的地址,使用时需要换成自己的预训练模型权重文件的路径。
 
-我们也提供了大量基于 `ImageNet-1k` 数据集的预训练模型,模型列表及下载地址详见[模型库概览](../algorithm_introduction/ImageNet_models.md)。
+我们也提供了大量基于 `ImageNet-1k` 数据集的预训练模型,模型列表及下载地址详见[模型库概览](../../models/ImageNet1k/model_list.md)。
 
 
 
@@ -243,7 +243,7 @@ python3 -m paddle.distributed.launch \
 
 其中 `Arch.pretrained` 为 `True` 或 `False`,当然也可以设置加载预训练权重文件的路径,使用时需要换成自己的预训练模型权重文件路径,也可以直接在配置文件中修改该路径。
 
-30 分钟玩转 PaddleClas [尝鲜版](../quick_start/quick_start_classification_new_user.md)与[进阶版](../quick_start/quick_start_classification_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
+30 分钟玩转 PaddleClas [尝鲜版](../../quick_start/quick_start_classification_new_user.md)与[进阶版](../../quick_start/quick_start_classification_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
 
 
 
diff --git a/docs/zh_CN/models_training/train_strategy.md b/docs/zh_CN/training/single_label_classification/training_strategy.md
similarity index 99%
rename from docs/zh_CN/models_training/train_strategy.md
rename to docs/zh_CN/training/single_label_classification/training_strategy.md
index db5cf1d46f8c5e20154946569d9f0027cdfcac3a..93eff79c73d1aaa44a0430444a1124649165eee4 100644
--- a/docs/zh_CN/models_training/train_strategy.md
+++ b/docs/zh_CN/training/single_label_classification/training_strategy.md
@@ -35,7 +35,7 @@
 ### 2.2 学习率下降策略:
 在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是 piecewise_decay,即阶梯式下降学习率,如在 ResNet50 标准的训练中,我们设置的初始学习率是 0.1,每 30 epoch 学习率下降到原来的 1/10,一共迭代 120 epoch。除了 piecewise_decay,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降)、cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
 
-
+
 
 另外,从图中我们也可以看到,cosine_decay 里学习率小的轮数较少,这样会影响到最终的精度,所以为了使得 cosine_decay 发挥更好的效果,建议迭代更多的轮数,如 200 轮。
 
@@ -102,7 +102,7 @@ Label_smoothing 是深度学习中的一种正则化方法,其全称是 Label
 
 ## 7. 使用数据增广方式提升精度
 
-一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练 ImageNet-1k 的标准数据增广中,主要使用了 random_crop 与 random_flip 两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如 cutout、mixup、cutmix、AutoAugment 等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了 ResNet50 在 8 种不同的数据增广方式的表现,可以看出,相比 baseline,所有的数据增广方式均有收益,其中 cutmix 是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../algorithm_introduction/DataAugmentation.md)。
+一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练 ImageNet-1k 的标准数据增广中,主要使用了 random_crop 与 random_flip 两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如 cutout、mixup、cutmix、AutoAugment 等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了 ResNet50 在 8 种不同的数据增广方式的表现,可以看出,相比 baseline,所有的数据增广方式均有收益,其中 cutmix 是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../../algorithm_introduction/data_augmentation.md)。
 
 | 模型       | 数据增广方式         | Test top-1 |
 |:--:|:--:|:--:|
diff --git a/docs/zh_CN/others/update_history.md b/docs/zh_CN/version_history.md
similarity index 55%
rename from docs/zh_CN/others/update_history.md
rename to docs/zh_CN/version_history.md
index 0e88a51362d7d04db960c966db72a5ec3a0ee787..b9717ee26d03a31457f19ed74eeea20e1e21d0d6 100644
--- a/docs/zh_CN/others/update_history.md
+++ b/docs/zh_CN/version_history.md
@@ -1,11 +1,70 @@
+# 版本更新信息
+----------
+## 目录
+* [1. v2.3](#1)
+* [2. v2.2](#2)
+
+
+
+## 1. v2.3
+
+- 模型更新
+  - 添加轻量化模型预训练权重,包括检测模型、特征模型
+  - 发布 PP-LCNet 系列模型,此系列模型是专门在 CPU 上设计运行的自研模型
+  - SwinTransformer、Twins、Deit 支持从 scrach 直接训练,达到论文精度
+- 框架基础能力
+  - 添加 DeepHash 模块,支持特征模型直接输出二值特征
+  - 添加 PKSampler,特征模型不能多机多卡的训练的问题
+  - 支持 PaddleSlim:支持分类模型、特征模型的量化、裁剪训练及离线量化功能
+  - Legendary models 支持模型中间结果输出
+  - 支持多标签分类训练
+- 预测部署
+  - 使用 Faiss 替换原有特征检索库,提升平台适配性
+  - 支持 PaddleServing:支持分类模型、图像识别流程的部署
+
+- 推荐库版本
+  - python 版本:3.7
+  - PaddlePaddle 版本:2.1.3
+  - PaddleSlim 版本:2.2.0
+  - PaddleServing 版本:0.6.1
+
+
+
+## 2. v2.2
+
+- 模型更新
+  - 添加 LeViT、Twins、TNT、DLA、HardNet、RedNet、SwinTransfomer 模型
+- 框架基础能力
+  - 将分类模型分为两类
+    -  legendary models:引入 TheseusLayer 基类,及增加了修改网络功能接口,同时支持网络截断输出功能
+    - model zoo:其他普通分类模型
+  - 添加 Metric Learning 算法支持
+    - 添加多种相关 Loss 算法,及基础网络模块 gears(支持与 backbone、loss 组合)方便使用
+    - 同时支持普通分类及 metric learning 相关任务训练
+  - 支持静态图训练
+  - 分类训练支持 dali 加速
+  - 支持 fp16 训练
+- 应用更新
+  - 添加商品识别、车辆识别(车辆细粒度分类、车辆 ReID)、logo 识别、动漫人物识别应用具体案例及相关模型
+  - 添加图像识别完整 pipeline,包含检测模块、特征提取模块、向量检索模块
+- 预测部署
+  - 添加百度自研向量检索模块 Mobius,支持图像识别系统预测部署
+  - 图像识别,建立特征库支持 batch_size>1
+- 文档更新
+  - 添加图像识别相关文档
+  - 修复之前文档 bug
+- 推荐库版本
+  - python 版本:3.7
+  - PaddlePaddle:2.1.2
+
 # 更新日志
 
 - 2022.4.21 新增 CVPR2022 oral论文 [MixFormer](https://arxiv.org/pdf/2204.02557.pdf) 相关[代码](https://github.com/PaddlePaddle/PaddleClas/pull/1820/files)。
 - 2021.11.1 发布[PP-ShiTu技术报告](https://arxiv.org/pdf/2111.00775.pdf),新增饮料识别demo。
-- 2021.10.23 发布轻量级图像识别系统PP-ShiTu,CPU上0.2s即可完成在10w+库的图像识别。[点击这里](../quick_start/quick_start_recognition.md)立即体验。
-- 2021.09.17 发布PP-LCNet系列超轻量骨干网络模型, 在Intel CPU上,单张图像预测速度约5ms,ImageNet-1K数据集上Top1识别准确率达到80.82%,超越ResNet152的模型效果。PP-LCNet的介绍可以参考[论文](https://arxiv.org/pdf/2109.15099.pdf), 或者[PP-LCNet模型介绍](../models/PP-LCNet.md),相关指标和预训练权重可以从 [这里](../algorithm_introduction/ImageNet_models.md)下载。
-- 2021.08.11 更新 7 个[FAQ](../faq_series/faq_2021_s2.md)。
-- 2021.06.29 添加 Swin-transformer 系列模型,ImageNet1k 数据集上 Top1 acc 最高精度可达 87.2%;支持训练预测评估与 whl 包部署,预训练模型可以从[这里](../algorithm_introduction/ImageNet_models.md)下载。
+- 2021.10.23 发布轻量级图像识别系统PP-ShiTu,CPU上0.2s即可完成在10w+库的图像识别。[点击这里](quick_start/quick_start_recognition.md)立即体验。
+- 2021.09.17 发布PP-LCNet系列超轻量骨干网络模型, 在Intel CPU上,单张图像预测速度约5ms,ImageNet-1K数据集上Top1识别准确率达到80.82%,超越ResNet152的模型效果。PP-LCNet的介绍可以参考[论文](https://arxiv.org/pdf/2109.15099.pdf), 或者[PP-LCNet模型介绍](../models/PP-LCNet.md),相关指标和预训练权重可以从 [这里](models/ImageNet1k/model_list.md)下载。
+- 2021.08.11 更新 7 个[FAQ](FAQ/faq_2021_s2.md)。
+- 2021.06.29 添加 Swin-transformer 系列模型,ImageNet1k 数据集上 Top1 acc 最高精度可达 87.2%;支持训练预测评估与 whl 包部署,预训练模型可以从[这里](models/ImageNet1k/model_list.md)下载。
 - 2021.06.22,23,24 PaddleClas 官方研发团队带来技术深入解读三日直播课。课程回放:[https://aistudio.baidu.com/aistudio/course/introduce/24519](https://aistudio.baidu.com/aistudio/course/introduce/24519)
 - 2021.06.16 PaddleClas v2.2 版本升级,集成 Metric learning,向量检索等组件。新增商品识别、动漫人物识别、车辆识别和 logo 识别等 4 个图像识别应用。新增 LeViT、Twins、TNT、DLA、HarDNet、RedNet 系列 30 个预训练模型。
 - 2021.04.15
diff --git a/paddleclas.py b/paddleclas.py
index 1f107af4fe0e3b84f3fbc3edce1d35cad08131ca..1463b80d28cdcf7b89ed72c3089aa7f5e084793a 100644
--- a/paddleclas.py
+++ b/paddleclas.py
@@ -192,7 +192,8 @@ PULC_MODEL_BASE_DOWNLOAD_URL = "https://paddleclas.bj.bcebos.com/models/PULC/inf
 PULC_MODELS = [
     "car_exists", "language_classification", "person_attribute",
     "person_exists", "safety_helmet", "text_image_orientation",
-    "textline_orientation", "traffic_sign", "vehicle_attribute"
+    "textline_orientation", "traffic_sign", "vehicle_attribute",
+    "table_attribute"
 ]
 
 SHITU_MODEL_BASE_DOWNLOAD_URL = "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/{}_infer.tar"
@@ -278,6 +279,7 @@ def init_config(model_type, model_name, inference_model_dir, **kwargs):
     if "thresh" in kwargs and kwargs[
             "thresh"] and "ThreshOutput" in cfg.PostProcess:
         cfg.PostProcess.ThreshOutput.thresh = kwargs["thresh"]
+
     if cfg.get("PostProcess"):
         if "Topk" in cfg.PostProcess:
             if "topk" in kwargs and kwargs["topk"]:
@@ -297,7 +299,25 @@ def init_config(model_type, model_name, inference_model_dir, **kwargs):
             if "type_threshold" in kwargs and kwargs["type_threshold"]:
                 cfg.PostProcess.VehicleAttribute.type_threshold = kwargs[
                     "type_threshold"]
-
+        if "TableAttribute" in cfg.PostProcess:
+            if "source_threshold" in kwargs and kwargs["source_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "source_threshold"]
+            if "number_threshold" in kwargs and kwargs["number_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "number_threshold"]
+            if "color_threshold" in kwargs and kwargs["color_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "color_threshold"]
+            if "clarity_threshold" in kwargs and kwargs["clarity_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "clarity_threshold"]
+            if "obstruction_threshold" in kwargs and kwargs["obstruction_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "obstruction_threshold"]
+            if "angle_threshold" in kwargs and kwargs["angle_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "angle_threshold"]
     if "save_dir" in kwargs and kwargs["save_dir"]:
         cfg.PostProcess.SavePreLabel.save_dir = kwargs["save_dir"]
 
diff --git a/ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_wsl.yaml b/ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_wsl.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7822a2bea425ac657dc9a10644aa2cdf1fd4273c
--- /dev/null
+++ b/ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_wsl.yaml
@@ -0,0 +1,152 @@
+# global configs
+Global:
+  checkpoints: null
+  pretrained_model: null
+  output_dir: ./output/r34_r18_wsl
+  device: "gpu"
+  save_interval: 1
+  eval_during_train: True
+  eval_interval: 1
+  epochs: 100
+  print_batch_step: 10
+  use_visualdl: False
+  # used for static mode and model export
+  image_shape: [3, 224, 224]
+  save_inference_dir: "./inference"
+
+# model architecture
+Arch:
+  name: "DistillationModel"
+  # if not null, its lengths should be same as models
+  pretrained_list:
+  # if not null, its lengths should be same as models
+  freeze_params_list:
+  - True
+  - False
+  models:
+    - Teacher:
+        name: ResNet34
+        pretrained: True
+
+    - Student:
+        name: ResNet18
+        pretrained: False
+
+  infer_model_name: "Student"
+
+
+# loss function config for traing/eval process
+Loss:
+  Train:
+    - DistillationGTCELoss:
+        weight: 1.0
+        model_names: ["Student"]
+    - DistillationWSLLoss:
+        weight: 2.5
+        model_name_pairs: [["Student", "Teacher"]]
+        temperature: 2
+  Eval:
+    - CELoss:
+        weight: 1.0
+
+
+Optimizer:
+  name: Momentum
+  momentum: 0.9
+  weight_decay: 1e-4
+  lr:
+    name: MultiStepDecay
+    learning_rate: 0.1
+    milestones: [30, 60, 90]
+    step_each_epoch: 1
+    gamma: 0.1
+
+
+# data loader for train and eval
+DataLoader:
+  Train:
+    dataset:
+        name: ImageNetDataset
+        image_root: "./dataset/ILSVRC2012/"
+        cls_label_path: "./dataset/ILSVRC2012/train_list.txt"
+        transform_ops:
+          - DecodeImage:
+              to_rgb: True
+              channel_first: False
+          - RandCropImage:
+              size: 224
+          - RandFlipImage:
+              flip_code: 1
+          - NormalizeImage:
+              scale: 0.00392157
+              mean: [0.485, 0.456, 0.406]
+              std: [0.229, 0.224, 0.225]
+              order: ''
+
+    sampler:
+        name: DistributedBatchSampler
+        batch_size: 64
+        drop_last: False
+        shuffle: True
+    loader:
+        num_workers: 8
+        use_shared_memory: True
+
+  Eval:
+    dataset: 
+        name: ImageNetDataset
+        image_root: "./dataset/ILSVRC2012/"
+        cls_label_path: "./dataset/ILSVRC2012/val_list.txt"
+        transform_ops:
+          - DecodeImage:
+              to_rgb: True
+              channel_first: False
+          - ResizeImage:
+              resize_short: 256
+          - CropImage:
+              size: 224
+          - NormalizeImage:
+              scale: 0.00392157
+              mean: [0.485, 0.456, 0.406]
+              std: [0.229, 0.224, 0.225]
+              order: ''
+    sampler:
+        name: DistributedBatchSampler
+        batch_size: 64
+        drop_last: False
+        shuffle: False
+    loader:
+        num_workers: 4
+        use_shared_memory: True
+
+Infer:
+  infer_imgs: "docs/images/inference_deployment/whl_demo.jpg"
+  batch_size: 10
+  transforms:
+      - DecodeImage:
+          to_rgb: True
+          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:
+  PostProcess:
+    name: Topk
+    topk: 5
+    class_id_map_file: "ppcls/utils/imagenet1k_label_list.txt"
+
+Metric:
+    Train:
+    - DistillationTopkAcc:
+        model_key: "Student"
+        topk: [1, 5]
+    Eval:
+    - DistillationTopkAcc:
+        model_key: "Student"
+        topk: [1, 5]
diff --git a/ppcls/configs/PULC/table_attribute/PPLCNet_x1_0.yaml b/ppcls/configs/PULC/table_attribute/PPLCNet_x1_0.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2c1e9b253cb3b60afa635ebb6bb94dbdcf5bb886
--- /dev/null
+++ b/ppcls/configs/PULC/table_attribute/PPLCNet_x1_0.yaml
@@ -0,0 +1,133 @@
+# global configs
+Global:
+  checkpoints: null
+  pretrained_model: null
+  output_dir: "./output/"
+  device: "gpu"
+  save_interval: 1
+  eval_during_train: True
+  eval_interval: 1
+  epochs: 20
+  print_batch_step: 10
+  use_visualdl: False
+  # used for static mode and model export
+  image_shape: [3, 224, 224]
+  save_inference_dir: "./inference"
+  use_multilabel: True
+
+# model architecture
+Arch:
+  name: "PPLCNet_x1_0"
+  pretrained: True
+  use_ssld: True
+  class_num: 6
+  
+
+# loss function config for traing/eval process
+Loss:
+  Train:
+    - MultiLabelLoss:
+        weight: 1.0
+        weight_ratio: True
+        size_sum: True
+  Eval:
+    - MultiLabelLoss:
+        weight: 1.0
+        weight_ratio: True
+        size_sum: True
+
+Optimizer:
+  name: Momentum
+  momentum: 0.9
+  lr:
+    name: Cosine
+    learning_rate: 0.01
+    warmup_epoch: 5
+  regularizer:
+    name: 'L2'
+    coeff: 0.0005
+
+# data loader for train and eval
+DataLoader:
+  Train:
+    dataset:
+      name: MultiLabelDataset
+      image_root: "dataset/table_attribute/"
+      cls_label_path: "dataset/table_attribute/train_list.txt"
+      label_ratio: True
+      transform_ops:
+        - DecodeImage:
+            to_rgb: True
+            channel_first: False
+        - ResizeImage:
+            size: [224, 224]
+        - RandFlipImage:
+            flip_code: 1
+        - NormalizeImage:
+            scale: 1.0/255.0
+            mean: [0.485, 0.456, 0.406]
+            std: [0.229, 0.224, 0.225]
+            order: ''
+    sampler:
+      name: DistributedBatchSampler
+      batch_size: 64
+      drop_last: True
+      shuffle: True
+    loader:
+      num_workers: 4
+      use_shared_memory: True
+  Eval:
+    dataset:
+      name: MultiLabelDataset
+      image_root: "dataset/table_attribute/"
+      cls_label_path: "dataset/table_attribute/val_list.txt"
+      label_ratio: True
+      transform_ops:
+        - DecodeImage:
+            to_rgb: True
+            channel_first: False
+        - ResizeImage:
+            size: [224, 224]
+        - NormalizeImage:
+            scale: 1.0/255.0
+            mean: [0.485, 0.456, 0.406]
+            std: [0.229, 0.224, 0.225]
+            order: ''
+    sampler:
+      name: DistributedBatchSampler
+      batch_size: 64
+      drop_last: False
+      shuffle: False
+    loader:
+      num_workers: 4
+      use_shared_memory: True
+
+Infer:
+  infer_imgs: deploy/images/PULC/table_attribute/val_3610.jpg
+  batch_size: 10
+  transforms:
+    - DecodeImage:
+        to_rgb: True
+        channel_first: False
+    - ResizeImage:
+        size: [224, 224]
+    - NormalizeImage:
+        scale: 1.0/255.0
+        mean: [0.485, 0.456, 0.406]
+        std: [0.229, 0.224, 0.225]
+        order: ''
+    - ToCHWImage:
+  PostProcess:
+    name: TableAttribute
+    source_threshold: 0.5
+    number_threshold: 0.5
+    color_threshold: 0.5
+    clarity_threshold : 0.5
+    obstruction_threshold: 0.5
+    angle_threshold: 0.5
+
+Metric:
+  Eval:
+    - ATTRMetric:
+
+
diff --git a/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml b/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
index 969d8161f2f3d9bb60f7afe9bd1d33ff155a6d95..7c64ae3b3d22129a9577ea67de7cf7bfe6e4114d 100644
--- a/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
+++ b/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
@@ -99,7 +99,7 @@ DataLoader:
       use_shared_memory: True
 
 Infer:
-  infer_imgs: ./deploy/images/0517_2715693311.jpg
+  infer_imgs: deploy/images/0517_2715693311.jpg
   batch_size: 10
   transforms:
     - DecodeImage:
@@ -116,9 +116,10 @@ Infer:
         order: ''
     - ToCHWImage:
   PostProcess:
-    name: MultiLabelTopk
-    topk: 5
-    class_id_map_file: None
+    name: MultiLabelThreshOutput
+    threshold: 0.5
+    class_id_map_file: "ppcls/utils/NUS-WIDE-SCENE_label_list.txt"
+    delimiter: " "
 
 Metric:
   Train:
diff --git a/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml b/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
index b500fb20390a1bbf9cb3f9cc5b7492fa5dacd7a5..70c70a99bc7f7d5317b5d004a7b97123f19e4fad 100644
--- a/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
+++ b/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
@@ -87,7 +87,7 @@ Optimizer:
   - SGD:
       scope: CenterLoss
       lr:
-        name: Constant
+        name: ConstLR
         learning_rate: 1000.0 # NOTE: set to ori_lr*(1/centerloss_weight) to avoid manually scaling centers' gradidents.
 
 # data loader for train and eval
diff --git a/ppcls/data/dataloader/pk_sampler.py b/ppcls/data/dataloader/pk_sampler.py
index a4081b5c31f3fe37ae18bd9793cc030e479a77ab..7c3c0d72df8f63f7f0d21eea82ecd5da18bd7914 100644
--- a/ppcls/data/dataloader/pk_sampler.py
+++ b/ppcls/data/dataloader/pk_sampler.py
@@ -53,14 +53,14 @@ class PKSampler(DistributedBatchSampler):
             f"PKSampler configs error, sample_per_id({sample_per_id}) must be a divisor of batch_size({batch_size})."
         assert hasattr(self.dataset,
                        "labels"), "Dataset must have labels attribute."
-        self.sample_per_label = sample_per_id
+        self.sample_per_id = sample_per_id
         self.label_dict = defaultdict(list)
         self.sample_method = sample_method
         for idx, label in enumerate(self.dataset.labels):
             self.label_dict[label].append(idx)
         self.label_list = list(self.label_dict)
-        assert len(self.label_list) * self.sample_per_label > self.batch_size, \
-            "batch size should be smaller than "
+        assert len(self.label_list) * self.sample_per_id >= self.batch_size, \
+            f"batch size({self.batch_size}) should not be bigger than than #classes({len(self.label_list)})*sample_per_id({self.sample_per_id})"
         if self.sample_method == "id_avg_prob":
             self.prob_list = np.array([1 / len(self.label_list)] *
                                       len(self.label_list))
@@ -94,7 +94,7 @@ class PKSampler(DistributedBatchSampler):
                     format(diff))
 
     def __iter__(self):
-        label_per_batch = self.batch_size // self.sample_per_label
+        label_per_batch = self.batch_size // self.sample_per_id
         for _ in range(len(self)):
             batch_index = []
             batch_label_list = np.random.choice(
@@ -104,17 +104,17 @@ class PKSampler(DistributedBatchSampler):
                 p=self.prob_list)
             for label_i in batch_label_list:
                 label_i_indexes = self.label_dict[label_i]
-                if self.sample_per_label <= len(label_i_indexes):
+                if self.sample_per_id <= len(label_i_indexes):
                     batch_index.extend(
                         np.random.choice(
                             label_i_indexes,
-                            size=self.sample_per_label,
+                            size=self.sample_per_id,
                             replace=False))
                 else:
                     batch_index.extend(
                         np.random.choice(
                             label_i_indexes,
-                            size=self.sample_per_label,
+                            size=self.sample_per_id,
                             replace=True))
             if not self.drop_last or len(batch_index) == self.batch_size:
                 yield batch_index
diff --git a/ppcls/data/postprocess/__init__.py b/ppcls/data/postprocess/__init__.py
index 6b8b7730bf6ac224cffb9f91ff88f230a14b45bf..130ff22595c3df78261a8bb79292f5cf763feafd 100644
--- a/ppcls/data/postprocess/__init__.py
+++ b/ppcls/data/postprocess/__init__.py
@@ -16,11 +16,12 @@ import importlib
 
 from . import topk, threshoutput
 
-from .topk import Topk, MultiLabelTopk
-from .threshoutput import ThreshOutput
+from .topk import Topk
+from .threshoutput import ThreshOutput, MultiLabelThreshOutput
 from .attr_rec import VehicleAttribute, PersonAttribute
 
 
+
 def build_postprocess(config):
     config = copy.deepcopy(config)
     model_name = config.pop("name")
diff --git a/ppcls/data/postprocess/attr_rec.py b/ppcls/data/postprocess/attr_rec.py
index a8d492501833ac4ccd83d3aea108e7e34c46cadf..2a3de779e32653d43035b3bd3b3549ba147546ca 100644
--- a/ppcls/data/postprocess/attr_rec.py
+++ b/ppcls/data/postprocess/attr_rec.py
@@ -71,7 +71,6 @@ class VehicleAttribute(object):
         return batch_res
 
 
-
 class PersonAttribute(object):
     def __init__(self,
                  threshold=0.5,
@@ -171,3 +170,58 @@ class PersonAttribute(object):
             batch_res.append({"attributes": label_res, "output": pred_res})
         return batch_res
 
+
+class TableAttribute(object):
+    def __init__(
+            self,
+            source_threshold=0.5,
+            number_threshold=0.5,
+            color_threshold=0.5,
+            clarity_threshold=0.5,
+            obstruction_threshold=0.5,
+            angle_threshold=0.5, ):
+        self.source_threshold = source_threshold
+        self.number_threshold = number_threshold
+        self.color_threshold = color_threshold
+        self.clarity_threshold = clarity_threshold
+        self.obstruction_threshold = obstruction_threshold
+        self.angle_threshold = angle_threshold
+
+    def __call__(self, x, file_names=None):
+        if isinstance(x, dict):
+            x = x['logits']
+        assert isinstance(x, paddle.Tensor)
+        if file_names is not None:
+            assert x.shape[0] == len(file_names)
+        x = F.sigmoid(x).numpy()
+
+        # postprocess output of predictor
+        batch_res = []
+        for idx, res in enumerate(x):
+            res = res.tolist()
+            label_res = []
+            source = 'Scanned' if res[0] > self.source_threshold else 'Photo'
+            number = 'Little' if res[1] > self.number_threshold else 'Numerous'
+            color = 'Black-and-White' if res[
+                2] > self.color_threshold else 'Multicolor'
+            clarity = 'Clear' if res[3] > self.clarity_threshold else 'Blurry'
+            obstruction = 'Without-Obstacles' if res[
+                4] > self.number_threshold else 'With-Obstacles'
+            angle = 'Horizontal' if res[
+                5] > self.number_threshold else 'Tilted'
+
+            label_res = [source, number, color, clarity, obstruction, angle]
+
+            threshold_list = [
+                self.source_threshold, self.number_threshold,
+                self.color_threshold, self.clarity_threshold,
+                self.obstruction_threshold, self.angle_threshold
+            ]
+            pred_res = (np.array(res) > np.array(threshold_list)
+                        ).astype(np.int8).tolist()
+            batch_res.append({
+                "attributes": label_res,
+                "output": pred_res,
+                "file_name": file_names[idx]
+            })
+        return batch_res
diff --git a/ppcls/data/postprocess/threshoutput.py b/ppcls/data/postprocess/threshoutput.py
index 607aecbfdeae018a5334f723effd658fb480713a..b329288d96f3cc46289d74d76dfb41b4a537c575 100644
--- a/ppcls/data/postprocess/threshoutput.py
+++ b/ppcls/data/postprocess/threshoutput.py
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import os
+import numpy as np
 import paddle.nn.functional as F
 
 
@@ -34,3 +36,55 @@ class ThreshOutput(object):
                 result["file_name"] = file_names[idx]
             y.append(result)
         return y
+
+
+class MultiLabelThreshOutput(object):
+    def __init__(self, threshold=0.5, class_id_map_file=None, delimiter=None):
+        self.threshold = threshold
+        self.delimiter = delimiter if delimiter is not None else " "
+        self.class_id_map = self.parse_class_id_map(class_id_map_file)
+
+    def parse_class_id_map(self, class_id_map_file):
+        if class_id_map_file is None:
+            return None
+        if not os.path.exists(class_id_map_file):
+            print(
+                "Warning: If want to use your own label_dict, please input legal path!\nOtherwise label_names will be empty!"
+            )
+            return None
+
+        try:
+            class_id_map = {}
+            with open(class_id_map_file, "r") as fin:
+                lines = fin.readlines()
+                for line in lines:
+                    partition = line.split("\n")[0].partition(self.delimiter)
+                    class_id_map[int(partition[0])] = str(partition[-1])
+        except Exception as ex:
+            print(ex)
+            class_id_map = None
+        return class_id_map
+
+    def __call__(self, x, file_names=None):
+        y = []
+        x = F.sigmoid(x).numpy()
+        for idx, probs in enumerate(x):
+            index = np.where(probs >= self.threshold)[0].astype("int32")
+            clas_id_list = []
+            score_list = []
+            label_name_list = []
+            for i in index:
+                clas_id_list.append(i.item())
+                score_list.append(probs[i].item())
+                if self.class_id_map is not None:
+                    label_name_list.append(self.class_id_map[i.item()])
+            result = {
+                "class_ids": clas_id_list,
+                "scores": np.around(
+                    score_list, decimals=5).tolist(),
+                "label_names": label_name_list    
+            }
+            if file_names is not None:
+                result["file_name"] = file_names[idx]
+            y.append(result)
+        return y
diff --git a/ppcls/data/postprocess/topk.py b/ppcls/data/postprocess/topk.py
index 76772f568eef157c4bb5e3485ea9ec5bc41f9d20..2b475f83f787036f4fda88c6c98317a357100637 100644
--- a/ppcls/data/postprocess/topk.py
+++ b/ppcls/data/postprocess/topk.py
@@ -46,19 +46,18 @@ class Topk(object):
             class_id_map = None
         return class_id_map
 
-    def __call__(self, x, file_names=None, multilabel=False):
+    def __call__(self, x, file_names=None):
         if isinstance(x, dict):
             x = x['logits']
         assert isinstance(x, paddle.Tensor)
         if file_names is not None:
             assert x.shape[0] == len(file_names)
-        x = F.softmax(x, axis=-1) if not multilabel else F.sigmoid(x)
+        x = F.softmax(x, axis=-1)
         x = x.numpy()
         y = []
         for idx, probs in enumerate(x):
             index = probs.argsort(axis=0)[-self.topk:][::-1].astype(
-                "int32") if not multilabel else np.where(
-                    probs >= 0.5)[0].astype("int32")
+                "int32")
             clas_id_list = []
             score_list = []
             label_name_list = []
@@ -79,10 +78,3 @@ class Topk(object):
             y.append(result)
         return y
 
-
-class MultiLabelTopk(Topk):
-    def __init__(self, topk=1, class_id_map_file=None):
-        super().__init__()
-
-    def __call__(self, x, file_names=None):
-        return super().__call__(x, file_names, multilabel=True)
diff --git a/ppcls/engine/engine.py b/ppcls/engine/engine.py
index 5a3fe20a29bdc926ad9c46dca4122a26c8939747..e6977110afe35418d77467f2d3e383532977221c 100644
--- a/ppcls/engine/engine.py
+++ b/ppcls/engine/engine.py
@@ -502,7 +502,7 @@ class Engine(object):
         assert self.mode == "export"
         use_multilabel = self.config["Global"].get(
             "use_multilabel",
-            False) and "ATTRMetric" in self.config["Metric"]["Eval"][0]
+            False) or "ATTRMetric" in self.config["Metric"]["Eval"][0]
         model = ExportModel(self.config["Arch"], self.model, use_multilabel)
         if self.config["Global"]["pretrained_model"] is not None:
             load_dygraph_pretrain(model.base_model,
diff --git a/ppcls/engine/evaluation/classification.py b/ppcls/engine/evaluation/classification.py
index 5b305b0a0cb8f3c94561fd338631a2b3a4278687..647a821714f88ed849da71db21b4d98121134eb6 100644
--- a/ppcls/engine/evaluation/classification.py
+++ b/ppcls/engine/evaluation/classification.py
@@ -81,8 +81,9 @@ def classification_eval(engine, epoch_id=0):
         # gather Tensor when distributed
         if paddle.distributed.get_world_size() > 1:
             label_list = []
-
-            paddle.distributed.all_gather(label_list, batch[1])
+            label = batch[1].cuda() if engine.config["Global"][
+                "device"] == "gpu" else batch[1]
+            paddle.distributed.all_gather(label_list, label)
             labels = paddle.concat(label_list, 0)
 
             if isinstance(out, list):
diff --git a/ppcls/loss/__init__.py b/ppcls/loss/__init__.py
index cbe7e266ba0fc15b75f5cbdd574ecd0f12fabcdc..019eff71949972d1f72e02948fcce65ff96298ac 100644
--- a/ppcls/loss/__init__.py
+++ b/ppcls/loss/__init__.py
@@ -26,6 +26,7 @@ from .distillationloss import DistillationDistanceLoss
 from .distillationloss import DistillationRKDLoss
 from .distillationloss import DistillationKLDivLoss
 from .distillationloss import DistillationDKDLoss
+from .distillationloss import DistillationWSLLoss
 from .distillationloss import DistillationMultiLabelLoss
 from .distillationloss import DistillationDISTLoss
 from .distillationloss import DistillationPairLoss
diff --git a/ppcls/loss/distillationloss.py b/ppcls/loss/distillationloss.py
index 5a924afe72fd7c6627b9f3b3be8ce3553932b535..af24f83015928984ccb30ae864adf73928657e5e 100644
--- a/ppcls/loss/distillationloss.py
+++ b/ppcls/loss/distillationloss.py
@@ -22,6 +22,7 @@ from .distanceloss import DistanceLoss
 from .rkdloss import RKdAngle, RkdDistance
 from .kldivloss import KLDivLoss
 from .dkdloss import DKDLoss
+from .wslloss import WSLLoss
 from .dist_loss import DISTLoss
 from .multilabelloss import MultiLabelLoss
 from .mgd_loss import MGDLoss
@@ -262,6 +263,34 @@ class DistillationDKDLoss(DKDLoss):
         return loss_dict
 
 
+class DistillationWSLLoss(WSLLoss):
+    """
+    DistillationWSLLoss
+    """
+
+    def __init__(self,
+                 model_name_pairs=[],
+                 key=None,
+                 temperature=2.0,
+                 name="wsl_loss"):
+        super().__init__(temperature)
+        self.model_name_pairs = model_name_pairs
+        self.key = key
+        self.name = name
+
+    def forward(self, predicts, batch):
+        loss_dict = dict()
+        for idx, pair in enumerate(self.model_name_pairs):
+            out1 = predicts[pair[0]]
+            out2 = predicts[pair[1]]
+            if self.key is not None:
+                out1 = out1[self.key]
+                out2 = out2[self.key]
+            loss = super().forward(out1, out2, batch)
+            loss_dict[f"{self.name}_{pair[0]}_{pair[1]}"] = loss
+        return loss_dict
+
+
 class DistillationMultiLabelLoss(MultiLabelLoss):
     """
     DistillationMultiLabelLoss
diff --git a/ppcls/loss/wslloss.py b/ppcls/loss/wslloss.py
new file mode 100644
index 0000000000000000000000000000000000000000..8bdfaf8ccdacb475f209497bd96859b4c16dd760
--- /dev/null
+++ b/ppcls/loss/wslloss.py
@@ -0,0 +1,66 @@
+# copyright (c) 2022 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.
+
+import paddle
+import paddle.nn as nn
+import paddle.nn.functional as F
+
+
+class WSLLoss(nn.Layer):
+    """
+    Weighted Soft Labels Loss
+    paper: https://arxiv.org/pdf/2102.00650.pdf
+    code reference: https://github.com/bellymonster/Weighted-Soft-Label-Distillation
+    """
+
+    def __init__(self, temperature=2.0, use_target_as_gt=False):
+        super().__init__()
+        self.temperature = temperature
+        self.use_target_as_gt = use_target_as_gt
+
+    def forward(self, logits_student, logits_teacher, target=None):
+        """Compute weighted soft labels loss.
+        Args:
+            logits_student: student's logits with shape (batch_size, num_classes)
+            logits_teacher: teacher's logits with shape (batch_size, num_classes)
+            target: ground truth labels with shape (batch_size)
+        """
+        if target is None or self.use_target_as_gt:
+            target = logits_teacher.argmax(axis=-1)
+
+        target = F.one_hot(
+            target.reshape([-1]), num_classes=logits_student[0].shape[0])
+
+        s_input_for_softmax = logits_student / self.temperature
+        t_input_for_softmax = logits_teacher / self.temperature
+
+        ce_loss_s = -paddle.sum(target *
+                                F.log_softmax(logits_student.detach()),
+                                axis=1)
+        ce_loss_t = -paddle.sum(target *
+                                F.log_softmax(logits_teacher.detach()),
+                                axis=1)
+
+        ratio = ce_loss_s / (ce_loss_t + 1e-7)
+        ratio = paddle.maximum(ratio, paddle.zeros_like(ratio))
+
+        kd_loss = -paddle.sum(F.softmax(t_input_for_softmax) *
+                              F.log_softmax(s_input_for_softmax),
+                              axis=1)
+        weight = 1 - paddle.exp(-ratio)
+
+        weighted_kd_loss = (self.temperature**2) * paddle.mean(kd_loss *
+                                                               weight)
+
+        return weighted_kd_loss
diff --git a/ppcls/optimizer/learning_rate.py b/ppcls/optimizer/learning_rate.py
index 1a4561133f948831b9ca0d69821a3394f092fae7..c8d87517ecd7b4c4d98a84ae13ea1331c5e1fe6a 100644
--- a/ppcls/optimizer/learning_rate.py
+++ b/ppcls/optimizer/learning_rate.py
@@ -15,117 +15,228 @@
 from __future__ import (absolute_import, division, print_function,
                         unicode_literals)
 
-from paddle.optimizer import lr
-from paddle.optimizer.lr import LRScheduler
+from abc import abstractmethod
+from typing import Union
 
+from paddle.optimizer import lr
 from ppcls.utils import logger
 
 
-class Linear(object):
+class LRBase(object):
+    """Base class for custom learning rates
+
+    Args:
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        warmup_epoch (int): number of warmup epoch(s)
+        warmup_start_lr (float): start learning rate within warmup
+        last_epoch (int): last epoch
+        by_epoch (bool): learning rate decays by epoch when by_epoch is True, else by iter
+        verbose (bool): If True, prints a message to stdout for each update. Defaults to False
+    """
+
+    def __init__(self,
+                 epochs: int,
+                 step_each_epoch: int,
+                 learning_rate: float,
+                 warmup_epoch: int,
+                 warmup_start_lr: float,
+                 last_epoch: int,
+                 by_epoch: bool,
+                 verbose: bool=False) -> None:
+        """Initialize and record the necessary parameters
+        """
+        super(LRBase, self).__init__()
+        if warmup_epoch >= epochs:
+            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
+            logger.warning(msg)
+            warmup_epoch = epochs
+        self.epochs = epochs
+        self.step_each_epoch = step_each_epoch
+        self.learning_rate = learning_rate
+        self.warmup_epoch = warmup_epoch
+        self.warmup_steps = self.warmup_epoch if by_epoch else round(
+            self.warmup_epoch * self.step_each_epoch)
+        self.warmup_start_lr = warmup_start_lr
+        self.last_epoch = last_epoch
+        self.by_epoch = by_epoch
+        self.verbose = verbose
+
+    @abstractmethod
+    def __call__(self, *kargs, **kwargs) -> lr.LRScheduler:
+        """generate an learning rate scheduler
+
+        Returns:
+            lr.LinearWarmup: learning rate scheduler
+        """
+        pass
+
+    def linear_warmup(
+            self,
+            learning_rate: Union[float, lr.LRScheduler]) -> lr.LinearWarmup:
+        """Add an Linear Warmup before learning_rate
+
+        Args:
+            learning_rate (Union[float, lr.LRScheduler]): original learning rate without warmup
+
+        Returns:
+            lr.LinearWarmup: learning rate scheduler with warmup
+        """
+        warmup_lr = lr.LinearWarmup(
+            learning_rate=learning_rate,
+            warmup_steps=self.warmup_steps,
+            start_lr=self.warmup_start_lr,
+            end_lr=self.learning_rate,
+            last_epoch=self.last_epoch,
+            verbose=self.verbose)
+        return warmup_lr
+
+
+class Constant(lr.LRScheduler):
+    """Constant learning rate Class implementation
+
+    Args:
+        learning_rate (float): The initial learning rate
+        last_epoch (int, optional): The index of last epoch. Default: -1.
     """
-    Linear learning rate decay
+
+    def __init__(self, learning_rate, last_epoch=-1, **kwargs):
+        self.learning_rate = learning_rate
+        self.last_epoch = last_epoch
+        super(Constant, self).__init__()
+
+    def get_lr(self) -> float:
+        """always return the same learning rate
+        """
+        return self.learning_rate
+
+
+class ConstLR(LRBase):
+    """Constant learning rate
+
     Args:
-        lr (float): The initial learning rate. It is a python float number.
-        epochs(int): The decay step size. It determines the decay cycle.
-        end_lr(float, optional): The minimum final learning rate. Default: 0.0001.
-        power(float, optional): Power of polynomial. Default: 1.0.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        warmup_epoch (int): number of warmup epoch(s)
+        warmup_start_lr (float): start learning rate within warmup
+        last_epoch (int): last epoch
+        by_epoch (bool): learning rate decays by epoch when by_epoch is True, else by iter
     """
 
     def __init__(self,
+                 epochs,
+                 step_each_epoch,
                  learning_rate,
+                 warmup_epoch=0,
+                 warmup_start_lr=0.0,
+                 last_epoch=-1,
+                 by_epoch=False,
+                 **kwargs):
+        super(ConstLR, self).__init__(epochs, step_each_epoch, learning_rate,
+                                      warmup_epoch, warmup_start_lr,
+                                      last_epoch, by_epoch)
+
+    def __call__(self):
+        learning_rate = Constant(
+            learning_rate=self.learning_rate, last_epoch=self.last_epoch)
+
+        if self.warmup_steps > 0:
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
+        return learning_rate
+
+
+class Linear(LRBase):
+    """Linear learning rate decay
+
+    Args:
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        end_lr (float, optional): The minimum final learning rate. Defaults to 0.0.
+        power (float, optional): Power of polynomial. Defaults to 1.0.
+        warmup_epoch (int): number of warmup epoch(s)
+        warmup_start_lr (float): start learning rate within warmup
+        last_epoch (int): last epoch
+        by_epoch (bool): learning rate decays by epoch when by_epoch is True, else by iter
+    """
+
+    def __init__(self,
                  epochs,
                  step_each_epoch,
+                 learning_rate,
                  end_lr=0.0,
                  power=1.0,
+                 cycle=False,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.learning_rate = learning_rate
-        self.steps = (epochs - warmup_epoch) * step_each_epoch
+        super(Linear, self).__init__(epochs, step_each_epoch, learning_rate,
+                                     warmup_epoch, warmup_start_lr, last_epoch,
+                                     by_epoch)
+        self.decay_steps = (epochs - self.warmup_epoch) * step_each_epoch
         self.end_lr = end_lr
         self.power = power
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_start_lr = warmup_start_lr
+        self.cycle = cycle
+        self.warmup_steps = round(self.warmup_epoch * step_each_epoch)
+        if self.by_epoch:
+            self.decay_steps = self.epochs - self.warmup_epoch
 
     def __call__(self):
         learning_rate = lr.PolynomialDecay(
             learning_rate=self.learning_rate,
-            decay_steps=self.steps,
+            decay_steps=self.decay_steps,
             end_lr=self.end_lr,
             power=self.power,
+            cycle=self.cycle,
             last_epoch=self.
-            last_epoch) if self.steps > 0 else self.learning_rate
+            last_epoch) if self.decay_steps > 0 else self.learning_rate
+
         if self.warmup_steps > 0:
-            learning_rate = lr.LinearWarmup(
-                learning_rate=learning_rate,
-                warmup_steps=self.warmup_steps,
-                start_lr=self.warmup_start_lr,
-                end_lr=self.learning_rate,
-                last_epoch=self.last_epoch)
-        return learning_rate
+            learning_rate = self.linear_warmup(learning_rate)
 
+        setattr(learning_rate, "by_epoch", self.by_epoch)
+        return learning_rate
 
-class Constant(LRScheduler):
-    """
-    Constant learning rate
-    Args:
-        lr (float): The initial learning rate. It is a python float number.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
-    """
 
-    def __init__(self, learning_rate, last_epoch=-1, **kwargs):
-        self.learning_rate = learning_rate
-        self.last_epoch = last_epoch
-        super().__init__()
+class Cosine(LRBase):
+    """Cosine learning rate decay
 
-    def get_lr(self):
-        return self.learning_rate
+    ``lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)``
 
-
-class Cosine(object):
-    """
-    Cosine learning rate decay
-    lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)
     Args:
-        lr(float): initial learning rate
-        step_each_epoch(int): steps each epoch
-        epochs(int): total training epochs
-        eta_min(float): Minimum learning rate. Default: 0.0.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        eta_min (float, optional): Minimum learning rate. Defaults to 0.0.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
-                 learning_rate,
-                 step_each_epoch,
                  epochs,
+                 step_each_epoch,
+                 learning_rate,
                  eta_min=0.0,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.learning_rate = learning_rate
-        self.T_max = (epochs - warmup_epoch) * step_each_epoch
+        super(Cosine, self).__init__(epochs, step_each_epoch, learning_rate,
+                                     warmup_epoch, warmup_start_lr, last_epoch,
+                                     by_epoch)
+        self.T_max = (self.epochs - self.warmup_epoch) * self.step_each_epoch
         self.eta_min = eta_min
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_start_lr = warmup_start_lr
+        if self.by_epoch:
+            self.T_max = self.epochs - self.warmup_epoch
 
     def __call__(self):
         learning_rate = lr.CosineAnnealingDecay(
@@ -134,51 +245,47 @@ class Cosine(object):
             eta_min=self.eta_min,
             last_epoch=self.
             last_epoch) if self.T_max > 0 else self.learning_rate
+
         if self.warmup_steps > 0:
-            learning_rate = lr.LinearWarmup(
-                learning_rate=learning_rate,
-                warmup_steps=self.warmup_steps,
-                start_lr=self.warmup_start_lr,
-                end_lr=self.learning_rate,
-                last_epoch=self.last_epoch)
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
         return learning_rate
 
 
-class Step(object):
-    """
-    Piecewise learning rate decay
+class Step(LRBase):
+    """Step learning rate decay
+
     Args:
-        step_each_epoch(int): steps each epoch
-        learning_rate (float): The initial learning rate. It is a python float number.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
         step_size (int): the interval to update.
-        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma`` .
-            It should be less than 1.0. Default: 0.1.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma``. It should be less than 1.0. Default: 0.1.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
+                 epochs,
+                 step_each_epoch,
                  learning_rate,
                  step_size,
-                 step_each_epoch,
-                 epochs,
                  gamma,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.step_size = step_each_epoch * step_size
-        self.learning_rate = learning_rate
+        super(Step, self).__init__(epochs, step_each_epoch, learning_rate,
+                                   warmup_epoch, warmup_start_lr, last_epoch,
+                                   by_epoch)
+        self.step_size = step_size * step_each_epoch
         self.gamma = gamma
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_start_lr = warmup_start_lr
+        if self.by_epoch:
+            self.step_size = step_size
 
     def __call__(self):
         learning_rate = lr.StepDecay(
@@ -186,177 +293,102 @@ class Step(object):
             step_size=self.step_size,
             gamma=self.gamma,
             last_epoch=self.last_epoch)
+
         if self.warmup_steps > 0:
-            learning_rate = lr.LinearWarmup(
-                learning_rate=learning_rate,
-                warmup_steps=self.warmup_steps,
-                start_lr=self.warmup_start_lr,
-                end_lr=self.learning_rate,
-                last_epoch=self.last_epoch)
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
         return learning_rate
 
 
-class Piecewise(object):
-    """
-    Piecewise learning rate decay
+class Piecewise(LRBase):
+    """Piecewise learning rate decay
+
     Args:
-        boundaries(list): A list of steps numbers. The type of element in the list is python int.
-        values(list): A list of learning rate values that will be picked during different epoch boundaries.
-            The type of element in the list is python float.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        by_epoch(bool): Whether lr decay by epoch. Default: False.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        decay_epochs (List[int]): A list of steps numbers. The type of element in the list is python int.
+        values (List[float]): A list of learning rate values that will be picked during different epoch boundaries.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
+                 epochs,
                  step_each_epoch,
                  decay_epochs,
                  values,
-                 epochs,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
-                 by_epoch=False,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.boundaries_steps = [step_each_epoch * e for e in decay_epochs]
-        self.boundaries_epoch = decay_epochs
+        super(Piecewise,
+              self).__init__(epochs, step_each_epoch, values[0], warmup_epoch,
+                             warmup_start_lr, last_epoch, by_epoch)
         self.values = values
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_epoch = warmup_epoch
-        self.warmup_start_lr = warmup_start_lr
-        self.by_epoch = by_epoch
+        self.boundaries_steps = [e * step_each_epoch for e in decay_epochs]
+        if self.by_epoch is True:
+            self.boundaries_steps = decay_epochs
 
     def __call__(self):
-        if self.by_epoch:
-            learning_rate = lr.PiecewiseDecay(
-                boundaries=self.boundaries_epoch,
-                values=self.values,
-                last_epoch=self.last_epoch)
-            if self.warmup_epoch > 0:
-                learning_rate = lr.LinearWarmup(
-                    learning_rate=learning_rate,
-                    warmup_steps=self.warmup_epoch,
-                    start_lr=self.warmup_start_lr,
-                    end_lr=self.values[0],
-                    last_epoch=self.last_epoch)
-        else:
-            learning_rate = lr.PiecewiseDecay(
-                boundaries=self.boundaries_steps,
-                values=self.values,
-                last_epoch=self.last_epoch)
-            if self.warmup_steps > 0:
-                learning_rate = lr.LinearWarmup(
-                    learning_rate=learning_rate,
-                    warmup_steps=self.warmup_steps,
-                    start_lr=self.warmup_start_lr,
-                    end_lr=self.values[0],
-                    last_epoch=self.last_epoch)
+        learning_rate = lr.PiecewiseDecay(
+            boundaries=self.boundaries_steps,
+            values=self.values,
+            last_epoch=self.last_epoch)
+
+        if self.warmup_steps > 0:
+            learning_rate = self.linear_warmup(learning_rate)
+
         setattr(learning_rate, "by_epoch", self.by_epoch)
         return learning_rate
 
 
-class MultiStepDecay(LRScheduler):
-    """
-    Update the learning rate by ``gamma`` once ``epoch`` reaches one of the milestones.
-    The algorithm can be described as the code below.
-    .. code-block:: text
-        learning_rate = 0.5
-        milestones = [30, 50]
-        gamma = 0.1
-        if epoch < 30:
-            learning_rate = 0.5
-        elif epoch < 50:
-            learning_rate = 0.05
-        else:
-            learning_rate = 0.005
+class MultiStepDecay(LRBase):
+    """MultiStepDecay learning rate decay
+
     Args:
-        learning_rate (float): The initial learning rate. It is a python float number.
-        milestones (tuple|list): List or tuple of each boundaries. Must be increasing.
-        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma`` .
-            It should be less than 1.0. Default: 0.1.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
-        verbose (bool, optional): If ``True``, prints a message to stdout for each update. Default: ``False`` .
-
-    Returns:
-        ``MultiStepDecay`` instance to schedule learning rate.
-    Examples:
-
-        .. code-block:: python
-            import paddle
-            import numpy as np
-            # train on default dynamic graph mode
-            linear = paddle.nn.Linear(10, 10)
-            scheduler = paddle.optimizer.lr.MultiStepDecay(learning_rate=0.5, milestones=[2, 4, 6], gamma=0.8, verbose=True)
-            sgd = paddle.optimizer.SGD(learning_rate=scheduler, parameters=linear.parameters())
-            for epoch in range(20):
-                for batch_id in range(5):
-                    x = paddle.uniform([10, 10])
-                    out = linear(x)
-                    loss = paddle.mean(out)
-                    loss.backward()
-                    sgd.step()
-                    sgd.clear_gradients()
-                    scheduler.step()    # If you update learning rate each step
-              # scheduler.step()        # If you update learning rate each epoch
-            # train on static graph mode
-            paddle.enable_static()
-            main_prog = paddle.static.Program()
-            start_prog = paddle.static.Program()
-            with paddle.static.program_guard(main_prog, start_prog):
-                x = paddle.static.data(name='x', shape=[None, 4, 5])
-                y = paddle.static.data(name='y', shape=[None, 4, 5])
-                z = paddle.static.nn.fc(x, 100)
-                loss = paddle.mean(z)
-                scheduler = paddle.optimizer.lr.MultiStepDecay(learning_rate=0.5, milestones=[2, 4, 6], gamma=0.8, verbose=True)
-                sgd = paddle.optimizer.SGD(learning_rate=scheduler)
-                sgd.minimize(loss)
-            exe = paddle.static.Executor()
-            exe.run(start_prog)
-            for epoch in range(20):
-                for batch_id in range(5):
-                    out = exe.run(
-                        main_prog,
-                        feed={
-                            'x': np.random.randn(3, 4, 5).astype('float32'),
-                            'y': np.random.randn(3, 4, 5).astype('float32')
-                        },
-                        fetch_list=loss.name)
-                    scheduler.step()    # If you update learning rate each step
-              # scheduler.step()        # If you update learning rate each epoch
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        milestones (List[int]): List of each boundaries. Must be increasing.
+        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma``. It should be less than 1.0. Defaults to 0.1.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
-                 learning_rate,
-                 milestones,
                  epochs,
                  step_each_epoch,
+                 learning_rate,
+                 milestones,
                  gamma=0.1,
+                 warmup_epoch=0,
+                 warmup_start_lr=0.0,
                  last_epoch=-1,
-                 verbose=False):
-        if not isinstance(milestones, (tuple, list)):
-            raise TypeError(
-                "The type of 'milestones' in 'MultiStepDecay' must be 'tuple, list', but received %s."
-                % type(milestones))
-        if not all([
-                milestones[i] < milestones[i + 1]
-                for i in range(len(milestones) - 1)
-        ]):
-            raise ValueError('The elements of milestones must be incremented')
-        if gamma >= 1.0:
-            raise ValueError('gamma should be < 1.0.')
+                 by_epoch=False,
+                 **kwargs):
+        super(MultiStepDecay, self).__init__(
+            epochs, step_each_epoch, learning_rate, warmup_epoch,
+            warmup_start_lr, last_epoch, by_epoch)
         self.milestones = [x * step_each_epoch for x in milestones]
         self.gamma = gamma
-        super().__init__(learning_rate, last_epoch, verbose)
+        if self.by_epoch:
+            self.milestones = milestones
 
-    def get_lr(self):
-        for i in range(len(self.milestones)):
-            if self.last_epoch < self.milestones[i]:
-                return self.base_lr * (self.gamma**i)
-        return self.base_lr * (self.gamma**len(self.milestones))
+    def __call__(self):
+        learning_rate = lr.MultiStepDecay(
+            learning_rate=self.learning_rate,
+            milestones=self.milestones,
+            gamma=self.gamma,
+            last_epoch=self.last_epoch)
+
+        if self.warmup_steps > 0:
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
+        return learning_rate
diff --git a/ppcls/utils/NUS-WIDE-SCENE_label_list.txt b/ppcls/utils/NUS-WIDE-SCENE_label_list.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f4ee66ba70296a94e812aaa2d96b07ef347b2a10
--- /dev/null
+++ b/ppcls/utils/NUS-WIDE-SCENE_label_list.txt
@@ -0,0 +1,33 @@
+0 airport
+1 beach
+2 bridge
+3 buildings
+4 castle
+5 cityscape
+6 clouds
+7 frost
+8 garden
+9 glacier
+10 grass
+11 harbor
+12 house
+13 lake
+14 moon
+15 mountain
+16 nighttime
+17 ocean
+18 plants
+19 railroad
+20 rainbow
+21 reflection
+22 road
+23 sky
+24 snow
+25 street
+26 sunset
+27 temple
+28 town
+29 valley
+30 water
+31 waterfall
+32 window
diff --git a/test_tipc/README.md b/test_tipc/README.md
index e110f475ade01c64c72d6bbbdd1df816e0cb5d13..f3fe7cadff8cb7dc3a89205938dbe260bc9883c9 100644
--- a/test_tipc/README.md
+++ b/test_tipc/README.md
@@ -115,3 +115,4 @@ bash test_tipc/test_train_inference_python.sh ./test_tipc/configs/MobileNetV3/Mo
 - [test_serving_infer_python 使用](docs/test_serving_infer_python.md):测试python serving功能。
 - [test_serving_infer_cpp 使用](docs/test_serving_infer_cpp.md):测试cpp serving功能。
 - [test_train_fleet_inference_python 使用](./docs/test_train_fleet_inference_python.md):测试基于Python的多机多卡训练与推理等基本功能。
+- [benchmark_train 使用](./docs/benchmark_train.md):测试基于Python的训练benchmark等基本功能。
diff --git a/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt b/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt
index 81b59edbf4e18ac29579c4b45464d1f8a85a2024..f1f66a831fe51baced1fa02aa45d21edf91d4fcf 100644
--- a/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt
+++ b/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt
@@ -51,7 +51,7 @@ inference:python/predict_rec.py -c configs/inference_rec.yaml
 null:null
 null:null
 ===========================train_benchmark_params==========================
-batch_size:256
+batch_size:128
 fp_items:fp32|fp16
 epoch:1
 --profiler_options:batch_range=[10,20];state=GPU;tracer_option=Default;profile_path=model.profile
diff --git a/test_tipc/test_train_inference_python.sh b/test_tipc/test_train_inference_python.sh
index 7b7d590ab29b55c9a1a3bd6ae852f6af2163b482..d922075320c2e68cd7457f49b0a55b62d1e1f844 100644
--- a/test_tipc/test_train_inference_python.sh
+++ b/test_tipc/test_train_inference_python.sh
@@ -274,11 +274,15 @@ else
                 # export FLAGS_cudnn_deterministic=True
                 sleep 5
                 eval $cmd
-                eval "cat ${save_log}/${model_name}/train.log >> ${save_log}.log"
+                if [[ $model_name == *GeneralRecognition* ]]; then
+                    eval "cat ${save_log}/RecModel/train.log >> ${save_log}.log"
+                else
+                    eval "cat ${save_log}/${model_name}/train.log >> ${save_log}.log"
+                fi
                 status_check $? "${cmd}" "${status_log}" "${model_name}" "${save_log}.log"
                 sleep 5
 
-                if [[ $FILENAME == *GeneralRecognition* ]]; then
+                if [[ $model_name == *GeneralRecognition* ]]; then
                     set_eval_pretrain=$(func_set_params "${pretrain_model_key}" "${save_log}/RecModel/${train_model_name}")
                 else
                     set_eval_pretrain=$(func_set_params "${pretrain_model_key}" "${save_log}/${model_name}/${train_model_name}")
@@ -300,7 +304,7 @@ else
                 if [ ${run_export} != "null" ]; then
                     # run export model
                     save_infer_path="${save_log}"
-                    if [[ $FILENAME == *GeneralRecognition* ]]; then
+                    if [[ $model_name == *GeneralRecognition* ]]; then
                         set_eval_pretrain=$(func_set_params "${pretrain_model_key}" "${save_log}/RecModel/${train_model_name}")
                     else
                         set_export_weight=$(func_set_params "${export_weight}" "${save_log}/${model_name}/${train_model_name}")
 
-在Android端或PC端体验整体图像识别系统,或查看特征库建立方法,可以参考 [图像识别快速开始文档](../quick_start/quick_start_recognition.md)。
+在Android端或PC端体验整体图像识别系统,或查看特征库建立方法,可以参考 [图像识别快速开始文档](../../quick_start/quick_start_recognition.md)。
 
 以下内容,主要对上述三个步骤的训练部分进行介绍。
 
-在训练开始之前,请参考 [安装指南](../installation/install_paddleclas.md) 配置运行环境。
+在训练开始之前,请参考 [安装指南](../../installation.md) 配置运行环境。
 
 ##  目录
 
@@ -45,7 +45,7 @@
 
 关于主体检测数据集构造与模型训练方法可以参考: [30分钟快速上手PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection/blob/develop/docs/tutorials/GETTING_STARTED_cn.md#30%E5%88%86%E9%92%9F%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8Bpaddledetection)。
 
-更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../image_recognition_pipeline/mainbody_detection.md)。
+更多关于 PaddleClas 中提供的主体检测的模型介绍与下载请参考:[主体检测教程](../PP-ShiTu/mainbody_detection.md)。
 
 
 
@@ -163,7 +163,7 @@ python3.7 -m paddle.distributed.launch tools/train.py \
 
 **注**:其中,`-c` 用于指定配置文件的路径,`-o` 用于指定需要修改或者添加的参数,其中 `-o Arch.Backbone.pretrained=True` 表示 Backbone 在训练开始前会加载预训练模型;`-o Arch.Backbone.pretrained` 也可以指定为模型权重文件的路径,使用时换成自己的预训练模型权重文件的路径即可;`-o Global.device=gpu` 表示使用 GPU 进行训练。如果希望使用 CPU 进行训练,则设置 `-o Global.device=cpu`即可。
 
-更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md)。
+更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](../config_discription/basic.md)。
 
 运行上述训练命令,可以看到输出日志,示例如下:
 
@@ -177,7 +177,7 @@ python3.7 -m paddle.distributed.launch tools/train.py \
 
 此处配置文件的 Backbone 是 MobileNetV1,如果想使用其他 Backbone,可以重写参数 `Arch.Backbone.name`,比如命令中增加 `-o Arch.Backbone.name={其他 Backbone 的名字}`。此外,由于不同模型 `Neck` 部分的输入维度不同,更换 Backbone 后可能需要改写 `Neck` 的输入大小,改写方式类似替换 Backbone 的名字。
 
-在训练 Loss 部分,此处使用了 [CELoss](../../../ppcls/loss/celoss.py) 和 [TripletLossV2](../../../ppcls/loss/triplet.py),配置文件如下:
+在训练 Loss 部分,此处使用了 [CELoss](../../../../ppcls/loss/celoss.py) 和 [TripletLossV2](../../../../ppcls/loss/triplet.py),配置文件如下:
 
 ```yaml
 Loss:
@@ -189,7 +189,7 @@ Loss:
         margin: 0.5
 ```
 
-最终的总 Loss 是所有 Loss 的加权和,其中 weight 定义了特定 Loss 在最终总 Loss 的权重。如果想替换其他 Loss,也可以在配置文件中更改 Loss 字段,目前支持的 Loss 请参考 [Loss](../../../ppcls/loss/__init__.py)。
+最终的总 Loss 是所有 Loss 的加权和,其中 weight 定义了特定 Loss 在最终总 Loss 的权重。如果想替换其他 Loss,也可以在配置文件中更改 Loss 字段,目前支持的 Loss 请参考 [Loss](../../../../ppcls/loss/__init__.py)。
 
 
 
@@ -257,7 +257,7 @@ python3.7 -m paddle.distributed.launch tools/eval.py \
 
 可配置的部分评估参数说明如下:
 * `Global.pretrained_model`:待评估的模型的预训练模型文件路径,不同于 `Global.Backbone.pretrained`,此处的预训练模型是整个模型的权重,而 `Global.Backbone.pretrained` 只是 Backbone 部分的权重。当需要做模型评估时,需要加载整个模型的权重。
-* `Metric.Eval`:待评估的指标,默认评估 `recall@1`、`recall@5`、`mAP`。当你不准备评测某一项指标时,可以将对应的试标从配置文件中删除;当你想增加某一项评测指标时,也可以参考 [Metric](../../../ppcls/metric/metrics.py) 部分在配置文件 `Metric.Eval` 中添加相关的指标。
+* `Metric.Eval`:待评估的指标,默认评估 `recall@1`、`recall@5`、`mAP`。当你不准备评测某一项指标时,可以将对应的试标从配置文件中删除;当你想增加某一项评测指标时,也可以参考 [Metric](../../../../ppcls/metric/metrics.py) 部分在配置文件 `Metric.Eval` 中添加相关的指标。
 
 **注意:**
 
@@ -280,7 +280,7 @@ python3.7 tools/export_model.py \
 
 其中,`Global.pretrained_model` 用于指定模型文件路径,该路径仍无需包含模型文件后缀名(如[2.2.2 特征提取模型恢复训练](#2.2.2))。当执行后,会在当前目录下生成 `./inference` 目录,目录下包含 `inference.pdiparams`、`inference.pdiparams.info`、`inference.pdmodel` 文件。`Global.save_inference_dir` 可以指定导出 inference 模型文件夹的路径。此处保存的 inference 模型在 embedding 特征层做了截断,即模型的推理输出为 n 维特征。
 
-有了上述命令将生成的模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),接下来就可以使用预测引擎进行推理。使用 inference 模型推理的流程可以参考[基于 Python 预测引擎预测推理](../inference_deployment/python_deploy.md)。
+有了上述命令将生成的模型结构文件(`inference.pdmodel`)和模型权重文件(`inference.pdiparams`),接下来就可以使用预测引擎进行推理。使用 inference 模型推理的流程可以参考[基于 Python 预测引擎预测推理](../../deployment/image_classification/python.md)。
 
 
 
@@ -325,7 +325,7 @@ python3.7 -m pip install faiss-cpu==1.7.1post2
 
 - 度量学习(Metric Learning)
 
-  度量学习研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法(kNN、k-means 等)取得较好的性能。深度度量学习(Deep Metric Learning)是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间(嵌入空间,embedding space)的映射,使得同类对象在嵌入空间上使用常用的距离函数(欧氏距离、cosine 距离等)计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、商品识别、图像检索、行人重识别等。更详细的介绍请参考[此文档](../algorithm_introduction/metric_learning.md)。
+  度量学习研究如何在一个特定的任务上学习一个距离函数,使得该距离函数能够帮助基于近邻的算法(kNN、k-means 等)取得较好的性能。深度度量学习(Deep Metric Learning)是度量学习的一种方法,它的目标是学习一个从原始特征到低维稠密的向量空间(嵌入空间,embedding space)的映射,使得同类对象在嵌入空间上使用常用的距离函数(欧氏距离、cosine 距离等)计算的距离比较近,而不同类的对象之间的距离则比较远。深度度量学习在计算机视觉领域取得了非常多的成功的应用,比如人脸识别、商品识别、图像检索、行人重识别等。更详细的介绍请参考[此文档](../../algorithm_introduction/metric_learning.md)。
 
 
 
diff --git a/docs/zh_CN/data_preparation/classification_dataset.md b/docs/zh_CN/training/single_label_classification/dataset.md
similarity index 100%
rename from docs/zh_CN/data_preparation/classification_dataset.md
rename to docs/zh_CN/training/single_label_classification/dataset.md
diff --git a/docs/zh_CN/models_training/distributed_training.md b/docs/zh_CN/training/single_label_classification/distributed_training.md
similarity index 91%
rename from docs/zh_CN/models_training/distributed_training.md
rename to docs/zh_CN/training/single_label_classification/distributed_training.md
index 59532a5ed3d0c9f676ecb733b42b02052eb79752..6c5eed294d43d2378b534a2a6ff8f299c6183ef9 100644
--- a/docs/zh_CN/models_training/distributed_training.md
+++ b/docs/zh_CN/training/single_label_classification/distributed_training.md
@@ -42,7 +42,7 @@ python3 -m paddle.distributed.launch \
 
 ## 3. 性能效果测试
 
-* 在单机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced_tutorials/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及单机8卡加速比情况如下所示。
+* 在单机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及单机8卡加速比情况如下所示。
 
 
 | 模型    | 精度     | 单机单卡耗时 | 单机8卡耗时 | 加速比  |
@@ -52,7 +52,7 @@ python3 -m paddle.distributed.launch \
 | PPLCNet_x0_25_ssld  | 53.43% | 21.8d   | 6.2d  | **3.99** |
 
 
-* 在4机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced_tutorials/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及多机加速比情况如下所示。
+* 在4机8卡V100的机器上,基于[SSLD知识蒸馏训练策略](../advanced/ssld.md)(数据量500W)进行模型训练,不同模型的训练耗时以及多机加速比情况如下所示。
 
 
 | 模型    | 精度     | 单机8卡耗时 | 4机8卡耗时 | 加速比  |
diff --git a/docs/zh_CN/models_training/classification.md b/docs/zh_CN/training/single_label_classification/training.md
similarity index 92%
rename from docs/zh_CN/models_training/classification.md
rename to docs/zh_CN/training/single_label_classification/training.md
index dd950156d0b31828f705e825475e1fbaa9b7caaa..94975bdcd248544f68a37b710740c8fe9913655c 100644
--- a/docs/zh_CN/models_training/classification.md
+++ b/docs/zh_CN/training/single_label_classification/training.md
@@ -6,7 +6,7 @@
 
 图像分类是计算机视觉里很基础但又重要的一个领域,其研究成果一直影响着计算机视觉甚至深度学习的发展,图像分类有很多子领域,如多标签分类、细粒度分类等,此处只对单标签图像分类做一个简述。
 
-具体图像分类算法介绍详见[文档](../algorithm_introduction/image_classification.md)。
+具体图像分类算法介绍详见[文档](../../algorithm_introduction/image_classification.md)。
 
 ## 目录
 
@@ -54,20 +54,20 @@ CIFAR-10 数据集由 10 个类的 60000 个彩色图像组成,图像分辨率
 
 ### 2.1 数据及其预处理
 
-数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas 提供了训练 ImageNet-1k 的标准图像变换,也提供了多种数据增强的方法,相关代码可以查看[数据处理](../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../ppcls/configs/ImageNet/DataAugment),相关数据增强算法详见[增强介绍文档](../algorithm_introduction/DataAugmentation.md)。
+数据的质量及数量往往可以决定一个模型的好坏。在图像分类领域,数据包括图像及标签。在大部分情形下,带有标签的数据比较匮乏,所以数量很难达到使模型饱和的程度,为了可以使模型学习更多的图像特征,图像数据在进入模型之前要经过很多图像变换或者数据增强,来保证输入图像数据的多样性,从而保证模型有更好的泛化能力。PaddleClas 提供了训练 ImageNet-1k 的标准图像变换,也提供了多种数据增强的方法,相关代码可以查看[数据处理](../../../../ppcls/data/preprocess),配置文件可以参考[数据增强配置文件](../../../../ppcls/configs/ImageNet/DataAugment),相关数据增强算法详见[增强介绍文档](../../algorithm_introduction/data_augmentation.md)。
 
 
 
 ### 2.2 模型准备
 
-在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas 提供了 35 个系列共 164 个 ImageNet 预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](../algorithm_introduction/ImageNet_models.md)。
+在数据确定后,模型往往决定了最终算法精度的上限,在图像分类领域,经典的模型层出不穷,PaddleClas 提供了 35 个系列共 164 个 ImageNet 预训练模型。具体的精度、速度等指标请参考[骨干网络和预训练模型库](../../models/ImageNet1k/model_list.md)。
 
 
 ### 2.3 模型训练
 
-在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas 提供了一些列的[训练调优方法](./train_strategy.md),可以快速助你获得高精度的模型。
+在准备好数据、模型后,便可以开始迭代模型并更新模型的参数。经过多次迭代最终可以得到训练好的模型来做图像分类任务。图像分类的训练过程需要很多经验,涉及很多超参数的设置,PaddleClas 提供了一些列的[训练调优方法](training_strategy.md),可以快速助你获得高精度的模型。
 
-同时,PaddleClas 还支持使用VisualDL 可视化训练过程。VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看[VisualDL](../others/VisualDL.md)。
+同时,PaddleClas 还支持使用VisualDL 可视化训练过程。VisualDL 是飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。更多细节请查看[VisualDL](../config_discription/VisualDL.md)。
 
 
 ### 2.4 模型评估
@@ -77,7 +77,7 @@ CIFAR-10 数据集由 10 个类的 60000 个彩色图像组成,图像分辨率
 
 ## 3. 使用方法介绍
 
-请参考[安装指南](../installation/install_paddleclas.md)配置运行环境,并根据[快速开始](../quick_start/quick_start_classification_new_user.md)文档准备 flower102 数据集,本章节下面所有的实验均以 flower102 数据集为例。
+请参考[安装指南](../../installation.md)配置运行环境,并根据[快速开始](../../quick_start/quick_start_classification_new_user.md)文档准备 flower102 数据集,本章节下面所有的实验均以 flower102 数据集为例。
 
 PaddleClas 目前支持的训练/评估环境如下:
 ```shell
@@ -109,7 +109,7 @@ python3 tools/train.py \
 
 其中,`-c` 用于指定配置文件的路径,`-o` 用于指定需要修改或者添加的参数,其中 `-o Arch.pretrained=False` 表示不使用预训练模型,`-o Global.device=gpu` 表示使用 GPU 进行训练。如果希望使用 CPU 进行训练,则需要将 `Global.device` 设置为 `cpu`。
 
-更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](config_description.md)。
+更详细的训练配置,也可以直接修改模型对应的配置文件。具体配置参数参考[配置文档](../config_discription/basic.md)。
 
 运行上述命令,可以看到输出日志,示例如下:
 
@@ -132,7 +132,7 @@ python3 tools/train.py \
     ...
     ```
 
-训练期间也可以通过 VisualDL 实时观察 loss 变化,详见 [VisualDL](../others/VisualDL.md)。
+训练期间也可以通过 VisualDL 实时观察 loss 变化,详见 [VisualDL](../config_discription/VisualDL.md)。
 
 
 #### 3.1.2 模型微调
@@ -148,7 +148,7 @@ python3 tools/train.py \
 
 其中 `Arch.pretrained` 设置为 `True` 表示加载 ImageNet 的预训练模型,此外,`Arch.pretrained` 也可以指定具体的模型权重文件的地址,使用时需要换成自己的预训练模型权重文件的路径。
 
-我们也提供了大量基于 `ImageNet-1k` 数据集的预训练模型,模型列表及下载地址详见[模型库概览](../algorithm_introduction/ImageNet_models.md)。
+我们也提供了大量基于 `ImageNet-1k` 数据集的预训练模型,模型列表及下载地址详见[模型库概览](../../models/ImageNet1k/model_list.md)。
 
 
 
@@ -243,7 +243,7 @@ python3 -m paddle.distributed.launch \
 
 其中 `Arch.pretrained` 为 `True` 或 `False`,当然也可以设置加载预训练权重文件的路径,使用时需要换成自己的预训练模型权重文件路径,也可以直接在配置文件中修改该路径。
 
-30 分钟玩转 PaddleClas [尝鲜版](../quick_start/quick_start_classification_new_user.md)与[进阶版](../quick_start/quick_start_classification_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
+30 分钟玩转 PaddleClas [尝鲜版](../../quick_start/quick_start_classification_new_user.md)与[进阶版](../../quick_start/quick_start_classification_professional.md)中包含大量模型微调的示例,可以参考该章节在特定的数据集上进行模型微调。
 
 
 
diff --git a/docs/zh_CN/models_training/train_strategy.md b/docs/zh_CN/training/single_label_classification/training_strategy.md
similarity index 99%
rename from docs/zh_CN/models_training/train_strategy.md
rename to docs/zh_CN/training/single_label_classification/training_strategy.md
index db5cf1d46f8c5e20154946569d9f0027cdfcac3a..93eff79c73d1aaa44a0430444a1124649165eee4 100644
--- a/docs/zh_CN/models_training/train_strategy.md
+++ b/docs/zh_CN/training/single_label_classification/training_strategy.md
@@ -35,7 +35,7 @@
 ### 2.2 学习率下降策略:
 在整个训练过程中,我们不能使用同样的学习率来更新权重,否则无法到达最优点,所以需要在训练过程中调整学习率的大小。在训练初始阶段,由于权重处于随机初始化的状态,损失函数相对容易进行梯度下降,所以可以设置一个较大的学习率。在训练后期,由于权重参数已经接近最优值,较大的学习率无法进一步寻找最优值,所以需要设置一个较小的学习率。在训练整个过程中,很多研究者使用的学习率下降方式是 piecewise_decay,即阶梯式下降学习率,如在 ResNet50 标准的训练中,我们设置的初始学习率是 0.1,每 30 epoch 学习率下降到原来的 1/10,一共迭代 120 epoch。除了 piecewise_decay,很多研究者也提出了学习率的其他下降方式,如 polynomial_decay(多项式下降)、exponential_decay(指数下降)、cosine_decay(余弦下降)等,其中 cosine_decay 无需调整超参数,鲁棒性也比较高,所以成为现在提高模型精度首选的学习率下降方式。Cosine_decay 和 piecewise_decay 的学习率变化曲线如下图所示,容易观察到,在整个训练过程中,cosine_decay 都保持着较大的学习率,所以其收敛较为缓慢,但是最终的收敛效果较 peicewise_decay 更好一些。
 
-
+
 
 另外,从图中我们也可以看到,cosine_decay 里学习率小的轮数较少,这样会影响到最终的精度,所以为了使得 cosine_decay 发挥更好的效果,建议迭代更多的轮数,如 200 轮。
 
@@ -102,7 +102,7 @@ Label_smoothing 是深度学习中的一种正则化方法,其全称是 Label
 
 ## 7. 使用数据增广方式提升精度
 
-一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练 ImageNet-1k 的标准数据增广中,主要使用了 random_crop 与 random_flip 两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如 cutout、mixup、cutmix、AutoAugment 等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了 ResNet50 在 8 种不同的数据增广方式的表现,可以看出,相比 baseline,所有的数据增广方式均有收益,其中 cutmix 是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../algorithm_introduction/DataAugmentation.md)。
+一般来说,数据集的规模对性能影响至关重要,但是图片的标注往往比较昂贵,所以有标注的图片数量往往比较稀少,在这种情况下,数据的增广尤为重要。在训练 ImageNet-1k 的标准数据增广中,主要使用了 random_crop 与 random_flip 两种数据增广方式,然而,近些年,越来越多的数据增广方式被提出,如 cutout、mixup、cutmix、AutoAugment 等。实验表明,这些数据的增广方式可以有效提升模型的精度,下表列出了 ResNet50 在 8 种不同的数据增广方式的表现,可以看出,相比 baseline,所有的数据增广方式均有收益,其中 cutmix 是目前最有效的数据增广。更多数据增广的介绍请参考[**数据增广章节**](../../algorithm_introduction/data_augmentation.md)。
 
 | 模型       | 数据增广方式         | Test top-1 |
 |:--:|:--:|:--:|
diff --git a/docs/zh_CN/others/update_history.md b/docs/zh_CN/version_history.md
similarity index 55%
rename from docs/zh_CN/others/update_history.md
rename to docs/zh_CN/version_history.md
index 0e88a51362d7d04db960c966db72a5ec3a0ee787..b9717ee26d03a31457f19ed74eeea20e1e21d0d6 100644
--- a/docs/zh_CN/others/update_history.md
+++ b/docs/zh_CN/version_history.md
@@ -1,11 +1,70 @@
+# 版本更新信息
+----------
+## 目录
+* [1. v2.3](#1)
+* [2. v2.2](#2)
+
+
+
+## 1. v2.3
+
+- 模型更新
+  - 添加轻量化模型预训练权重,包括检测模型、特征模型
+  - 发布 PP-LCNet 系列模型,此系列模型是专门在 CPU 上设计运行的自研模型
+  - SwinTransformer、Twins、Deit 支持从 scrach 直接训练,达到论文精度
+- 框架基础能力
+  - 添加 DeepHash 模块,支持特征模型直接输出二值特征
+  - 添加 PKSampler,特征模型不能多机多卡的训练的问题
+  - 支持 PaddleSlim:支持分类模型、特征模型的量化、裁剪训练及离线量化功能
+  - Legendary models 支持模型中间结果输出
+  - 支持多标签分类训练
+- 预测部署
+  - 使用 Faiss 替换原有特征检索库,提升平台适配性
+  - 支持 PaddleServing:支持分类模型、图像识别流程的部署
+
+- 推荐库版本
+  - python 版本:3.7
+  - PaddlePaddle 版本:2.1.3
+  - PaddleSlim 版本:2.2.0
+  - PaddleServing 版本:0.6.1
+
+
+
+## 2. v2.2
+
+- 模型更新
+  - 添加 LeViT、Twins、TNT、DLA、HardNet、RedNet、SwinTransfomer 模型
+- 框架基础能力
+  - 将分类模型分为两类
+    -  legendary models:引入 TheseusLayer 基类,及增加了修改网络功能接口,同时支持网络截断输出功能
+    - model zoo:其他普通分类模型
+  - 添加 Metric Learning 算法支持
+    - 添加多种相关 Loss 算法,及基础网络模块 gears(支持与 backbone、loss 组合)方便使用
+    - 同时支持普通分类及 metric learning 相关任务训练
+  - 支持静态图训练
+  - 分类训练支持 dali 加速
+  - 支持 fp16 训练
+- 应用更新
+  - 添加商品识别、车辆识别(车辆细粒度分类、车辆 ReID)、logo 识别、动漫人物识别应用具体案例及相关模型
+  - 添加图像识别完整 pipeline,包含检测模块、特征提取模块、向量检索模块
+- 预测部署
+  - 添加百度自研向量检索模块 Mobius,支持图像识别系统预测部署
+  - 图像识别,建立特征库支持 batch_size>1
+- 文档更新
+  - 添加图像识别相关文档
+  - 修复之前文档 bug
+- 推荐库版本
+  - python 版本:3.7
+  - PaddlePaddle:2.1.2
+
 # 更新日志
 
 - 2022.4.21 新增 CVPR2022 oral论文 [MixFormer](https://arxiv.org/pdf/2204.02557.pdf) 相关[代码](https://github.com/PaddlePaddle/PaddleClas/pull/1820/files)。
 - 2021.11.1 发布[PP-ShiTu技术报告](https://arxiv.org/pdf/2111.00775.pdf),新增饮料识别demo。
-- 2021.10.23 发布轻量级图像识别系统PP-ShiTu,CPU上0.2s即可完成在10w+库的图像识别。[点击这里](../quick_start/quick_start_recognition.md)立即体验。
-- 2021.09.17 发布PP-LCNet系列超轻量骨干网络模型, 在Intel CPU上,单张图像预测速度约5ms,ImageNet-1K数据集上Top1识别准确率达到80.82%,超越ResNet152的模型效果。PP-LCNet的介绍可以参考[论文](https://arxiv.org/pdf/2109.15099.pdf), 或者[PP-LCNet模型介绍](../models/PP-LCNet.md),相关指标和预训练权重可以从 [这里](../algorithm_introduction/ImageNet_models.md)下载。
-- 2021.08.11 更新 7 个[FAQ](../faq_series/faq_2021_s2.md)。
-- 2021.06.29 添加 Swin-transformer 系列模型,ImageNet1k 数据集上 Top1 acc 最高精度可达 87.2%;支持训练预测评估与 whl 包部署,预训练模型可以从[这里](../algorithm_introduction/ImageNet_models.md)下载。
+- 2021.10.23 发布轻量级图像识别系统PP-ShiTu,CPU上0.2s即可完成在10w+库的图像识别。[点击这里](quick_start/quick_start_recognition.md)立即体验。
+- 2021.09.17 发布PP-LCNet系列超轻量骨干网络模型, 在Intel CPU上,单张图像预测速度约5ms,ImageNet-1K数据集上Top1识别准确率达到80.82%,超越ResNet152的模型效果。PP-LCNet的介绍可以参考[论文](https://arxiv.org/pdf/2109.15099.pdf), 或者[PP-LCNet模型介绍](../models/PP-LCNet.md),相关指标和预训练权重可以从 [这里](models/ImageNet1k/model_list.md)下载。
+- 2021.08.11 更新 7 个[FAQ](FAQ/faq_2021_s2.md)。
+- 2021.06.29 添加 Swin-transformer 系列模型,ImageNet1k 数据集上 Top1 acc 最高精度可达 87.2%;支持训练预测评估与 whl 包部署,预训练模型可以从[这里](models/ImageNet1k/model_list.md)下载。
 - 2021.06.22,23,24 PaddleClas 官方研发团队带来技术深入解读三日直播课。课程回放:[https://aistudio.baidu.com/aistudio/course/introduce/24519](https://aistudio.baidu.com/aistudio/course/introduce/24519)
 - 2021.06.16 PaddleClas v2.2 版本升级,集成 Metric learning,向量检索等组件。新增商品识别、动漫人物识别、车辆识别和 logo 识别等 4 个图像识别应用。新增 LeViT、Twins、TNT、DLA、HarDNet、RedNet 系列 30 个预训练模型。
 - 2021.04.15
diff --git a/paddleclas.py b/paddleclas.py
index 1f107af4fe0e3b84f3fbc3edce1d35cad08131ca..1463b80d28cdcf7b89ed72c3089aa7f5e084793a 100644
--- a/paddleclas.py
+++ b/paddleclas.py
@@ -192,7 +192,8 @@ PULC_MODEL_BASE_DOWNLOAD_URL = "https://paddleclas.bj.bcebos.com/models/PULC/inf
 PULC_MODELS = [
     "car_exists", "language_classification", "person_attribute",
     "person_exists", "safety_helmet", "text_image_orientation",
-    "textline_orientation", "traffic_sign", "vehicle_attribute"
+    "textline_orientation", "traffic_sign", "vehicle_attribute",
+    "table_attribute"
 ]
 
 SHITU_MODEL_BASE_DOWNLOAD_URL = "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/{}_infer.tar"
@@ -278,6 +279,7 @@ def init_config(model_type, model_name, inference_model_dir, **kwargs):
     if "thresh" in kwargs and kwargs[
             "thresh"] and "ThreshOutput" in cfg.PostProcess:
         cfg.PostProcess.ThreshOutput.thresh = kwargs["thresh"]
+
     if cfg.get("PostProcess"):
         if "Topk" in cfg.PostProcess:
             if "topk" in kwargs and kwargs["topk"]:
@@ -297,7 +299,25 @@ def init_config(model_type, model_name, inference_model_dir, **kwargs):
             if "type_threshold" in kwargs and kwargs["type_threshold"]:
                 cfg.PostProcess.VehicleAttribute.type_threshold = kwargs[
                     "type_threshold"]
-
+        if "TableAttribute" in cfg.PostProcess:
+            if "source_threshold" in kwargs and kwargs["source_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "source_threshold"]
+            if "number_threshold" in kwargs and kwargs["number_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "number_threshold"]
+            if "color_threshold" in kwargs and kwargs["color_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "color_threshold"]
+            if "clarity_threshold" in kwargs and kwargs["clarity_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "clarity_threshold"]
+            if "obstruction_threshold" in kwargs and kwargs["obstruction_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "obstruction_threshold"]
+            if "angle_threshold" in kwargs and kwargs["angle_threshold"]:
+                cfg.PostProcess.VehicleAttribute.color_threshold = kwargs[
+                    "angle_threshold"]
     if "save_dir" in kwargs and kwargs["save_dir"]:
         cfg.PostProcess.SavePreLabel.save_dir = kwargs["save_dir"]
 
diff --git a/ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_wsl.yaml b/ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_wsl.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7822a2bea425ac657dc9a10644aa2cdf1fd4273c
--- /dev/null
+++ b/ppcls/configs/ImageNet/Distillation/resnet34_distill_resnet18_wsl.yaml
@@ -0,0 +1,152 @@
+# global configs
+Global:
+  checkpoints: null
+  pretrained_model: null
+  output_dir: ./output/r34_r18_wsl
+  device: "gpu"
+  save_interval: 1
+  eval_during_train: True
+  eval_interval: 1
+  epochs: 100
+  print_batch_step: 10
+  use_visualdl: False
+  # used for static mode and model export
+  image_shape: [3, 224, 224]
+  save_inference_dir: "./inference"
+
+# model architecture
+Arch:
+  name: "DistillationModel"
+  # if not null, its lengths should be same as models
+  pretrained_list:
+  # if not null, its lengths should be same as models
+  freeze_params_list:
+  - True
+  - False
+  models:
+    - Teacher:
+        name: ResNet34
+        pretrained: True
+
+    - Student:
+        name: ResNet18
+        pretrained: False
+
+  infer_model_name: "Student"
+
+
+# loss function config for traing/eval process
+Loss:
+  Train:
+    - DistillationGTCELoss:
+        weight: 1.0
+        model_names: ["Student"]
+    - DistillationWSLLoss:
+        weight: 2.5
+        model_name_pairs: [["Student", "Teacher"]]
+        temperature: 2
+  Eval:
+    - CELoss:
+        weight: 1.0
+
+
+Optimizer:
+  name: Momentum
+  momentum: 0.9
+  weight_decay: 1e-4
+  lr:
+    name: MultiStepDecay
+    learning_rate: 0.1
+    milestones: [30, 60, 90]
+    step_each_epoch: 1
+    gamma: 0.1
+
+
+# data loader for train and eval
+DataLoader:
+  Train:
+    dataset:
+        name: ImageNetDataset
+        image_root: "./dataset/ILSVRC2012/"
+        cls_label_path: "./dataset/ILSVRC2012/train_list.txt"
+        transform_ops:
+          - DecodeImage:
+              to_rgb: True
+              channel_first: False
+          - RandCropImage:
+              size: 224
+          - RandFlipImage:
+              flip_code: 1
+          - NormalizeImage:
+              scale: 0.00392157
+              mean: [0.485, 0.456, 0.406]
+              std: [0.229, 0.224, 0.225]
+              order: ''
+
+    sampler:
+        name: DistributedBatchSampler
+        batch_size: 64
+        drop_last: False
+        shuffle: True
+    loader:
+        num_workers: 8
+        use_shared_memory: True
+
+  Eval:
+    dataset: 
+        name: ImageNetDataset
+        image_root: "./dataset/ILSVRC2012/"
+        cls_label_path: "./dataset/ILSVRC2012/val_list.txt"
+        transform_ops:
+          - DecodeImage:
+              to_rgb: True
+              channel_first: False
+          - ResizeImage:
+              resize_short: 256
+          - CropImage:
+              size: 224
+          - NormalizeImage:
+              scale: 0.00392157
+              mean: [0.485, 0.456, 0.406]
+              std: [0.229, 0.224, 0.225]
+              order: ''
+    sampler:
+        name: DistributedBatchSampler
+        batch_size: 64
+        drop_last: False
+        shuffle: False
+    loader:
+        num_workers: 4
+        use_shared_memory: True
+
+Infer:
+  infer_imgs: "docs/images/inference_deployment/whl_demo.jpg"
+  batch_size: 10
+  transforms:
+      - DecodeImage:
+          to_rgb: True
+          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:
+  PostProcess:
+    name: Topk
+    topk: 5
+    class_id_map_file: "ppcls/utils/imagenet1k_label_list.txt"
+
+Metric:
+    Train:
+    - DistillationTopkAcc:
+        model_key: "Student"
+        topk: [1, 5]
+    Eval:
+    - DistillationTopkAcc:
+        model_key: "Student"
+        topk: [1, 5]
diff --git a/ppcls/configs/PULC/table_attribute/PPLCNet_x1_0.yaml b/ppcls/configs/PULC/table_attribute/PPLCNet_x1_0.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2c1e9b253cb3b60afa635ebb6bb94dbdcf5bb886
--- /dev/null
+++ b/ppcls/configs/PULC/table_attribute/PPLCNet_x1_0.yaml
@@ -0,0 +1,133 @@
+# global configs
+Global:
+  checkpoints: null
+  pretrained_model: null
+  output_dir: "./output/"
+  device: "gpu"
+  save_interval: 1
+  eval_during_train: True
+  eval_interval: 1
+  epochs: 20
+  print_batch_step: 10
+  use_visualdl: False
+  # used for static mode and model export
+  image_shape: [3, 224, 224]
+  save_inference_dir: "./inference"
+  use_multilabel: True
+
+# model architecture
+Arch:
+  name: "PPLCNet_x1_0"
+  pretrained: True
+  use_ssld: True
+  class_num: 6
+  
+
+# loss function config for traing/eval process
+Loss:
+  Train:
+    - MultiLabelLoss:
+        weight: 1.0
+        weight_ratio: True
+        size_sum: True
+  Eval:
+    - MultiLabelLoss:
+        weight: 1.0
+        weight_ratio: True
+        size_sum: True
+
+Optimizer:
+  name: Momentum
+  momentum: 0.9
+  lr:
+    name: Cosine
+    learning_rate: 0.01
+    warmup_epoch: 5
+  regularizer:
+    name: 'L2'
+    coeff: 0.0005
+
+# data loader for train and eval
+DataLoader:
+  Train:
+    dataset:
+      name: MultiLabelDataset
+      image_root: "dataset/table_attribute/"
+      cls_label_path: "dataset/table_attribute/train_list.txt"
+      label_ratio: True
+      transform_ops:
+        - DecodeImage:
+            to_rgb: True
+            channel_first: False
+        - ResizeImage:
+            size: [224, 224]
+        - RandFlipImage:
+            flip_code: 1
+        - NormalizeImage:
+            scale: 1.0/255.0
+            mean: [0.485, 0.456, 0.406]
+            std: [0.229, 0.224, 0.225]
+            order: ''
+    sampler:
+      name: DistributedBatchSampler
+      batch_size: 64
+      drop_last: True
+      shuffle: True
+    loader:
+      num_workers: 4
+      use_shared_memory: True
+  Eval:
+    dataset:
+      name: MultiLabelDataset
+      image_root: "dataset/table_attribute/"
+      cls_label_path: "dataset/table_attribute/val_list.txt"
+      label_ratio: True
+      transform_ops:
+        - DecodeImage:
+            to_rgb: True
+            channel_first: False
+        - ResizeImage:
+            size: [224, 224]
+        - NormalizeImage:
+            scale: 1.0/255.0
+            mean: [0.485, 0.456, 0.406]
+            std: [0.229, 0.224, 0.225]
+            order: ''
+    sampler:
+      name: DistributedBatchSampler
+      batch_size: 64
+      drop_last: False
+      shuffle: False
+    loader:
+      num_workers: 4
+      use_shared_memory: True
+
+Infer:
+  infer_imgs: deploy/images/PULC/table_attribute/val_3610.jpg
+  batch_size: 10
+  transforms:
+    - DecodeImage:
+        to_rgb: True
+        channel_first: False
+    - ResizeImage:
+        size: [224, 224]
+    - NormalizeImage:
+        scale: 1.0/255.0
+        mean: [0.485, 0.456, 0.406]
+        std: [0.229, 0.224, 0.225]
+        order: ''
+    - ToCHWImage:
+  PostProcess:
+    name: TableAttribute
+    source_threshold: 0.5
+    number_threshold: 0.5
+    color_threshold: 0.5
+    clarity_threshold : 0.5
+    obstruction_threshold: 0.5
+    angle_threshold: 0.5
+
+Metric:
+  Eval:
+    - ATTRMetric:
+
+
diff --git a/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml b/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
index 969d8161f2f3d9bb60f7afe9bd1d33ff155a6d95..7c64ae3b3d22129a9577ea67de7cf7bfe6e4114d 100644
--- a/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
+++ b/ppcls/configs/quick_start/professional/MobileNetV1_multilabel.yaml
@@ -99,7 +99,7 @@ DataLoader:
       use_shared_memory: True
 
 Infer:
-  infer_imgs: ./deploy/images/0517_2715693311.jpg
+  infer_imgs: deploy/images/0517_2715693311.jpg
   batch_size: 10
   transforms:
     - DecodeImage:
@@ -116,9 +116,10 @@ Infer:
         order: ''
     - ToCHWImage:
   PostProcess:
-    name: MultiLabelTopk
-    topk: 5
-    class_id_map_file: None
+    name: MultiLabelThreshOutput
+    threshold: 0.5
+    class_id_map_file: "ppcls/utils/NUS-WIDE-SCENE_label_list.txt"
+    delimiter: " "
 
 Metric:
   Train:
diff --git a/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml b/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
index b500fb20390a1bbf9cb3f9cc5b7492fa5dacd7a5..70c70a99bc7f7d5317b5d004a7b97123f19e4fad 100644
--- a/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
+++ b/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
@@ -87,7 +87,7 @@ Optimizer:
   - SGD:
       scope: CenterLoss
       lr:
-        name: Constant
+        name: ConstLR
         learning_rate: 1000.0 # NOTE: set to ori_lr*(1/centerloss_weight) to avoid manually scaling centers' gradidents.
 
 # data loader for train and eval
diff --git a/ppcls/data/dataloader/pk_sampler.py b/ppcls/data/dataloader/pk_sampler.py
index a4081b5c31f3fe37ae18bd9793cc030e479a77ab..7c3c0d72df8f63f7f0d21eea82ecd5da18bd7914 100644
--- a/ppcls/data/dataloader/pk_sampler.py
+++ b/ppcls/data/dataloader/pk_sampler.py
@@ -53,14 +53,14 @@ class PKSampler(DistributedBatchSampler):
             f"PKSampler configs error, sample_per_id({sample_per_id}) must be a divisor of batch_size({batch_size})."
         assert hasattr(self.dataset,
                        "labels"), "Dataset must have labels attribute."
-        self.sample_per_label = sample_per_id
+        self.sample_per_id = sample_per_id
         self.label_dict = defaultdict(list)
         self.sample_method = sample_method
         for idx, label in enumerate(self.dataset.labels):
             self.label_dict[label].append(idx)
         self.label_list = list(self.label_dict)
-        assert len(self.label_list) * self.sample_per_label > self.batch_size, \
-            "batch size should be smaller than "
+        assert len(self.label_list) * self.sample_per_id >= self.batch_size, \
+            f"batch size({self.batch_size}) should not be bigger than than #classes({len(self.label_list)})*sample_per_id({self.sample_per_id})"
         if self.sample_method == "id_avg_prob":
             self.prob_list = np.array([1 / len(self.label_list)] *
                                       len(self.label_list))
@@ -94,7 +94,7 @@ class PKSampler(DistributedBatchSampler):
                     format(diff))
 
     def __iter__(self):
-        label_per_batch = self.batch_size // self.sample_per_label
+        label_per_batch = self.batch_size // self.sample_per_id
         for _ in range(len(self)):
             batch_index = []
             batch_label_list = np.random.choice(
@@ -104,17 +104,17 @@ class PKSampler(DistributedBatchSampler):
                 p=self.prob_list)
             for label_i in batch_label_list:
                 label_i_indexes = self.label_dict[label_i]
-                if self.sample_per_label <= len(label_i_indexes):
+                if self.sample_per_id <= len(label_i_indexes):
                     batch_index.extend(
                         np.random.choice(
                             label_i_indexes,
-                            size=self.sample_per_label,
+                            size=self.sample_per_id,
                             replace=False))
                 else:
                     batch_index.extend(
                         np.random.choice(
                             label_i_indexes,
-                            size=self.sample_per_label,
+                            size=self.sample_per_id,
                             replace=True))
             if not self.drop_last or len(batch_index) == self.batch_size:
                 yield batch_index
diff --git a/ppcls/data/postprocess/__init__.py b/ppcls/data/postprocess/__init__.py
index 6b8b7730bf6ac224cffb9f91ff88f230a14b45bf..130ff22595c3df78261a8bb79292f5cf763feafd 100644
--- a/ppcls/data/postprocess/__init__.py
+++ b/ppcls/data/postprocess/__init__.py
@@ -16,11 +16,12 @@ import importlib
 
 from . import topk, threshoutput
 
-from .topk import Topk, MultiLabelTopk
-from .threshoutput import ThreshOutput
+from .topk import Topk
+from .threshoutput import ThreshOutput, MultiLabelThreshOutput
 from .attr_rec import VehicleAttribute, PersonAttribute
 
 
+
 def build_postprocess(config):
     config = copy.deepcopy(config)
     model_name = config.pop("name")
diff --git a/ppcls/data/postprocess/attr_rec.py b/ppcls/data/postprocess/attr_rec.py
index a8d492501833ac4ccd83d3aea108e7e34c46cadf..2a3de779e32653d43035b3bd3b3549ba147546ca 100644
--- a/ppcls/data/postprocess/attr_rec.py
+++ b/ppcls/data/postprocess/attr_rec.py
@@ -71,7 +71,6 @@ class VehicleAttribute(object):
         return batch_res
 
 
-
 class PersonAttribute(object):
     def __init__(self,
                  threshold=0.5,
@@ -171,3 +170,58 @@ class PersonAttribute(object):
             batch_res.append({"attributes": label_res, "output": pred_res})
         return batch_res
 
+
+class TableAttribute(object):
+    def __init__(
+            self,
+            source_threshold=0.5,
+            number_threshold=0.5,
+            color_threshold=0.5,
+            clarity_threshold=0.5,
+            obstruction_threshold=0.5,
+            angle_threshold=0.5, ):
+        self.source_threshold = source_threshold
+        self.number_threshold = number_threshold
+        self.color_threshold = color_threshold
+        self.clarity_threshold = clarity_threshold
+        self.obstruction_threshold = obstruction_threshold
+        self.angle_threshold = angle_threshold
+
+    def __call__(self, x, file_names=None):
+        if isinstance(x, dict):
+            x = x['logits']
+        assert isinstance(x, paddle.Tensor)
+        if file_names is not None:
+            assert x.shape[0] == len(file_names)
+        x = F.sigmoid(x).numpy()
+
+        # postprocess output of predictor
+        batch_res = []
+        for idx, res in enumerate(x):
+            res = res.tolist()
+            label_res = []
+            source = 'Scanned' if res[0] > self.source_threshold else 'Photo'
+            number = 'Little' if res[1] > self.number_threshold else 'Numerous'
+            color = 'Black-and-White' if res[
+                2] > self.color_threshold else 'Multicolor'
+            clarity = 'Clear' if res[3] > self.clarity_threshold else 'Blurry'
+            obstruction = 'Without-Obstacles' if res[
+                4] > self.number_threshold else 'With-Obstacles'
+            angle = 'Horizontal' if res[
+                5] > self.number_threshold else 'Tilted'
+
+            label_res = [source, number, color, clarity, obstruction, angle]
+
+            threshold_list = [
+                self.source_threshold, self.number_threshold,
+                self.color_threshold, self.clarity_threshold,
+                self.obstruction_threshold, self.angle_threshold
+            ]
+            pred_res = (np.array(res) > np.array(threshold_list)
+                        ).astype(np.int8).tolist()
+            batch_res.append({
+                "attributes": label_res,
+                "output": pred_res,
+                "file_name": file_names[idx]
+            })
+        return batch_res
diff --git a/ppcls/data/postprocess/threshoutput.py b/ppcls/data/postprocess/threshoutput.py
index 607aecbfdeae018a5334f723effd658fb480713a..b329288d96f3cc46289d74d76dfb41b4a537c575 100644
--- a/ppcls/data/postprocess/threshoutput.py
+++ b/ppcls/data/postprocess/threshoutput.py
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import os
+import numpy as np
 import paddle.nn.functional as F
 
 
@@ -34,3 +36,55 @@ class ThreshOutput(object):
                 result["file_name"] = file_names[idx]
             y.append(result)
         return y
+
+
+class MultiLabelThreshOutput(object):
+    def __init__(self, threshold=0.5, class_id_map_file=None, delimiter=None):
+        self.threshold = threshold
+        self.delimiter = delimiter if delimiter is not None else " "
+        self.class_id_map = self.parse_class_id_map(class_id_map_file)
+
+    def parse_class_id_map(self, class_id_map_file):
+        if class_id_map_file is None:
+            return None
+        if not os.path.exists(class_id_map_file):
+            print(
+                "Warning: If want to use your own label_dict, please input legal path!\nOtherwise label_names will be empty!"
+            )
+            return None
+
+        try:
+            class_id_map = {}
+            with open(class_id_map_file, "r") as fin:
+                lines = fin.readlines()
+                for line in lines:
+                    partition = line.split("\n")[0].partition(self.delimiter)
+                    class_id_map[int(partition[0])] = str(partition[-1])
+        except Exception as ex:
+            print(ex)
+            class_id_map = None
+        return class_id_map
+
+    def __call__(self, x, file_names=None):
+        y = []
+        x = F.sigmoid(x).numpy()
+        for idx, probs in enumerate(x):
+            index = np.where(probs >= self.threshold)[0].astype("int32")
+            clas_id_list = []
+            score_list = []
+            label_name_list = []
+            for i in index:
+                clas_id_list.append(i.item())
+                score_list.append(probs[i].item())
+                if self.class_id_map is not None:
+                    label_name_list.append(self.class_id_map[i.item()])
+            result = {
+                "class_ids": clas_id_list,
+                "scores": np.around(
+                    score_list, decimals=5).tolist(),
+                "label_names": label_name_list    
+            }
+            if file_names is not None:
+                result["file_name"] = file_names[idx]
+            y.append(result)
+        return y
diff --git a/ppcls/data/postprocess/topk.py b/ppcls/data/postprocess/topk.py
index 76772f568eef157c4bb5e3485ea9ec5bc41f9d20..2b475f83f787036f4fda88c6c98317a357100637 100644
--- a/ppcls/data/postprocess/topk.py
+++ b/ppcls/data/postprocess/topk.py
@@ -46,19 +46,18 @@ class Topk(object):
             class_id_map = None
         return class_id_map
 
-    def __call__(self, x, file_names=None, multilabel=False):
+    def __call__(self, x, file_names=None):
         if isinstance(x, dict):
             x = x['logits']
         assert isinstance(x, paddle.Tensor)
         if file_names is not None:
             assert x.shape[0] == len(file_names)
-        x = F.softmax(x, axis=-1) if not multilabel else F.sigmoid(x)
+        x = F.softmax(x, axis=-1)
         x = x.numpy()
         y = []
         for idx, probs in enumerate(x):
             index = probs.argsort(axis=0)[-self.topk:][::-1].astype(
-                "int32") if not multilabel else np.where(
-                    probs >= 0.5)[0].astype("int32")
+                "int32")
             clas_id_list = []
             score_list = []
             label_name_list = []
@@ -79,10 +78,3 @@ class Topk(object):
             y.append(result)
         return y
 
-
-class MultiLabelTopk(Topk):
-    def __init__(self, topk=1, class_id_map_file=None):
-        super().__init__()
-
-    def __call__(self, x, file_names=None):
-        return super().__call__(x, file_names, multilabel=True)
diff --git a/ppcls/engine/engine.py b/ppcls/engine/engine.py
index 5a3fe20a29bdc926ad9c46dca4122a26c8939747..e6977110afe35418d77467f2d3e383532977221c 100644
--- a/ppcls/engine/engine.py
+++ b/ppcls/engine/engine.py
@@ -502,7 +502,7 @@ class Engine(object):
         assert self.mode == "export"
         use_multilabel = self.config["Global"].get(
             "use_multilabel",
-            False) and "ATTRMetric" in self.config["Metric"]["Eval"][0]
+            False) or "ATTRMetric" in self.config["Metric"]["Eval"][0]
         model = ExportModel(self.config["Arch"], self.model, use_multilabel)
         if self.config["Global"]["pretrained_model"] is not None:
             load_dygraph_pretrain(model.base_model,
diff --git a/ppcls/engine/evaluation/classification.py b/ppcls/engine/evaluation/classification.py
index 5b305b0a0cb8f3c94561fd338631a2b3a4278687..647a821714f88ed849da71db21b4d98121134eb6 100644
--- a/ppcls/engine/evaluation/classification.py
+++ b/ppcls/engine/evaluation/classification.py
@@ -81,8 +81,9 @@ def classification_eval(engine, epoch_id=0):
         # gather Tensor when distributed
         if paddle.distributed.get_world_size() > 1:
             label_list = []
-
-            paddle.distributed.all_gather(label_list, batch[1])
+            label = batch[1].cuda() if engine.config["Global"][
+                "device"] == "gpu" else batch[1]
+            paddle.distributed.all_gather(label_list, label)
             labels = paddle.concat(label_list, 0)
 
             if isinstance(out, list):
diff --git a/ppcls/loss/__init__.py b/ppcls/loss/__init__.py
index cbe7e266ba0fc15b75f5cbdd574ecd0f12fabcdc..019eff71949972d1f72e02948fcce65ff96298ac 100644
--- a/ppcls/loss/__init__.py
+++ b/ppcls/loss/__init__.py
@@ -26,6 +26,7 @@ from .distillationloss import DistillationDistanceLoss
 from .distillationloss import DistillationRKDLoss
 from .distillationloss import DistillationKLDivLoss
 from .distillationloss import DistillationDKDLoss
+from .distillationloss import DistillationWSLLoss
 from .distillationloss import DistillationMultiLabelLoss
 from .distillationloss import DistillationDISTLoss
 from .distillationloss import DistillationPairLoss
diff --git a/ppcls/loss/distillationloss.py b/ppcls/loss/distillationloss.py
index 5a924afe72fd7c6627b9f3b3be8ce3553932b535..af24f83015928984ccb30ae864adf73928657e5e 100644
--- a/ppcls/loss/distillationloss.py
+++ b/ppcls/loss/distillationloss.py
@@ -22,6 +22,7 @@ from .distanceloss import DistanceLoss
 from .rkdloss import RKdAngle, RkdDistance
 from .kldivloss import KLDivLoss
 from .dkdloss import DKDLoss
+from .wslloss import WSLLoss
 from .dist_loss import DISTLoss
 from .multilabelloss import MultiLabelLoss
 from .mgd_loss import MGDLoss
@@ -262,6 +263,34 @@ class DistillationDKDLoss(DKDLoss):
         return loss_dict
 
 
+class DistillationWSLLoss(WSLLoss):
+    """
+    DistillationWSLLoss
+    """
+
+    def __init__(self,
+                 model_name_pairs=[],
+                 key=None,
+                 temperature=2.0,
+                 name="wsl_loss"):
+        super().__init__(temperature)
+        self.model_name_pairs = model_name_pairs
+        self.key = key
+        self.name = name
+
+    def forward(self, predicts, batch):
+        loss_dict = dict()
+        for idx, pair in enumerate(self.model_name_pairs):
+            out1 = predicts[pair[0]]
+            out2 = predicts[pair[1]]
+            if self.key is not None:
+                out1 = out1[self.key]
+                out2 = out2[self.key]
+            loss = super().forward(out1, out2, batch)
+            loss_dict[f"{self.name}_{pair[0]}_{pair[1]}"] = loss
+        return loss_dict
+
+
 class DistillationMultiLabelLoss(MultiLabelLoss):
     """
     DistillationMultiLabelLoss
diff --git a/ppcls/loss/wslloss.py b/ppcls/loss/wslloss.py
new file mode 100644
index 0000000000000000000000000000000000000000..8bdfaf8ccdacb475f209497bd96859b4c16dd760
--- /dev/null
+++ b/ppcls/loss/wslloss.py
@@ -0,0 +1,66 @@
+# copyright (c) 2022 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.
+
+import paddle
+import paddle.nn as nn
+import paddle.nn.functional as F
+
+
+class WSLLoss(nn.Layer):
+    """
+    Weighted Soft Labels Loss
+    paper: https://arxiv.org/pdf/2102.00650.pdf
+    code reference: https://github.com/bellymonster/Weighted-Soft-Label-Distillation
+    """
+
+    def __init__(self, temperature=2.0, use_target_as_gt=False):
+        super().__init__()
+        self.temperature = temperature
+        self.use_target_as_gt = use_target_as_gt
+
+    def forward(self, logits_student, logits_teacher, target=None):
+        """Compute weighted soft labels loss.
+        Args:
+            logits_student: student's logits with shape (batch_size, num_classes)
+            logits_teacher: teacher's logits with shape (batch_size, num_classes)
+            target: ground truth labels with shape (batch_size)
+        """
+        if target is None or self.use_target_as_gt:
+            target = logits_teacher.argmax(axis=-1)
+
+        target = F.one_hot(
+            target.reshape([-1]), num_classes=logits_student[0].shape[0])
+
+        s_input_for_softmax = logits_student / self.temperature
+        t_input_for_softmax = logits_teacher / self.temperature
+
+        ce_loss_s = -paddle.sum(target *
+                                F.log_softmax(logits_student.detach()),
+                                axis=1)
+        ce_loss_t = -paddle.sum(target *
+                                F.log_softmax(logits_teacher.detach()),
+                                axis=1)
+
+        ratio = ce_loss_s / (ce_loss_t + 1e-7)
+        ratio = paddle.maximum(ratio, paddle.zeros_like(ratio))
+
+        kd_loss = -paddle.sum(F.softmax(t_input_for_softmax) *
+                              F.log_softmax(s_input_for_softmax),
+                              axis=1)
+        weight = 1 - paddle.exp(-ratio)
+
+        weighted_kd_loss = (self.temperature**2) * paddle.mean(kd_loss *
+                                                               weight)
+
+        return weighted_kd_loss
diff --git a/ppcls/optimizer/learning_rate.py b/ppcls/optimizer/learning_rate.py
index 1a4561133f948831b9ca0d69821a3394f092fae7..c8d87517ecd7b4c4d98a84ae13ea1331c5e1fe6a 100644
--- a/ppcls/optimizer/learning_rate.py
+++ b/ppcls/optimizer/learning_rate.py
@@ -15,117 +15,228 @@
 from __future__ import (absolute_import, division, print_function,
                         unicode_literals)
 
-from paddle.optimizer import lr
-from paddle.optimizer.lr import LRScheduler
+from abc import abstractmethod
+from typing import Union
 
+from paddle.optimizer import lr
 from ppcls.utils import logger
 
 
-class Linear(object):
+class LRBase(object):
+    """Base class for custom learning rates
+
+    Args:
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        warmup_epoch (int): number of warmup epoch(s)
+        warmup_start_lr (float): start learning rate within warmup
+        last_epoch (int): last epoch
+        by_epoch (bool): learning rate decays by epoch when by_epoch is True, else by iter
+        verbose (bool): If True, prints a message to stdout for each update. Defaults to False
+    """
+
+    def __init__(self,
+                 epochs: int,
+                 step_each_epoch: int,
+                 learning_rate: float,
+                 warmup_epoch: int,
+                 warmup_start_lr: float,
+                 last_epoch: int,
+                 by_epoch: bool,
+                 verbose: bool=False) -> None:
+        """Initialize and record the necessary parameters
+        """
+        super(LRBase, self).__init__()
+        if warmup_epoch >= epochs:
+            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
+            logger.warning(msg)
+            warmup_epoch = epochs
+        self.epochs = epochs
+        self.step_each_epoch = step_each_epoch
+        self.learning_rate = learning_rate
+        self.warmup_epoch = warmup_epoch
+        self.warmup_steps = self.warmup_epoch if by_epoch else round(
+            self.warmup_epoch * self.step_each_epoch)
+        self.warmup_start_lr = warmup_start_lr
+        self.last_epoch = last_epoch
+        self.by_epoch = by_epoch
+        self.verbose = verbose
+
+    @abstractmethod
+    def __call__(self, *kargs, **kwargs) -> lr.LRScheduler:
+        """generate an learning rate scheduler
+
+        Returns:
+            lr.LinearWarmup: learning rate scheduler
+        """
+        pass
+
+    def linear_warmup(
+            self,
+            learning_rate: Union[float, lr.LRScheduler]) -> lr.LinearWarmup:
+        """Add an Linear Warmup before learning_rate
+
+        Args:
+            learning_rate (Union[float, lr.LRScheduler]): original learning rate without warmup
+
+        Returns:
+            lr.LinearWarmup: learning rate scheduler with warmup
+        """
+        warmup_lr = lr.LinearWarmup(
+            learning_rate=learning_rate,
+            warmup_steps=self.warmup_steps,
+            start_lr=self.warmup_start_lr,
+            end_lr=self.learning_rate,
+            last_epoch=self.last_epoch,
+            verbose=self.verbose)
+        return warmup_lr
+
+
+class Constant(lr.LRScheduler):
+    """Constant learning rate Class implementation
+
+    Args:
+        learning_rate (float): The initial learning rate
+        last_epoch (int, optional): The index of last epoch. Default: -1.
     """
-    Linear learning rate decay
+
+    def __init__(self, learning_rate, last_epoch=-1, **kwargs):
+        self.learning_rate = learning_rate
+        self.last_epoch = last_epoch
+        super(Constant, self).__init__()
+
+    def get_lr(self) -> float:
+        """always return the same learning rate
+        """
+        return self.learning_rate
+
+
+class ConstLR(LRBase):
+    """Constant learning rate
+
     Args:
-        lr (float): The initial learning rate. It is a python float number.
-        epochs(int): The decay step size. It determines the decay cycle.
-        end_lr(float, optional): The minimum final learning rate. Default: 0.0001.
-        power(float, optional): Power of polynomial. Default: 1.0.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        warmup_epoch (int): number of warmup epoch(s)
+        warmup_start_lr (float): start learning rate within warmup
+        last_epoch (int): last epoch
+        by_epoch (bool): learning rate decays by epoch when by_epoch is True, else by iter
     """
 
     def __init__(self,
+                 epochs,
+                 step_each_epoch,
                  learning_rate,
+                 warmup_epoch=0,
+                 warmup_start_lr=0.0,
+                 last_epoch=-1,
+                 by_epoch=False,
+                 **kwargs):
+        super(ConstLR, self).__init__(epochs, step_each_epoch, learning_rate,
+                                      warmup_epoch, warmup_start_lr,
+                                      last_epoch, by_epoch)
+
+    def __call__(self):
+        learning_rate = Constant(
+            learning_rate=self.learning_rate, last_epoch=self.last_epoch)
+
+        if self.warmup_steps > 0:
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
+        return learning_rate
+
+
+class Linear(LRBase):
+    """Linear learning rate decay
+
+    Args:
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        end_lr (float, optional): The minimum final learning rate. Defaults to 0.0.
+        power (float, optional): Power of polynomial. Defaults to 1.0.
+        warmup_epoch (int): number of warmup epoch(s)
+        warmup_start_lr (float): start learning rate within warmup
+        last_epoch (int): last epoch
+        by_epoch (bool): learning rate decays by epoch when by_epoch is True, else by iter
+    """
+
+    def __init__(self,
                  epochs,
                  step_each_epoch,
+                 learning_rate,
                  end_lr=0.0,
                  power=1.0,
+                 cycle=False,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.learning_rate = learning_rate
-        self.steps = (epochs - warmup_epoch) * step_each_epoch
+        super(Linear, self).__init__(epochs, step_each_epoch, learning_rate,
+                                     warmup_epoch, warmup_start_lr, last_epoch,
+                                     by_epoch)
+        self.decay_steps = (epochs - self.warmup_epoch) * step_each_epoch
         self.end_lr = end_lr
         self.power = power
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_start_lr = warmup_start_lr
+        self.cycle = cycle
+        self.warmup_steps = round(self.warmup_epoch * step_each_epoch)
+        if self.by_epoch:
+            self.decay_steps = self.epochs - self.warmup_epoch
 
     def __call__(self):
         learning_rate = lr.PolynomialDecay(
             learning_rate=self.learning_rate,
-            decay_steps=self.steps,
+            decay_steps=self.decay_steps,
             end_lr=self.end_lr,
             power=self.power,
+            cycle=self.cycle,
             last_epoch=self.
-            last_epoch) if self.steps > 0 else self.learning_rate
+            last_epoch) if self.decay_steps > 0 else self.learning_rate
+
         if self.warmup_steps > 0:
-            learning_rate = lr.LinearWarmup(
-                learning_rate=learning_rate,
-                warmup_steps=self.warmup_steps,
-                start_lr=self.warmup_start_lr,
-                end_lr=self.learning_rate,
-                last_epoch=self.last_epoch)
-        return learning_rate
+            learning_rate = self.linear_warmup(learning_rate)
 
+        setattr(learning_rate, "by_epoch", self.by_epoch)
+        return learning_rate
 
-class Constant(LRScheduler):
-    """
-    Constant learning rate
-    Args:
-        lr (float): The initial learning rate. It is a python float number.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
-    """
 
-    def __init__(self, learning_rate, last_epoch=-1, **kwargs):
-        self.learning_rate = learning_rate
-        self.last_epoch = last_epoch
-        super().__init__()
+class Cosine(LRBase):
+    """Cosine learning rate decay
 
-    def get_lr(self):
-        return self.learning_rate
+    ``lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)``
 
-
-class Cosine(object):
-    """
-    Cosine learning rate decay
-    lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1)
     Args:
-        lr(float): initial learning rate
-        step_each_epoch(int): steps each epoch
-        epochs(int): total training epochs
-        eta_min(float): Minimum learning rate. Default: 0.0.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        eta_min (float, optional): Minimum learning rate. Defaults to 0.0.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
-                 learning_rate,
-                 step_each_epoch,
                  epochs,
+                 step_each_epoch,
+                 learning_rate,
                  eta_min=0.0,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.learning_rate = learning_rate
-        self.T_max = (epochs - warmup_epoch) * step_each_epoch
+        super(Cosine, self).__init__(epochs, step_each_epoch, learning_rate,
+                                     warmup_epoch, warmup_start_lr, last_epoch,
+                                     by_epoch)
+        self.T_max = (self.epochs - self.warmup_epoch) * self.step_each_epoch
         self.eta_min = eta_min
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_start_lr = warmup_start_lr
+        if self.by_epoch:
+            self.T_max = self.epochs - self.warmup_epoch
 
     def __call__(self):
         learning_rate = lr.CosineAnnealingDecay(
@@ -134,51 +245,47 @@ class Cosine(object):
             eta_min=self.eta_min,
             last_epoch=self.
             last_epoch) if self.T_max > 0 else self.learning_rate
+
         if self.warmup_steps > 0:
-            learning_rate = lr.LinearWarmup(
-                learning_rate=learning_rate,
-                warmup_steps=self.warmup_steps,
-                start_lr=self.warmup_start_lr,
-                end_lr=self.learning_rate,
-                last_epoch=self.last_epoch)
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
         return learning_rate
 
 
-class Step(object):
-    """
-    Piecewise learning rate decay
+class Step(LRBase):
+    """Step learning rate decay
+
     Args:
-        step_each_epoch(int): steps each epoch
-        learning_rate (float): The initial learning rate. It is a python float number.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
         step_size (int): the interval to update.
-        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma`` .
-            It should be less than 1.0. Default: 0.1.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma``. It should be less than 1.0. Default: 0.1.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
+                 epochs,
+                 step_each_epoch,
                  learning_rate,
                  step_size,
-                 step_each_epoch,
-                 epochs,
                  gamma,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.step_size = step_each_epoch * step_size
-        self.learning_rate = learning_rate
+        super(Step, self).__init__(epochs, step_each_epoch, learning_rate,
+                                   warmup_epoch, warmup_start_lr, last_epoch,
+                                   by_epoch)
+        self.step_size = step_size * step_each_epoch
         self.gamma = gamma
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_start_lr = warmup_start_lr
+        if self.by_epoch:
+            self.step_size = step_size
 
     def __call__(self):
         learning_rate = lr.StepDecay(
@@ -186,177 +293,102 @@ class Step(object):
             step_size=self.step_size,
             gamma=self.gamma,
             last_epoch=self.last_epoch)
+
         if self.warmup_steps > 0:
-            learning_rate = lr.LinearWarmup(
-                learning_rate=learning_rate,
-                warmup_steps=self.warmup_steps,
-                start_lr=self.warmup_start_lr,
-                end_lr=self.learning_rate,
-                last_epoch=self.last_epoch)
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
         return learning_rate
 
 
-class Piecewise(object):
-    """
-    Piecewise learning rate decay
+class Piecewise(LRBase):
+    """Piecewise learning rate decay
+
     Args:
-        boundaries(list): A list of steps numbers. The type of element in the list is python int.
-        values(list): A list of learning rate values that will be picked during different epoch boundaries.
-            The type of element in the list is python float.
-        warmup_epoch(int): The epoch numbers for LinearWarmup. Default: 0.
-        warmup_start_lr(float): Initial learning rate of warm up. Default: 0.0.
-        by_epoch(bool): Whether lr decay by epoch. Default: False.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        decay_epochs (List[int]): A list of steps numbers. The type of element in the list is python int.
+        values (List[float]): A list of learning rate values that will be picked during different epoch boundaries.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
+                 epochs,
                  step_each_epoch,
                  decay_epochs,
                  values,
-                 epochs,
                  warmup_epoch=0,
                  warmup_start_lr=0.0,
-                 by_epoch=False,
                  last_epoch=-1,
+                 by_epoch=False,
                  **kwargs):
-        super().__init__()
-        if warmup_epoch >= epochs:
-            msg = f"When using warm up, the value of \"Global.epochs\" must be greater than value of \"Optimizer.lr.warmup_epoch\". The value of \"Optimizer.lr.warmup_epoch\" has been set to {epochs}."
-            logger.warning(msg)
-            warmup_epoch = epochs
-        self.boundaries_steps = [step_each_epoch * e for e in decay_epochs]
-        self.boundaries_epoch = decay_epochs
+        super(Piecewise,
+              self).__init__(epochs, step_each_epoch, values[0], warmup_epoch,
+                             warmup_start_lr, last_epoch, by_epoch)
         self.values = values
-        self.last_epoch = last_epoch
-        self.warmup_steps = round(warmup_epoch * step_each_epoch)
-        self.warmup_epoch = warmup_epoch
-        self.warmup_start_lr = warmup_start_lr
-        self.by_epoch = by_epoch
+        self.boundaries_steps = [e * step_each_epoch for e in decay_epochs]
+        if self.by_epoch is True:
+            self.boundaries_steps = decay_epochs
 
     def __call__(self):
-        if self.by_epoch:
-            learning_rate = lr.PiecewiseDecay(
-                boundaries=self.boundaries_epoch,
-                values=self.values,
-                last_epoch=self.last_epoch)
-            if self.warmup_epoch > 0:
-                learning_rate = lr.LinearWarmup(
-                    learning_rate=learning_rate,
-                    warmup_steps=self.warmup_epoch,
-                    start_lr=self.warmup_start_lr,
-                    end_lr=self.values[0],
-                    last_epoch=self.last_epoch)
-        else:
-            learning_rate = lr.PiecewiseDecay(
-                boundaries=self.boundaries_steps,
-                values=self.values,
-                last_epoch=self.last_epoch)
-            if self.warmup_steps > 0:
-                learning_rate = lr.LinearWarmup(
-                    learning_rate=learning_rate,
-                    warmup_steps=self.warmup_steps,
-                    start_lr=self.warmup_start_lr,
-                    end_lr=self.values[0],
-                    last_epoch=self.last_epoch)
+        learning_rate = lr.PiecewiseDecay(
+            boundaries=self.boundaries_steps,
+            values=self.values,
+            last_epoch=self.last_epoch)
+
+        if self.warmup_steps > 0:
+            learning_rate = self.linear_warmup(learning_rate)
+
         setattr(learning_rate, "by_epoch", self.by_epoch)
         return learning_rate
 
 
-class MultiStepDecay(LRScheduler):
-    """
-    Update the learning rate by ``gamma`` once ``epoch`` reaches one of the milestones.
-    The algorithm can be described as the code below.
-    .. code-block:: text
-        learning_rate = 0.5
-        milestones = [30, 50]
-        gamma = 0.1
-        if epoch < 30:
-            learning_rate = 0.5
-        elif epoch < 50:
-            learning_rate = 0.05
-        else:
-            learning_rate = 0.005
+class MultiStepDecay(LRBase):
+    """MultiStepDecay learning rate decay
+
     Args:
-        learning_rate (float): The initial learning rate. It is a python float number.
-        milestones (tuple|list): List or tuple of each boundaries. Must be increasing.
-        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma`` .
-            It should be less than 1.0. Default: 0.1.
-        last_epoch (int, optional):  The index of last epoch. Can be set to restart training. Default: -1, means initial learning rate.
-        verbose (bool, optional): If ``True``, prints a message to stdout for each update. Default: ``False`` .
-
-    Returns:
-        ``MultiStepDecay`` instance to schedule learning rate.
-    Examples:
-
-        .. code-block:: python
-            import paddle
-            import numpy as np
-            # train on default dynamic graph mode
-            linear = paddle.nn.Linear(10, 10)
-            scheduler = paddle.optimizer.lr.MultiStepDecay(learning_rate=0.5, milestones=[2, 4, 6], gamma=0.8, verbose=True)
-            sgd = paddle.optimizer.SGD(learning_rate=scheduler, parameters=linear.parameters())
-            for epoch in range(20):
-                for batch_id in range(5):
-                    x = paddle.uniform([10, 10])
-                    out = linear(x)
-                    loss = paddle.mean(out)
-                    loss.backward()
-                    sgd.step()
-                    sgd.clear_gradients()
-                    scheduler.step()    # If you update learning rate each step
-              # scheduler.step()        # If you update learning rate each epoch
-            # train on static graph mode
-            paddle.enable_static()
-            main_prog = paddle.static.Program()
-            start_prog = paddle.static.Program()
-            with paddle.static.program_guard(main_prog, start_prog):
-                x = paddle.static.data(name='x', shape=[None, 4, 5])
-                y = paddle.static.data(name='y', shape=[None, 4, 5])
-                z = paddle.static.nn.fc(x, 100)
-                loss = paddle.mean(z)
-                scheduler = paddle.optimizer.lr.MultiStepDecay(learning_rate=0.5, milestones=[2, 4, 6], gamma=0.8, verbose=True)
-                sgd = paddle.optimizer.SGD(learning_rate=scheduler)
-                sgd.minimize(loss)
-            exe = paddle.static.Executor()
-            exe.run(start_prog)
-            for epoch in range(20):
-                for batch_id in range(5):
-                    out = exe.run(
-                        main_prog,
-                        feed={
-                            'x': np.random.randn(3, 4, 5).astype('float32'),
-                            'y': np.random.randn(3, 4, 5).astype('float32')
-                        },
-                        fetch_list=loss.name)
-                    scheduler.step()    # If you update learning rate each step
-              # scheduler.step()        # If you update learning rate each epoch
+        epochs (int): total epoch(s)
+        step_each_epoch (int): number of iterations within an epoch
+        learning_rate (float): learning rate
+        milestones (List[int]): List of each boundaries. Must be increasing.
+        gamma (float, optional): The Ratio that the learning rate will be reduced. ``new_lr = origin_lr * gamma``. It should be less than 1.0. Defaults to 0.1.
+        warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0.
+        warmup_start_lr (float, optional): start learning rate within warmup. Defaults to 0.0.
+        last_epoch (int, optional): last epoch. Defaults to -1.
+        by_epoch (bool, optional): learning rate decays by epoch when by_epoch is True, else by iter. Defaults to False.
     """
 
     def __init__(self,
-                 learning_rate,
-                 milestones,
                  epochs,
                  step_each_epoch,
+                 learning_rate,
+                 milestones,
                  gamma=0.1,
+                 warmup_epoch=0,
+                 warmup_start_lr=0.0,
                  last_epoch=-1,
-                 verbose=False):
-        if not isinstance(milestones, (tuple, list)):
-            raise TypeError(
-                "The type of 'milestones' in 'MultiStepDecay' must be 'tuple, list', but received %s."
-                % type(milestones))
-        if not all([
-                milestones[i] < milestones[i + 1]
-                for i in range(len(milestones) - 1)
-        ]):
-            raise ValueError('The elements of milestones must be incremented')
-        if gamma >= 1.0:
-            raise ValueError('gamma should be < 1.0.')
+                 by_epoch=False,
+                 **kwargs):
+        super(MultiStepDecay, self).__init__(
+            epochs, step_each_epoch, learning_rate, warmup_epoch,
+            warmup_start_lr, last_epoch, by_epoch)
         self.milestones = [x * step_each_epoch for x in milestones]
         self.gamma = gamma
-        super().__init__(learning_rate, last_epoch, verbose)
+        if self.by_epoch:
+            self.milestones = milestones
 
-    def get_lr(self):
-        for i in range(len(self.milestones)):
-            if self.last_epoch < self.milestones[i]:
-                return self.base_lr * (self.gamma**i)
-        return self.base_lr * (self.gamma**len(self.milestones))
+    def __call__(self):
+        learning_rate = lr.MultiStepDecay(
+            learning_rate=self.learning_rate,
+            milestones=self.milestones,
+            gamma=self.gamma,
+            last_epoch=self.last_epoch)
+
+        if self.warmup_steps > 0:
+            learning_rate = self.linear_warmup(learning_rate)
+
+        setattr(learning_rate, "by_epoch", self.by_epoch)
+        return learning_rate
diff --git a/ppcls/utils/NUS-WIDE-SCENE_label_list.txt b/ppcls/utils/NUS-WIDE-SCENE_label_list.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f4ee66ba70296a94e812aaa2d96b07ef347b2a10
--- /dev/null
+++ b/ppcls/utils/NUS-WIDE-SCENE_label_list.txt
@@ -0,0 +1,33 @@
+0 airport
+1 beach
+2 bridge
+3 buildings
+4 castle
+5 cityscape
+6 clouds
+7 frost
+8 garden
+9 glacier
+10 grass
+11 harbor
+12 house
+13 lake
+14 moon
+15 mountain
+16 nighttime
+17 ocean
+18 plants
+19 railroad
+20 rainbow
+21 reflection
+22 road
+23 sky
+24 snow
+25 street
+26 sunset
+27 temple
+28 town
+29 valley
+30 water
+31 waterfall
+32 window
diff --git a/test_tipc/README.md b/test_tipc/README.md
index e110f475ade01c64c72d6bbbdd1df816e0cb5d13..f3fe7cadff8cb7dc3a89205938dbe260bc9883c9 100644
--- a/test_tipc/README.md
+++ b/test_tipc/README.md
@@ -115,3 +115,4 @@ bash test_tipc/test_train_inference_python.sh ./test_tipc/configs/MobileNetV3/Mo
 - [test_serving_infer_python 使用](docs/test_serving_infer_python.md):测试python serving功能。
 - [test_serving_infer_cpp 使用](docs/test_serving_infer_cpp.md):测试cpp serving功能。
 - [test_train_fleet_inference_python 使用](./docs/test_train_fleet_inference_python.md):测试基于Python的多机多卡训练与推理等基本功能。
+- [benchmark_train 使用](./docs/benchmark_train.md):测试基于Python的训练benchmark等基本功能。
diff --git a/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt b/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt
index 81b59edbf4e18ac29579c4b45464d1f8a85a2024..f1f66a831fe51baced1fa02aa45d21edf91d4fcf 100644
--- a/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt
+++ b/test_tipc/configs/GeneralRecognitionV2/GeneralRecognitionV2_PPLCNetV2_base_train_infer_python.txt
@@ -51,7 +51,7 @@ inference:python/predict_rec.py -c configs/inference_rec.yaml
 null:null
 null:null
 ===========================train_benchmark_params==========================
-batch_size:256
+batch_size:128
 fp_items:fp32|fp16
 epoch:1
 --profiler_options:batch_range=[10,20];state=GPU;tracer_option=Default;profile_path=model.profile
diff --git a/test_tipc/test_train_inference_python.sh b/test_tipc/test_train_inference_python.sh
index 7b7d590ab29b55c9a1a3bd6ae852f6af2163b482..d922075320c2e68cd7457f49b0a55b62d1e1f844 100644
--- a/test_tipc/test_train_inference_python.sh
+++ b/test_tipc/test_train_inference_python.sh
@@ -274,11 +274,15 @@ else
                 # export FLAGS_cudnn_deterministic=True
                 sleep 5
                 eval $cmd
-                eval "cat ${save_log}/${model_name}/train.log >> ${save_log}.log"
+                if [[ $model_name == *GeneralRecognition* ]]; then
+                    eval "cat ${save_log}/RecModel/train.log >> ${save_log}.log"
+                else
+                    eval "cat ${save_log}/${model_name}/train.log >> ${save_log}.log"
+                fi
                 status_check $? "${cmd}" "${status_log}" "${model_name}" "${save_log}.log"
                 sleep 5
 
-                if [[ $FILENAME == *GeneralRecognition* ]]; then
+                if [[ $model_name == *GeneralRecognition* ]]; then
                     set_eval_pretrain=$(func_set_params "${pretrain_model_key}" "${save_log}/RecModel/${train_model_name}")
                 else
                     set_eval_pretrain=$(func_set_params "${pretrain_model_key}" "${save_log}/${model_name}/${train_model_name}")
@@ -300,7 +304,7 @@ else
                 if [ ${run_export} != "null" ]; then
                     # run export model
                     save_infer_path="${save_log}"
-                    if [[ $FILENAME == *GeneralRecognition* ]]; then
+                    if [[ $model_name == *GeneralRecognition* ]]; then
                         set_eval_pretrain=$(func_set_params "${pretrain_model_key}" "${save_log}/RecModel/${train_model_name}")
                     else
                         set_export_weight=$(func_set_params "${export_weight}" "${save_log}/${model_name}/${train_model_name}")