提交 4abe0e38 编写于 作者: F Flowingsun007

refine resnet50 readme

上级 708ba37b
## 简介 Introduction
### 图像分类与CNN
## 图像分类与CNN
**图像分类** 是指将图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法,是计算机视觉中其他任务,比如目标检测、语义分割、人脸识别等高层视觉任务的基础。
......@@ -8,18 +8,44 @@ ImageNet大规模视觉识别挑战赛(ILSVRC),常称为ImageNet竞赛,
在2012年的ImageNet竞赛中,深度卷积网络AlexNet横空出世。以超出第二名10%以上的top-5准确率,勇夺ImageNet2012比赛的冠军。从此,以 CNN(卷积神经网络) 为代表的深度学习方法开始在计算机视觉领域的应用开始大放异彩,更多的更深的CNN网络被提出,比如ImageNet2014比赛的冠军VGGNet, ImageNet2015比赛的冠军ResNet。
### 使用说明
OneFlow-Benchmark下的cnn仓库目前已支持resnet50、vgg、alexnet等经典的cnn模型,未来会陆续添加新的cnn模型。这些cnn模型共享一套训练、验证和推理代码,您只需要指定模型,即可使用一套代码完成这些cnn网络模型的训练、测试和验证。
#### 1.克隆此仓库
```shell
git clone https://github.com/Oneflow-Inc/OneFlow-Benchmark
cd ./OneFlow-Benchmark/Classification/cnns
```
## 快速开始 Quick Start
### 准备工作 Requirements
别担心,使用OneFlow非常容易,只要准备好下面三步,即可开始OneFlow的图像识别之旅。
- 安装OneFlow。
- 直接通过pip安装:`pip install oneflow` (TODO:确定我们的pip源是否做好,问caishenghang)
- 其他安装方式:参考[这里](XXX)(TOOD:待补充链接,链接到编译安装的文档说明) 。
- 下载[OneFlow-Benchmark](https://github.com/Oneflow-Inc/OneFlow-Benchmark/tree/of_develop_py3/cnn_benchmark)仓库。
`git clone git@github.com:Oneflow-Inc/OneFlow-Benchmark.git`
- 准备数据集(可选)
- 下载示例数据集:
`wget https://oneflow-public.oss-cn-beijing.aliyuncs.com/datasets/imagenet_ofrecord_example/part-00000`
- 或者:制作完整OFRecord格式的ImageNet数据集(见下文进阶部分)
- 再或者:直接使用虚拟“合成数据”。
**关于数据集的说明:**
#### 2.训练&验证
> 1)本文的展示的代码中,使用OFRcord格式的数据集可以提高数据加载效率(但这非必须,参考[数据输入](http://183.81.182.202:8000/basics_topics/data_input.html),oneflow支持直接加载numpy数据)。
>
> 2)为了使读者快速上手,我们提供了一个小的示例数据集。直接下载,即可快速开始训练过程。读者可以在熟悉了流程后,可以参考数据集制作部分,制作完整的数据集。
>
> 3)“合成数据”是指不通过磁盘加载数据,而是直接在内存中生成一些随机数据,作为网络的数据输入源。
### 1.训练&验证
```shell
sh train.sh
......@@ -55,7 +81,7 @@ sh train.sh
- --model 使用的模型
#### 3.推理
### 2.推理
```shell
sh inference.sh
```
......@@ -70,9 +96,7 @@ sh inference.sh
下面,我们将重点介绍经典CNN网络:Resnet,以及如何利用OneFlow训练Resnet50,并对标Nvidia的Mxnet版实现。
### ResNet
## ResNet
[ResNet](https://arxiv.org/abs/1512.03385) 是2015年ImageNet竞赛的冠军。目前,ResNet相对对于传统的机器学习分类算法而言,效果已经相当的出色,之后大量的检测,分割,识别等任务也都在ResNet基础上完成。
......@@ -87,50 +111,11 @@ sh inference.sh
准备好亲自动手,复现上面的结果了吗?
准备好亲自动手,复现上面的结果了吗?那么接下来,立马开始OneFlow的图像识别之旅吧!
下面,本文就以上面的ResNet50 为例,一步步展现如何使用OneFlow进行网络的训练和预测。
## 准备工作 Requirements
别担心,使用OneFlow非常容易,只要准备好下面三步,即可开始OneFlow的图像识别之旅。
- 安装OneFlow。
- 直接通过pip安装:`pip install oneflow` (TODO:确定我们的pip源是否做好,问caishenghang)
- 其他安装方式:参考[这里](XXX)(TOOD:待补充链接,链接到编译安装的文档说明) 。
- 下载[OneFlow-Benchmark](https://github.com/Oneflow-Inc/OneFlow-Benchmark/tree/of_develop_py3/cnn_benchmark)仓库。
`git clone git@github.com:Oneflow-Inc/OneFlow-Benchmark.git`
- 准备数据集(可选)
- 下载示例数据集:
`wget https://oneflow-public.oss-cn-beijing.aliyuncs.com/datasets/imagenet_ofrecord_example/part-00000`
- 或者:制作完整OFRecord格式的ImageNet数据集(见下文进阶部分)
- 再或者:直接使用虚拟“合成数据”。
**关于数据集的说明:**
> 1)本文的展示的代码中,使用OFRcord格式的数据集可以提高数据加载效率(但这非必须,参考[数据输入](http://183.81.182.202:8000/basics_topics/data_input.html),oneflow支持直接加载numpy数据)。
>
> 2)为了使读者快速上手,我们提供了一个小的示例数据集。直接下载,即可快速开始训练过程。读者可以在熟悉了流程后,可以参考数据集制作部分,制作完整的数据集。
>
> 3)“合成数据”是指不通过磁盘加载数据,而是直接在内存中生成一些随机数据,作为网络的数据输入源。
## 快速开始 Quick Start
那么接下来,立马开始OneFlow的图像识别之旅吧!
### 训练和验证(Train & Validation)
先切换到代码目录:
......@@ -138,18 +123,12 @@ sh inference.sh
cd OneFlow-Benchmark/Classification/cnns
```
### 训练和验证(Train & Validation)
在命令行执行:
```
sh train.sh
```
若在屏幕上不断打印出类似下面的信息,则表明训练过程正常运行:
```
......@@ -161,8 +140,6 @@ Saving model to ./output/snapshots/model_save-20200629223546/snapshot_epoch_0.
validation: epoch 0, iter 100, top_1: 0.074620, top_k: 0.194120, samples/s: 2014.683
```
可以看到:
- 随着训练的进行,loss不断下降,而训练的top_1/top_k准确率不断提高(其中top_k默认为top_5准确率,可自定义)。
......@@ -189,19 +166,9 @@ validation: epoch 0, iter 100, top_1: 0.074620, top_k: 0.194120, samples/s: 2014
### 预测(Inference)
恭喜,到这里,您已经知道如何用OneFlow训练模型。
接下来,试试用训练好的模型对新图片进行分类预测吧!
**关于模型,您可以选择:**
- 使用刚才训练出的模型进行预测。
- 或者,下载已训练好的模型:[resnet_v1.5_model](https://oneflow-public.oss-cn-beijing.aliyuncs.com/model_zoo/resnet_v15_of_best_model_val_top1_77318.tgz ) (validation accuracy: 77.318% top1,93.622% top5 )。
- 再或者,将其他框架已有的模型转换成OneFlow模型,见下面模型转换的部分。(TODO:模型转换内容补充后,怎加这里的跳转链接)
恭喜,到这里,您已经知道如何用OneFlow训练模型,接下来,试试用训练好的模型对新图片进行分类预测吧!
预测之前,需要准备你自己训练的模型,或者用我们在下面提供的在完整Imagenet(2012)上训练好的模型。
准备好模型后,将模型目录填入`inference.sh` 脚本的`MODEL_LOAD_DIR`变量中,然后执行以下命令,开始对图片`test_img/tiger.jpg`的类别的进行预测:
......@@ -209,7 +176,6 @@ validation: epoch 0, iter 100, top_1: 0.074620, top_k: 0.194120, samples/s: 2014
sh inference.sh
```
若输出下面的内容,则表示预测成功:
```
......@@ -217,11 +183,23 @@ test_img/tiger.jpg
0.81120294 tiger, Panthera tigris
```
### 模型(Model)
**关于模型,您可以选择:**
- 自己训练的模型
- 或者,下载我们已训练好的模型:[resnet_v1.5_model](https://oneflow-public.oss-cn-beijing.aliyuncs.com/model_zoo/resnet_v15_of_best_model_val_top1_77318.tgz ) (validation accuracy: 77.318% top1,93.622% top5 )。
## 更详细的说明 Details
### 分布式训练
简单而易用的分布式,是OneFlow的主打特色之一。
OneFlow框架从底层设计上,就原生支持高效的分布式训练。尤其对于分布式的数据并行,用户完全不用操心算法从单机单卡扩展到多机多卡时,数据如何划分以及同步的问题。也就是说,使用OneFlow,用户以单机单卡的视角写好算法,自动具备多机多卡分布式数据并行的能力。
**简单而易用的分布式,是OneFlow的主打特色之一。**
OneFlow框架从底层设计上,就原生支持高效的分布式训练。尤其对于分布式的数据并行,用户完全不用操心算法从单机单卡扩展到多机多卡时,数据如何划分以及同步的问题。也就是说,使用OneFlow,用户以单机单卡的视角写好算法,**自动具备多机多卡分布式数据并行的能力。**
#### 如何配置并运行分布式训练?
......@@ -229,7 +207,7 @@ OneFlow框架从底层设计上,就原生支持高效的分布式训练。尤
例如,想要在2机8卡上进行分布式训练,像下面这样配置:
```
```shell
# train.sh
python3 of_cnn_train_val.py \
--num_nodes=2 \
......@@ -240,7 +218,7 @@ python3 of_cnn_train_val.py \
```
然后分别在两台机器上,同时执行:
```
```shell
./train.sh
```
......@@ -258,7 +236,7 @@ python3 of_cnn_train_val.py \
只需要在`train.sh`脚本中添加参数`--use_fp16=True`即可。
#### 预训练模型
#### 混合精度模型
我们为您提供了一个在Imagenet2012完整训练了90个epoch的混合精度模型,top_1:77.33%
......@@ -274,7 +252,7 @@ Oneflow的ResNet50实现,为了保证和[英伟达的Mxnet版实现](https://g
#### Data Augmentation
##### 训练
**训练**
1. 随机采样图像并将其解码为[0; 255]。
2. 随机裁剪一个矩形区域,该矩形区域的长宽比以[3/4; 4/3]和以[8%;100%],然后将裁剪的区域调整为224 x 224平方的图像。
......@@ -295,7 +273,7 @@ Oneflow的ResNet50实现,为了保证和[英伟达的Mxnet版实现](https://g
| 6.1 Normalize mean | Yes | Yes |
| 6.2 Normalize std | Yes | Yes |
##### 验证
**验证**
- 将每个图像的短边调整为256像素,同时保持其宽高比。
- 裁剪中心的224×224区域
......@@ -403,7 +381,7 @@ OneFlow和英伟达保持了相同的初始化方式,只是在两个框架中
```
那么,一键执行以下脚本即可完成训练集和验证集 > OFRecord的转换:
**转换训练集**
##### 转换训练集
```shell
python3 imagenet_ofrecord.py \
......@@ -415,7 +393,7 @@ python3 imagenet_ofrecord.py \
--height 224 --width 224
```
**转换验证集**
##### 转换验证集
```shell
python3 imagenet_ofrecord.py \
......@@ -427,7 +405,7 @@ python3 imagenet_ofrecord.py \
--height 224 --width 224
```
**参数说明:**
##### 参数说明
```shell
--train_directory
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册