当前位置:   article > 正文

paddlepaddle重写波士顿房价预测_lstm房价预测

lstm房价预测

目录

1.导包

2.数据处理

3.模型设计

4.训练配置

5.训练过程

6.模型保存

7.预测

1.导包

  1. import paddle #paddle的主库
  2. from paddle.nn import Linear #神经网络的全连接层函数
  3. import paddle.nn.functional as F #组网相关的API,包括 Linear、卷积 Conv2D、循环神经网络LSTM、损失函数CrossEntropyLoss、激活函数ReLU等
  4. import numpy as np
  5. import os
  6. import random

代码中参数含义如下:

  • paddle:飞桨的主库,paddle 根目录下保留了常用API的别名,当前包括:paddle.tensor、paddle.framework、paddle.device目录下的所有API;
  • Linear:神经网络的全连接层函数,包含所有输入权重相加的基本神经元结构。在房价预测任务中,使用只有一层的神经网络(全连接层)实现线性回归模型。
  • paddle.nn:组网相关的API,包括 Linear、卷积 Conv2D、循环神经网络LSTM、损失函数CrossEntropyLoss、激活函数ReLU等;
  • paddle.nn.functional:与paddle.nn一样,包含组网相关的API,如:Linear、激活函数ReLU等,二者包含的同名模块功能相同,运行性能也基本一致。 差别在于paddle.nn目录下的模块均是类,每个类自带模块参数;paddle.nn.functional目录下的模块均是函数,需要手动传入函数计算所需要的参数。在实际使用时,卷积、全连接层等本身具有可学习的参数,建议使用paddle.nn;而激活函数、池化等操作没有可学习参数,可以考虑使用paddle.nn.functional。

2.数据处理

  1. #数据处理
  2. def load_data():
  3. datafile = "./data/data108228/housing.data"
  4. data = np.fromfile(datafile, sep =' ' , dtype=np.float32)
  5. #13个特征,一个标签
  6. feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
  7. 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
  8. feature_num = len(feature_names)
  9. #//代表整数除法
  10. data = data.reshape([data.shape[0] // feature_num, feature_num])
  11. #80%作为训练集,20%作为测试集
  12. ratio = 0.8
  13. offset = int(data.shape[0]*ratio)
  14. training_data = data[:offset]
  15. #归一化
  16. #计算最大值,最小值,平均值
  17. max = training_data.max(axis=0)
  18. min = training_data.min(axis=0)
  19. avg = training_data.sum(axis=0) / training_data.shape[0]
  20. global max_values
  21. global min_values
  22. global avg_values
  23. max_values = max
  24. min_values = min
  25. avg_values = avg
  26. for i in range(feature_num):
  27. data[:, i] = (data[:, i] - avg[i]) / (max[i] - min[i])
  28. #划分训练集和测试集
  29. training_data = data[:offset]
  30. test_data = data[offset:]
  31. return training_data,test_data
  32. #验证数据集读取
  33. training_data, test_data = load_data()
  34. print(training_data.shape)
  35. print(training_data[1,:])

运行结果:

 

3.模型设计

  1. class Regressor(paddle.nn.Layer):
  2. # self代表类的实例自身
  3. def __init__(self):
  4. # 初始化父类中的一些参数
  5. super(Regressor, self).__init__()
  6. # 定义一层全连接层,输入维度是13,输出维度是1
  7. self.fc = Linear(in_features=13, out_features=1)
  8. # 网络的前向计算
  9. def forward(self, inputs):
  10. x = self.fc(inputs)
  11. return x
  • 定义init函数:在类的初始化函数中声明每一层网络的实现函数。在房价预测任务中,只需要定义一层全连接层,模型结构和《使用Python和NumPy构建神经网络模型》章节保持一致;
  • 定义forward函数:构建神经网络结构,实现前向计算过程,并返回预测结果,在本任务中返回的是房价预测结果。

4.训练配置

  1. #训练配置
  2. #声明定义好的线性回归模型
  3. model = Regressor()
  4. #开启训练模式
  5. model.train()
  6. #加载数据
  7. training_data,test_data = load_data()
  8. #定义优化算法,使用随机梯度下降SGD
  9. #学习率设为0.01
  10. opt = paddle.optimizer.SGD(learning_rate=0.01,parameters=model.parameters())

5.训练过程

  1. #训练过程
  2. epoch_num=10
  3. batch_size=10
  4. for epoch_id in range(epoch_num):
  5. #每轮迭代开始前,将训练数据随机打乱
  6. np.random.shuffle(training_data)
  7. #将训练数据进行拆分,每个batch包含10条数据
  8. mini_batch = [training_data[k:k+batch_size] for k in range(0,len(training_data),batch_size)]
  9. #定义内层循环
  10. for iter_id,mini_batch in enumerate(mini_batch):
  11. x = np.array(mini_batch[:,:-1]) #获得当前批次的训练数据
  12. y = np.array(mini_batch[:,-1:]) #获得当前批次训练标签(真实房价)
  13. #将numpy数据转为飞桨动态图tensor的格式
  14. house_features = paddle.to_tensor(x)
  15. prices = paddle.to_tensor(y)
  16. #前向计算
  17. predicts = model(house_features)
  18. #计算损失
  19. loss = F.square_error_cost(predicts, label=prices)
  20. avg_loss = paddle.mean(loss)
  21. if iter_id%20==0:
  22. print("epoch: {}, iter: {}, loss is: {}".format(epoch_id, iter_id , avg_loss.numpy()))
  23. #反向传播
  24. avg_loss.backward()
  25. #更新参数
  26. opt.step()
  27. #清空梯度变量,以备下一轮计算
  28. opt.clear_grad()
  • 内层循环: 负责整个数据集的一次遍历,采用分批次方式(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):

运行结果:

 

6.模型保存

  1. #保存模型参数
  2. paddle.save(model.state_dict(),'LR.model.pdparams')
  3. print("模型保存成功,模型参数保存在LR.model.pdparams中")

7.预测

  1. def load_one_example():
  2. idx = np.random.randint(0,test_data.shape[0])
  3. idx = -10
  4. one_data,label = test_data[idx, :-1] , test_data[idx,-1]
  5. one_data = one_data.reshape([1,-1]) #1行任意列
  6. return one_data,label
  7. model_dict = paddle.load('LR.model.pdparams')
  8. model.load_dict(model_dict)
  9. model.eval()
  10. one_data , label = load_one_example()
  11. one_data = paddle.to_tensor(one_data)
  12. predict = model(one_data)
  13. # 对结果做反归一化处理
  14. predict = predict * (max_values[-1] - min_values[-1]) + avg_values[-1]
  15. # 对label数据做反归一化处理
  16. label = label * (max_values[-1] - min_values[-1]) + avg_values[-1]
  17. print("Inference result is {}, the corresponding label is {}".format(predict.numpy(), label))

运行结果:

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/429705
推荐阅读
相关标签
  

闽ICP备14008679号