首先加载飞桨,NumPy和相关类库
import paddle from paddle.nn import Linear import paddle.nn.functional as F import numpy as np import os import random
- 动态图模式(命令式编程范式,类比Python):解析式的执行方式。用户无需预先定义完整的网络结构,每写一行网络代码,即可同时获得计算结果;
1.数据处理
2.模型设计
飞桨建议通过创建Python类的方式完成模型网络的定义,该类需要继承paddle.nn.Layer父类,并且在类中定义init函数和forward函数。
定义init函数:在类的初始化函数中声明每一层网络的实现函数。
定义forward函数:构建神经网络结构,实现前向计算过程,并返回预测结果,在本任务中返回的是房价预测结果
3.训练配置
模型实例有两种状态:训练状态.train()和预测状态.eval()。训练时要执行正向计算和反向传播梯度两个过程,而预测时只需要执行正向计算,为模型指定运行状态
4.训练过程
训练过程采用二层循环嵌套方式:
-
内层循环: 负责整个数据集的一次遍历,采用分批次方式(batch)。假设数据集样本数量为1000,一个批次有10个样本,则遍历一次数据集的批次数量是1000/10=100,即内层循环需要执行100次。
for iter_id, mini_batch in enumerate(mini_batches):
-
外层循环: 定义遍历数据集的次数,通过参数EPOCH_NUM设置。
for epoch_id in range(EPOCH_NUM):
batch的取值会影响模型训练效果,batch过大,会增大内存消耗和计算时间,且训练效果并不会明显提升(每次参数只向梯度反方向移动一小步,因此方向没必要特别精确);batch过小,每个batch的样本数据没有统计意义,计算的梯度方向可能偏差较大。
- 数据准备:将一个批次的数据先转换成nparray格式,再转换成Tensor格式;
- 前向计算:将一个批次的样本数据灌入网络中,计算输出结果;
- 计算损失函数:以前向计算结果和真实房价作为输入,通过损失函数square_error_cost API计算出损失函数值(Loss)。飞桨所有的API接口都有完整的说明和使用案例,可以登录飞桨官网API文档获取;
- 反向传播:执行梯度反向传播backward函数,即从后到前逐层计算每一层的梯度,并根据设置的优化算法更新参数(opt.step函数)。
5.保存并测试模型
5.1保存
使用paddle.save API将模型当前的参数数据 model.state_dict() 保存到文件中,用于模型预测或校验的程序调用。
5.2测试
将训练好的模型参数加载到模型实例中,由两个语句完成,第一句是从文件中读取模型参数;第二句是将参数内容加载到模型。



