使用飞桨书写模型的时候,流程与前面介绍的是一摸一样的。
下面开始总结一下如何使用飞桨写模型
加载飞桨库
主库:paddle/fluid
动态图类库:digraph(便于调试)
静态图模式(声明式编程范式,类比C++) | 动态图模式 (命令式编程范式,类比Python) |
---|---|
先编译后执行的方式。用户需预先定义完整的网络结构,再对网络结构进行编译优化后,才能执行获得计算结果。 | 解析式的执行方式。用户无需预先定义完整的网络结构,每写一行网络代码,即可同时获得计算结果。 |
全连接层:Linear(可激活指定性函数)
数据处理
此部分包括数据导入、修改格式、分为训练测试集、数据归一化处理。
在飞桨中书写与前面完全一致。
模型设计
实质为定义线性回归的结构。
需要用到两种函数,init函数和forward函数。
init | forward |
---|---|
在类的初始化函数中声明每一层网络的实现函数。 | 构建神经网络结构,实现前向计算过程,并返回预测结果。 |
注:我们这里不使用激活函数
训练配置
-
定义工作环境
-
定义模型(有训练和预测状态)
模型实例有两种状态:训练状态.train()和预测状态.eval()。训练时要执行正向计算和反向传播梯度两个过程,而预测时只需要执行正向计算。为模型指定运行状态,有两点原因:
(1)部分高级的算子(例如Drop out和Batch Normalization,在计算机视觉的章节会详细介绍)在两个状态执行的逻辑不同。
(2)从性能和存储空间的考虑,预测状态时更节省内存,性能更好。 -
开启训练模式
-
读取数据
-
定义优化算法SDG,定义学习率0.01
-
开始训练
双层循环+四个步骤
(先将数据格式写为numpy.array格式) -
保存模型
先保存,加载,再进行测试。因为模型可以应用到不同的场景。 -
加载模型,进行预测
(1)生产模型实例,配置资源。
(2)加载模型参数,设置模型状态为“eval”(因为预测时,不需要反向传播梯度)
(3)调用模型,打印预测值与真实值
总结:编写成本大降低
感悟:飞桨提供了一个深度学习框架,可以达到事半功倍的效果。学习这一章之后其实我能够发现代码编写过程大大的减少了,但是飞桨的一些函数的定义与调用还没有特别的清楚,在init函数和forward函数的定义上还是不够理解,需要在接下来的学习过程中,去更好的理解和了解。
下面书写一下使用飞桨重写波士顿房价预测模型
直接使用python的案例在这里:完整步骤
#加载飞桨、Numpy和相关类库
import paddle
import paddle.fluid as fluid
import paddle.fluid.dygraph as dygraph
from paddle.fluid.dygraph import Linear
import numpy as np
import os
import random
#数据处理,此部分与前面的完全一致,飞桨的优化主要在模型设计和训练配置上
def load_data():
# 从文件导入数据
datafile = './work/housing.data'
data = np.fromfile(datafile, sep=' ')
# 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
feature_num = len(feature_names)
# 将原始数据进行Reshape,变成[N, 14]这样的形状
data = data.reshape([data.shape[0] // feature_num