深度学习——使用国产深度学习框架“飞桨(PaddlePaddle)”重写房价预测模型

2023-11-06

一、安装飞桨

  1. 官方教程:https://www.paddlepaddle.org.cn/install/quick
    博主本人使用的是Windows+pip+Python3+CPU版本
    安装过程十分简单,在此不再赘述。

二、使用飞桨重写模型

说明:普通方法实现房价预测模型,在本人的上一篇文章中有详细说明,戳链接即可查看
https://blog.csdn.net/narutodzx/article/details/106319806

  1. 首先需要导入相关库

    # paddle/fluid:飞桨的主库,目前大部分的实用函数均在paddle.fluid包内。
    # dygraph:动态图的类库。
    import paddle.fluid as fluid
    import paddle.fluid.dygraph as dygraph
    from paddle.fluid.dygraph import Linear
    import numpy as np
    
    
  2. 数据处理
    注:
    此次数据处理新增了:记录数据的归一化参数,在预测时对数据做归一化。其余部分与上一篇文章相同,详细说明可戳上方链接查看。

    def load_data():
        firstdata = np.fromfile('housing.data', sep=' ')
        # 添加属性
        feature_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT',
                         'MEDV']
        # 列的长度
        feature_num = len(feature_names)
        # 构造506*14的二维数组
        data = firstdata.reshape([firstdata.shape[0] // feature_num, feature_num])
    
        # 训练集设置为总数据的80%
        ratio = 0.8
        offset = int(data.shape[0] * ratio)
        training_data = data[:offset]
    
        # 训练集每列的最大值、最小值、平均值
        maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), training_data.sum(axis=0) / \
                                   training_data.shape[0]
    
        # 记录数据的归一化参数,在预测时对数据做归一化
        global max_values
        global min_values
        global avg_values
        max_values = maximums
        min_values = minimums
        avg_values = avgs
    
        # 对所有数据进行归一化处理
        for i in range(feature_num):
            data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
    
        # 覆盖上面的训练集
        training_data = data[:offset]
        # 剩下的20%为测试集
        test_data = data[offset:]
        return training_data, test_data
    
  3. 模型设计
    注:
    FC:神经网络的全连接层函数,即包含所有输入权重相加和激活函数的基本神经元结构。在房价预测任务中,使用只有一层的神经网络(全连接层)来实现线性回归模型。

    class Regressor(fluid.dygraph.Layer):
        def __init__(self):
            super(Regressor, self).__init__()
            # 定义一层全连接层
            # 输入维度为13,输出维度为1,不适用激活函数
            self.fc = Linear(input_dim=13, output_dim=1, act=None)
    
        # 网络的前向计算函数,返回预测结果
        def forward(self, inputs):
            x = self.fc(inputs)
            return x
    
  4. 训练配置
    注:
    模型实例有两种状态:训练状态 .train()预测状态 .eval()
    训练时要执行正向计算和反向传播梯度两个过程,而预测时只需要执行正向计算。

    # 定义飞桨动态图的工作环境
    with fluid.dygraph.guard():
        model = Regressor()
        # 开启模型训练
        model.train()
        training_data, test_data = load_data()
        # 定义优化算法,SGD为随机梯度下降法
        # 学习率为0.01
        opt = fluid.optimizer.SGD(learning_rate=0.01, parameter_list=model.parameters())
    
    
  5. 训练过程
    步骤:
    数据准备:将一个批次的数据转变成np.array和内置格式。
    前向计算:将一个批次的样本数据灌入网络中,计算输出结果。
    计算损失函数:以前向计算结果和真实房价作为输入,通过损失函数square_error_cost计算出损失函数值(Loss)。
    反向传播:执行梯度反向传播backward函数,即从后到前逐层计算每一层的梯度,并根据设置的优化算法更新参数opt.minimize。
    保存模型:将模型当前的参数数据model.state_dict()保存到文件中(通过参数指定保存的文件名 LR_model),以备预测或校验的程序调用。

    with dygraph.guard(fluid.CPUPlace()):
        EPOCH_NUM = 10
        BATCH_SIZE = 10
    
        # 外层循环
        for epoch_id in range(EPOCH_NUM):
            # 打乱训练数据顺序
            np.random.shuffle(training_data)
            # 拆分数据,每个mini_batches包含10条数据
            mini_batches = [training_data[k:k + BATCH_SIZE] for k in range(0, len(training_data), BATCH_SIZE)]
    
            # 内层循环
            for iter_id, mini_batch in enumerate(mini_batches):
                x = np.array(mini_batch[:, :-1]).astype('float32')
                y = np.array(mini_batch[:, -1:]).astype('float32')
    
                # 将numpy数据转化为飞桨动态图variable形式
                house_features = dygraph.to_variable(x)
                prices = dygraph.to_variable(y)
                # 前向计算
                predicts = model(house_features)
                # 计算损失
                loss = fluid.layers.square_error_cost(predicts, label=prices)
                avg_loss = fluid.layers.mean(loss)
                if iter_id % 20 == 0:
                    print("epoch: {}, iter: {}, loss is: {}".format(epoch_id, iter_id, avg_loss.numpy()))
                # 反向传播
                avg_loss.backward()
                # 最小化loss,更新参数
                opt.minimize(avg_loss)
                # 清除数据
                model.clear_gradients()
    
        # 保存模型
        fluid.save_dygraph(model.state_dict(), 'LR_model')
    
  6. 测试模型

    def load_one_example(data_dir):
        f = open(data_dir, 'r')
        datas = f.readlines()
        # 倒数第十条数据
        tmp = datas[-10]
        # 修改数据格式
        tmp = tmp.strip().split()
        # 修改数据类型
        one_data = [float(v) for v in tmp]
    
        # 归一化处理
        for i in range(len(one_data) - 1):
            one_data[i] = (one_data[i] - avg_values[i]) / (max_values[i] - min_values[i])
    
        # 取one_data的前13个数据,修改矩阵为1行13列,再变化数组类型
        # 【2】【3】
        data = np.reshape(np.array(one_data[:-1]), [1, -1]).astype(np.float32)
        # 取one_data的最后一个数据
        label = one_data[-1]
        return data, label
    
    
    with dygraph.guard():
        # 载入保存的模型
        model_dict, _ = fluid.load_dygraph('LR_model.pdparams')
        model.load_dict(model_dict)
        # 调整模型状态
        model.eval()
    
        # 读取数据
        test_data, label = load_one_example('housing.data')
        # 将数据转化为飞桨动态图variable形式
        test_data = dygraph.to_variable(test_data)
        results = model(test_data)
    
        # 对结果进行反归一化处理
        results = results * (max_values[-1] - min_values[-1]) + avg_values[-1]
        print("Inference result is {}, the corresponding label is {}".format(results.numpy(), label))
    
    

    输出结果:
    在这里插入图片描述

  7. 总结
    飞桨很大程度的上降低了深度学习的学习成本,深度学习框架对入门者很友好,编写少量的代码即可实现需要的功能。

参考:

【1】https://www.paddlepaddle.org.cn/tutorials/projectdetail/392090
【2】https://blog.csdn.net/ms961516792/article/details/79467002/
【3】https://blog.csdn.net/doufuxixi/article/details/80357444

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习——使用国产深度学习框架“飞桨(PaddlePaddle)”重写房价预测模型 的相关文章

  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • 使用 MongoDB 作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

    我们目前正在为一家专业公司内部实施类似 CRM 的解决方案 由于存储信息的性质以及信息的不同值和键 我们决定使用文档存储数据库 因为它完全适合目的 在本例中我们选择 MongoDB 作为此 CRM 解决方案的一部分 我们希望存储实体之间的关
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 如何在 Matplotlib 饼图周围绘制箭头以将每个标签指向圆圈中各自的部分?

    我一直在用 Matplotlib 绘制一些图表 我有一个饼图 想要在图表周围绘制箭头 使每个标签都指向图表 我有一个例子 这是我当前的代码 import matplotlib pyplot as plt plt rcParams font
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • pandas DataFrame.join 的运行时间是多少(大“O”顺序)?

    这个问题更具概念性 理论性 与非常大的数据集的运行时间有关 所以我很抱歉没有一个最小的例子来展示 我有一堆来自两个不同传感器的数据帧 我需要最终将它们连接成两个very来自两个不同传感器的大数据帧 df snsr1 and df snsr2
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • MongoEngine 查询具有以列表中指定的前缀开头的属性的对象的列表

    我需要在 Mongo 数据库中查询具有以列表中任何前缀开头的特定属性的元素 现在我有一段这样的代码 query mymodel terms term in query terms 并且这会匹配在列表 term 上有一个项目的对象 该列表中的
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的

随机推荐

  • web 前后台数据交互的方式

    做web开发 很重要的一个环节就是前后台的数据的交互 数据从页面提交到contoller层 数据从controler层传送到jsp页面来显示 这2个过程中数据具体是如何来传送的 是本节讲解的内容 首先说一下数据如何从后台的contorlle
  • ubuntu22.04.1设置root登陆

    一 设置root密码 sudo passwd root 输入自己的超级用户密码 设置root账户密码 二 设置系统登陆界面 1 su root 2 gedit etc pam d gdm autologin 在弹出窗口中找到 auth re
  • numpy.argsort()函数参数以及案例问题

    参考博客网址是 numpy argsort函数 summer2day的博客 CSDN博客 argsort函数numpy argsort a axis 1 kind quicksort order None 返回的是数组值从小到大的索引值 参
  • JAVA获取部门人员树

    直接上代码 无需多言 主要还是递归 实体类 Data ApiModel NoArgsConstructor public class TreeDept implements Serializable type 0 表示是部门 type 1
  • 一个好用的在线RSS阅读器

    最近用国外IP访问有道阅读貌似有问题 于是找了一些替代品尝试 http reader aol com 这个和Google Reader最相似 不过导入有道阅读的OPML总是不成功 http www inoreader com 这个也相当好
  • Debian 10 安装网络yum源

    Debian 10 安装网络yum源 实验环境一台最小化Debian10 IP地址是192 168 10 1 24 还需要一张外网的网卡 配置网络 vim etc network interfaces 编辑网络配置文件 auto ens37
  • Python提取评论(使用pycharm+Python)

    一 安装调用所要用到的库函数 import requests from bs4 import BeautifulSoup 二 自定义根据每页影评的url爬取影评的方法 1 请求url def getData url 三 请求头为字典格式 h
  • java图片转base64注意事项

    java转base64有两点需要注意的地方 在window操作系统中 图片转换为base64 在base64的字符串中会有默认换行 这就破坏了json格式 所以这里需要做一下处理 除此之外 在java转base64时 会缺少base64字符
  • torch.cat的参数dim到底是在哪个维度拼接

    如果将两个维度为 n c h w 进行拼接 如果指定dim为以下值 dim 0 拼接后维度为 2n c h w dim 1 拼接后维度为 n 2c h w dim 2 拼接后维度为 n c 2h w dim 3 拼接后维度为 n c h 2
  • C#常见变量类型和使用规则

    C 常见变量类型和使用规则 常见变量类型 C 中值类型的变量主要包括整数类型 浮点类型 金钱 decimal 类型和布尔 bool 类型等 1 整数类型 int 范围 2 147 483 648 2 147 483 647 大小 32位有符
  • 合宙Air001点灯+闪烁(寄存器版)

    观前提醒 只是我学单片机的一个简单记录 会比较啰嗦 但是我在研究单片机寄存器过程中真实的心得体会 希望能帮到读者 打完电赛觉得自己的单片机白学了 于是想从寄存器从头开始学一遍单片机 刚好前段时间发现合宙AIR001这款单片机 外设较少且相对
  • QT之TCP网络传输系列 - 目录

    最近被大boss安排做纯软件开发项目 囧 本来我硕士方向是 传统机器学习特征提取 这一部分 读博近两年主要做 以深度学习为基础的视频分析 相关研究 我一个搞算法的去做软件开发 都是泪啊 但为了毕业 给啥任务都能 得 完成 o o 以下整理一
  • 热门去水印小助手小程序独立安装版+前端免费分享

    热门去水印小助手小程序独立安装版来自网络资源 请自测 该源码是本人在外面找回来 大家可以测试自用下 看看有什么瑰丽 去水印的也是比较火的 现在各大平台 搬运视频 大家都需要的 但是给大家一个建议 这个网上分享的共享开源源码 一般是有限制的
  • Python连接hive数据中遇到的各种坑

    这里选择的是使用 impala Python3 6来连接hive数据库 第一步要先在服务器开启hiveserver2 服务 不然会连不上的 报如下错误 开启方法很简单 到hive安装目录的bin目录下 your path apache hi
  • (三)springcloud之Consul注册服务与发现

    此文主要记录springcloud的zookeeper的注册与发现 没有过多解释 只是为了提供后期拷贝使用 主要模块分为 0 父工程模块 主要用来作为版本管理 1 公共模块Common API 用来封装其他模块的共同的功能 比如bean类
  • 为什么说分布式KVM系统是中小型指挥中心应用最广泛的控制系统?

    众所周知 在指挥中心 控制中心等场景 光纤KVM是部署控制系统的最优解 但是对于大量在的中小型指挥中心 区县级指挥中心 会议室等项目来说 必须要考虑建设的预算费用 这时部署成本适中的分布式KVM无疑是更实用的选择 目前 分布式KVM成为国内
  • QNX学习笔记-Neutrino-QNX-boot启动流程分析

    锋影 e mail 174176320 qq com 嵌入式系统的启动都是类似的 先启动一个boot程序 然后又boot控制系统的进一步加载运行 1 处理从复位向量执行代码 2 启动系统的启动代码 qnx的启动代码就是IPL 3 IPL会将
  • 计算机总是跳出交互式检测,交互式服务检测,教您如何解决电脑总是弹出交互式服务检测...

    电脑总是会弹出交互式服务检测窗口 无法关掉 只能 点击稍后提醒我 但一会儿又会提醒 这让人感觉很烦 其实 只要在系统服务里将Interactive Services Detection服务禁用即可解决此问题 下面 小编跟大家分享解决电脑总是
  • Vite 与 Vue Cli 对比 - 尤雨溪: Vite 会取代 vue-cli 吗?

    本文完整版 Vite 与 Vue Cli 对比 尤雨溪 Vite 会取代 vue cli 吗 Vite 与 Vue Cli 对比 一 Vite 与 Vue CLI 是什么 Vue CLI 的特点 Vite 的特点 二 Vite 和 Vue
  • 深度学习——使用国产深度学习框架“飞桨(PaddlePaddle)”重写房价预测模型

    一 安装飞桨 官方教程 https www paddlepaddle org cn install quick 博主本人使用的是Windows pip Python3 CPU版本 安装过程十分简单 在此不再赘述 二 使用飞桨重写模型 说明