【深度学习】DNN房价预测

打印 上一主题 下一主题

主题 827|帖子 827|积分 2481

前言

我们使用深度学习网络实现波士顿房价预测,深度学习的目的就是寻找一个合适的函数输出我们想要的结果。深度学习实际上是机器学习领域中一个研究方向,深度学习的目标是让机器能够像人一样具有分析学习的能力,能够识别文字、图像、声音等数据。我认为深度学习与机器学习最主要的区别就是神经元。
深度学习中重要内容

建立模型——神经元


  • 基本构造


    • 一个神经元对应一组权重w,a代表输入,我们把输入与权重相乘再相加,再加上偏置b,最后通过激活函得到对应的输出。
    • 我们不看激活函数,只看前面的部分会发现其实就是一个线性函数f=kx+b(k表示斜率,b表示截距)
    • w和b就是我们需要在训练中需要寻找的,
    • 学习网络就是通过很多个这样的神经元组合而成。

建立模型——激活函数


  • 为什么引入激活函数

    • 激活函数是为了增强网络的表达能力,我们需要激活函数来将线性函数转变为非线性函数。
    • 非线性的激活函数需要有连续性,因为连续非线性激活函数可导的,所以可以用最优化的方法来求解

  • 激活函数的种类

建立模型——前馈神经网络



  • 我们输入1和-1分别和每一组的权重相乘相加得到4和-2的结果,然后经过激活函数(激活函数实际上也是一个简单函数,但是具有某些特性,可以用来解决问题的目的,例如激活函数是y=x-1,我们输入4,输出结果就是3。)得到0.98和0.12.依次往后计算就是前馈神经网络。
建立模型——深度神经网络


  • 神经网络解决的问题有很多,例如分类、预测、回归等。这里我们给出两个解决类型。
  • 分类

    • 输出层就是输入的数据维度,例如我们要分类图形是正方型还是长方形,那我们可以是3维的输入,一个内角,两条临边。就可以判断。也可以是五维的,一个内角,4条边)
    • 输出层y就是结果,就上面举例的图形分类,那结果可以有2个,长方形和正方形,例如y1代表长方形,y2代表正方形,输出的结果那个数值大就是那种类型,也可以增加一个都不是的结果)



  • 预测

    • 今天的波士顿房价预测就是预测模型,我们通过地段,房屋面积等等,预测房价的多少。


损失函数


  • 常用损失函数
    平方损失函数、交叉熵损失函数,不同的问题运用不同的损失函数
  • 用于衡量我们输入结果和真实结果的差异
  • 目的通过损失去修正我们的参数是我们的模型更完美
实践——波士顿房价预测

数据集

使用paddle飞桨波士顿数据集
https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/text/UCIHousing_cn.html
绘图
  1. ## 绘图
  2. Batch = 0
  3. Batchs = []
  4. all_train_accs = []
  5. def draw_train_acc(Batchs,train_accs):
  6.     title = "training accs"
  7.     plt.title(title)
  8.     plt.xlabel("batch")
  9.     plt.ylabel("acc")
  10.     plt.plot(Batchs, train_accs, color = 'green', label = 'training accs')
  11.     plt.legend()
  12.     plt.grid()
  13.     plt.show()
  14. all_train_loss = []
  15. def draw_train_loss(Batchs,train_loss):
  16.     title = "training loss"
  17.     plt.title(title)
  18.     plt.xlabel("batch")
  19.     plt.ylabel("loss")
  20.     plt.plot(Batchs, train_loss, color = 'red', label = 'training loss')
  21.     plt.legend()
  22.     plt.grid()
  23.     plt.show()
  24. ## 绘制真实值与预测值的对比图
  25. def draw_infer_result(groud_truths, infer_results):
  26.     title = 'Boston'
  27.     plt.title(title)
  28.     x = np.arange(1,20)
  29.     y = x
  30.     plt.plot(x,y);
  31.     plt.xlabel("ground truth")
  32.     plt.ylabel("infer result")
  33.     plt.scatter(groud_truths,infer_results,color='green',label='training cost')
  34.     plt.grid()
  35.     plt.show()
复制代码
网络搭建
  1. '''
  2. 核心
  3. 网络搭建
  4. '''
  5. class MyDNN(paddle.nn.Layer):
  6.     def __init__(self):
  7.         super(MyDNN, self).__init__()
  8.         #self.linear1 = paddle.nn.Linear(13,1,None) #全连接层,paddle.nn.Linear(in_features,out_features,weight)
  9.         self.linear1 = paddle.nn.Linear(13, 32, None)
  10.         self.linear2 = paddle.nn.Linear(32, 64, None)
  11.         self.linear3 = paddle.nn.Linear(64, 32, None)
  12.         self.linear4 = paddle.nn.Linear(32, 1, None)
  13.     def forward(self, inputs): ## 传播函数
  14.         x = self.linear1(inputs)
  15.         x = self.linear2(x)
  16.         x = self.linear3(x)
  17.         x = self.linear4(x)
  18.         return x
复制代码
模型训练与测试
  1. '''
  2. 网络训练与测试
  3. '''
  4. ## 实例化
  5. model = MyDNN()
  6. model.train()
  7. mse_loss = paddle.nn.MSELoss()
  8. opt = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())
  9. epochs_num = 100
  10. for epochs in range(epochs_num):
  11.     for batch_id,data in enumerate(train_loader()):
  12.         feature = data[0]
  13.         label = data[1]
  14.         predict = model(feature)
  15.         loss = mse_loss(predict, label)
  16.         loss.backward()
  17.         opt.step()
  18.         opt.clear_grad()
  19.         if batch_id!=0 and batch_id%10 == 0:
  20.             Batch = Batch+10
  21.             Batchs.append(Batch)
  22.             all_train_loss.append(loss.numpy()[0])
  23.             print("epoch{},step:{},train_loss:{}".format(epochs,batch_id,loss.numpy()[0]))
  24. paddle.save(model.state_dict(),"UCIHousingDNN")
  25. draw_train_loss(Batchs,all_train_loss)
  26. para_state = paddle.load("UCIHousingDNN")
  27. model = MyDNN()
  28. model.eval()
  29. model.set_state_dict(para_state)
  30. losses = []
  31. for batch_id,data in enumerate(eval_loader()):
  32.     feature = data[0]
  33.     label = data[1]
  34.     predict = model(feature)
  35.     loss = mse_loss(predict,label)
  36.     losses.append(loss.numpy()[0])
  37. avg_loss = np.mean(losses)
  38. print(avg_loss)
  39. draw_infer_result(label,predict)
复制代码
代码
  1. ## 深度学习框架import paddleimport numpy as npimport osimport matplotlib.pyplot as plt## 绘图
  2. Batch = 0
  3. Batchs = []
  4. all_train_accs = []
  5. def draw_train_acc(Batchs,train_accs):
  6.     title = "training accs"
  7.     plt.title(title)
  8.     plt.xlabel("batch")
  9.     plt.ylabel("acc")
  10.     plt.plot(Batchs, train_accs, color = 'green', label = 'training accs')
  11.     plt.legend()
  12.     plt.grid()
  13.     plt.show()
  14. all_train_loss = []
  15. def draw_train_loss(Batchs,train_loss):
  16.     title = "training loss"
  17.     plt.title(title)
  18.     plt.xlabel("batch")
  19.     plt.ylabel("loss")
  20.     plt.plot(Batchs, train_loss, color = 'red', label = 'training loss')
  21.     plt.legend()
  22.     plt.grid()
  23.     plt.show()
  24. ## 绘制真实值与预测值的对比图
  25. def draw_infer_result(groud_truths, infer_results):
  26.     title = 'Boston'
  27.     plt.title(title)
  28.     x = np.arange(1,20)
  29.     y = x
  30.     plt.plot(x,y);
  31.     plt.xlabel("ground truth")
  32.     plt.ylabel("infer result")
  33.     plt.scatter(groud_truths,infer_results,color='green',label='training cost')
  34.     plt.grid()
  35.     plt.show()'''数据集加载'''train_dataset = paddle.text.datasets.UCIHousing(mode="train")eval_dataset = paddle.text.datasets.UCIHousing(mode="test")train_loader = paddle.io.DataLoader(train_dataset,batch_size=32, shuffle=True)eval_loader = paddle.io.DataLoader(eval_dataset,batch_size=8,shuffle=False)print(train_dataset[1])'''
  36. 核心
  37. 网络搭建
  38. '''
  39. class MyDNN(paddle.nn.Layer):
  40.     def __init__(self):
  41.         super(MyDNN, self).__init__()
  42.         #self.linear1 = paddle.nn.Linear(13,1,None) #全连接层,paddle.nn.Linear(in_features,out_features,weight)
  43.         self.linear1 = paddle.nn.Linear(13, 32, None)
  44.         self.linear2 = paddle.nn.Linear(32, 64, None)
  45.         self.linear3 = paddle.nn.Linear(64, 32, None)
  46.         self.linear4 = paddle.nn.Linear(32, 1, None)
  47.     def forward(self, inputs): ## 传播函数
  48.         x = self.linear1(inputs)
  49.         x = self.linear2(x)
  50.         x = self.linear3(x)
  51.         x = self.linear4(x)
  52.         return x'''
  53. 网络训练与测试
  54. '''
  55. ## 实例化
  56. model = MyDNN()
  57. model.train()
  58. mse_loss = paddle.nn.MSELoss()
  59. opt = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())
  60. epochs_num = 100
  61. for epochs in range(epochs_num):
  62.     for batch_id,data in enumerate(train_loader()):
  63.         feature = data[0]
  64.         label = data[1]
  65.         predict = model(feature)
  66.         loss = mse_loss(predict, label)
  67.         loss.backward()
  68.         opt.step()
  69.         opt.clear_grad()
  70.         if batch_id!=0 and batch_id%10 == 0:
  71.             Batch = Batch+10
  72.             Batchs.append(Batch)
  73.             all_train_loss.append(loss.numpy()[0])
  74.             print("epoch{},step:{},train_loss:{}".format(epochs,batch_id,loss.numpy()[0]))
  75. paddle.save(model.state_dict(),"UCIHousingDNN")
  76. draw_train_loss(Batchs,all_train_loss)
  77. para_state = paddle.load("UCIHousingDNN")
  78. model = MyDNN()
  79. model.eval()
  80. model.set_state_dict(para_state)
  81. losses = []
  82. for batch_id,data in enumerate(eval_loader()):
  83.     feature = data[0]
  84.     label = data[1]
  85.     predict = model(feature)
  86.     loss = mse_loss(predict,label)
  87.     losses.append(loss.numpy()[0])
  88. avg_loss = np.mean(losses)
  89. print(avg_loss)
  90. draw_infer_result(label,predict)
复制代码
结果展示




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表