1、实验简介
在本次实验中我们将使用 PaddlePaddle 来搭建一个简单的线性回归模型,并利用这一模型预测你的储蓄(在某地区)可以购买多大面积的房子。并且在学习模型搭建的过程中,了解到机器学习的若干重要概念,掌握一个机器学习预测的基本流程。
2、实验目的:
掌握机器学习基本概念:假设函数、损失函数、优化算法
掌握数据归一化处理技巧
掌握如何搭建全连接神经网络,实现线性回归
3、实验环境说明
Paddle 需要时 1.0 以上版本,python2.7,jupyter 上操作
4、数据集介绍:
本次数据集使用的是 2016 年 12 月份某市某地区的房价分布。为了简化模型,假设影响房价的因素只有房屋面积,因此数据集只有两列,以 TXT 的形式储存。
5、实验步骤:
5.1导入库:
说明:
numpy:一个 python 的基本库,用于科学计算
matplotlib.pyplot:用于生成图,在验证模型准确率和展示成本变化趋势时会使用到
paddle.fluid:PaddlePaddle 其中一种深度学习框架
pandas:一种基于 NumPy 的工具,高效处理数据
5.2数据预处理:
5.2.1数据集添加标题:
说明:数据集里面是没有标注“房屋面积”和“房价”的,我们可以自己加上这两列标注。
显示结果应该为:
5.2.2数据归一化:
接下来对数据集进行归一化操作
打印的输出结果应该为:
5.2.3数据集分割:
将原始数据处理为可用数据后,为了评估模型的好坏,我们将数据分成两份:训练集和测试 集。打印的输出结果应该为:
5.3定义 reader
构造 read_data()函数,来读取训练数据集 train_set 或者测试数据集 test_set。它的具体实现是在 read_data()函数内部构造一个 reader(),使用 yield 关键字来让 reader()成为一个 Generator(生成器),注意,yield 关键字的作用和使用方法类似 return 关键字,不同之处在于 yield 关键字可以构造生成器(Generator)。
虽然我们可以直接创建一个包含所有数据的列表,但是由于内存限制,我们不可能创建一个无限大的或者巨大的列表,并且很多时候在创建了一个百万数量级别的列表之后,我们却只需要用到开头的几个或几十个数据,这样造成了极大的浪费,而生成器的工作方式是在 每次循环时计算下一个值,不断推算出后续的元素,不会创建完整的数据集列表,从而节约了内存使用。
然后就可以得到训练数据和测试数据:
5.4训练过程:
5.4.1定义运算场所
将设计完成的网络参数写入 train_program() 函数,便于训练时调用:
5.4.2创建 optimizer:
feed_order=[‘x’, ‘y’] 是数据层名称和数组索引的映射,用于定义数据的读取顺序。
params_dirname 用于定义模型保存路径。
接下来定义事件处理器 event_handler_plot(event) 用于打印训练过程,在 fulid 中有两种形式的事件处理器,分别是文字形式与图像形式。本次使用的是图像形式的处理器,当训练
开始时调用该函数,可以得到 loss 变化图像,便于使用者进行参数调整。
5.4.3定义执行器:
用户配置完模型后,参数初始化操作会被写入到 fluid.default_startup_program() 中。使用fluid.Executor() 运行 这一程序,即可在全局 fluid.global_scope() 中随机初始化参数。
5.4.4设置训练参数:
5.4.5创建训练器并开始训练:
5.5训练过程可视化:
训练开始之后,得到的 cost 函数变化图像大致应是一个收敛的结果:
5.6预测:
5.6.1设定预测程序:
类似于 trainer.train,预测器需要一个预测程序来做预测。我们可以稍加修改我们的训练程序来把预测值包含进来。
5.6.2开始预测:
预测器会从 params_dirname 中读取已经训练好的模型,来对从未遇见过的数据进行预测。
tensor_x:生成 b atch_size 个[0,1]区间的随机数,以 tensor 的格式储存
results:预测对应 tensor_x 面积的房价结果
raw_x:由于数据处理时我们做了归一化操作,为了更直观的判断预测是否准确,将数据进行反归一化,得到随机数对应