AI模型开发流程
AI模型开发基本流程分为以下步骤:明确任务类型、数据预处理、模型训练、模型评估、模型部署。
明确任务类型
根据待解决的关键问题分析和明确AI模型的任务类型,比如分类、检测、跟踪等任务类型。如针对智慧交通路口行人闯红灯案例提供可靠解决方案,可以明确为行人检测的任务类型。
数据预处理
获取数据并进行数据预处理,让准备数据与模型数据输入格式保持一致。
模型训练
基于AI引擎(如OneFlow)创建以解决业务需求的AI模型,包括搭建前向网络、定义损失函数、选择优化器三个步骤。模型训练旨在将生成的AI模型应用到新数据中做推理任务。
模型评估
模型评估是衡量训练模型质量的必要过程,模型评估是根据业务需求和任务类型来确定评估指标,如准确率、召回率、F1_Score等。模型开发通常不能一次性能得到满意效果,往往需要根据模型评估结果不断调参、调整数据集、优化网络结构等策略优化模型。
模型部署
模型部署是利用训练所得的一个满意模型对实际需求中的新数据进行推理预测,根据推理结果制定商业决策。
OneFlow模型如何初始化导入和保存?
转自<ShawnXuan>
当训练了一个神经网络,我们需要把模型保存下来用于后续使用或者部署生产。通常来说保存模型(Model),也有称作保存检查点(Checkpoint)或者说保存快照(Snapshot),这三种说法有一些差别,但目前在OneFlow中没有做严格的区分。
当训练了一个神经网络,我们需要把模型保存下来用于后续使用或者部署生产。通常来说保存模型(Model),也有称作保存检查点(Checkpoint)或者说保存快照(Snapshot),这三种说法有一些差别,但目前在OneFlow中没有做严格的区分。
# OneFlow模型的存储
OneFlow模型是一组已经被训练好的网络的`参数值`,目前OneFlow的模型中没有包括网络的元图信息(Meta Graph)。这些`参数值`分别被存储在以变量名命名的`子目录`中。
下面的例子是AlexNet在训练时保存的`子目录`的列表。
```
.
├── conv1-bias
│ └── out
├── conv1-weight
│ └── out
├── conv2-bias
│ └── out
├── conv2-weight
│ └── out
├── conv3-bias
│ └── out
├── conv3-weight
│ └── out
├── conv4-bias
│ └── out
├── conv4-weight
│ └── out
├── conv5-bias
│ └── out
├── conv5-weight
│ └── out
├── fc1-weight
│ └── out
├── fc2-weight
│ └── out
├── fc3-weight
│ └── out
├── snapshot_done
└── System-Train-TrainStep-TrainNet
└── out
```
上面的例子中:
- 前面都是以变量名命名的子目录;
- 每个子目录下面都有一个名为`out`的文件,该文件中保存了参数值,通常网络中的一个参数对应的是一个有一定元信息(形状和数据类型)的参数矩阵,目前`out`文件是该参数矩阵直接二进制存储下来的,所以元信息没有被保存在`out`文件里。另外这里的文件名`out`是缺省配置可以在网络中的variable op中修改;
- `snapshot_done`是OneFlow自动生成的一个空文件,表明这个快照已经被完整保存了;
- `System-Train-TrainStep-TrainNet`中保存的是保存快照时候的训练步数。
所有的`子目录`处在同一个文件夹下也就是`父目录`,用户需要在脚本中指定该`父目录`用于模型的保存或者导入。
# OneFlow模型的python接口
OneFlow模型管理预留了python接口,是通过`CheckPoint`类实现的,通过`oneflow.train.CheckPoint()`方式调用。
`CheckPoint`类有三个关键函数:
1. `save` - 负责保存当前的模型到`path`目录;
2. `init` - 根据缺省的初始化方式,初始化参数变量;
3. `load` - 从指定`path`中导入模型值,并用这些值初始化相应的参数变量。
# 模型的初始化、导入和保存中会遇到的问题
目前OneFlow框架支持了模型处理方面最基础的功能,在实际的操作中可能会碰到一些问题,这里罗列一些。
## 模型的显示初始化
在进行网络的训练或者推理前,需要显式的初始化模型,也就是初始化网络中的参数变量(variable op),否则这些参数的初始值就很可能不符合期待。
整个网络初始化的方式有两种:
1. 调用前面介绍的`init`函数,这样每个参数变量(variable op)都会根据自己的初始化方式进行初始化;
2. 调用`load`函数,从指定目录中读取用于初始化的值。
## 模型部分初始化和部分导入
实际使用中经常碰到这么一些场景,特别是在系统精调或者迁移学习的时候碰到:
1. 新的网络已一个经典的网络为骨干网,拓展一些新的网络结构,骨干网部分的模型已经被训练好了,训练新的网络时需要被导入(load);而新拓展网络部分的模型需要被按照指定方式初始化(init);
2. 原来网络已经被训练,需要按照新的优化方式重新训练,新的优化方式带来了一些额外的参数变量,比如momentum或者adam;原来的参数变量需要被导入(load),而额外的参数变量需要被初始化(init);
总之我们会碰到,希望导入`load`一部分模型,初始化`init`其他部分模型的情况,目前我们的建议是:
1. 首先用`init`方式初始化所有的模型并保存下来;
2. 再把希望导入`load`那部分模型的子目录覆盖第一步中相应的子目录;
3. 最后用导入`load`方式运行脚本。
## 模型的保存
在训练过程中,理论上每一步训练都可以进行模型的保存,但保存频率太高会加重磁盘的负担(带宽和容量)。
请登录后评论~