日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

PaddlePaddle实现波士顿房价预测

發布時間:2025/3/8 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PaddlePaddle实现波士顿房价预测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PaddlePaddle實現波士頓房價預測

AIStudio地址
Github地址

#加載飛槳、Numpy 和相關庫 import paddle import paddle.fluid as fluid # 飛槳主庫 import paddle.fluid.dygraph as dygraph # 動態圖類庫 from paddle.fluid.dygraph import Linear import numpy as np import random import os

數據預處理

??數據預處理主要包含五個部分:數據導入、數據形狀變換、數據集劃分、數據歸一化處理、封裝 load_data 函數。

# 數據預處理def load_data():# 從文件讀取數據datafile = './work/housing.data'data = np.fromfile(datafile, sep=" ") # 從文本或二進制文件中構造一個數組# 每條數據包括14項,其中前面13項是影響因素,第14項是相應的房屋價格中位數feature_name = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']# 統計字段個數feature_num = len(feature_name)# 將原始數據進行reshape, 變成 [N, 14]的形狀# N = data.shape[0]//feature_numdata = data.reshape([data.shape[0]//feature_num, feature_num])# 將原始數據及拆分為訓練集和測試集(8:2)ratio = 0.8offset = int(data.shape[0]*ratio)training_data = data[:offset]# 計算訓練集的max, min, meanmaximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \training_data.sum(axis=0) / training_data.shape[0]# 記錄數據的歸一化參數,在預測時對數據做歸一化global max_valuesglobal min_valuesglobal avg_valuesmax_values = maximumsmin_values = minimumsavg_values = avgs# 對數據進行歸一化處理for i in range(feature_num):data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])# 訓練集和測試集的化分training_data = data[:offset]test_data = data[offset:]return training_data, test_data # 查看數據 training_data , test_data = load_data() print(training_data,test_data)print("~"*20)# 查看第一個訓練樣本數據 x = training_data[:, :-1] y = training_data[:, -1:] print(x[0]) #前13個影響因素 print(y[0]) #第14個房價中位數

搭建神經網絡

??線性回歸模型采用線性激活函數( linear activation )的全連接層 ( fully-connected layer, fc_layer ),因此在飛槳中利用全連接層模型構造線性回歸,這樣,一個全連接層就可以看作一個簡單的神經網絡。

??搭建神經網絡類似于使用積木搭建寶塔。在飛槳中,網絡層(layer)是積木,而神經網絡是要搭建的寶塔。我們使用不同的layer進行組合,來搭建神經網絡。飛槳建議通過創建Python類的方式完成模型網絡的定義,即__init__函數和forward函數。

??forward函數是框架指定實現前向計算邏輯的函數,程序在調用模型實例時會自動執行forward方法。在forward函數中使用的網絡層需要在__init__函數中聲明。

??定義init函數:在類的初始化函數中聲明每一層網絡的實現函數。

??定義forward函數:構建神經網絡結構,實現前向計算過程,并返回預測結果。

# 配置網絡結構 class Regressor(fluid.dygraph.Layer):def __init__(self,name_scope):super(Regressor,self).__init__(name_scope)name_scope = self.full_name()# 定義一層全連接層,輸出維度是1, 激活函數為None, 即不使用激活函數self.fc = Linear(input_dim = 13, output_dim = 1,act = None)# 網絡的前向計算函數def forward(self,input):x = self.fc(input)return x

訓練配置

  • 指定運行訓練的機器資源:以guard函數指定運行訓練的機器資源,表明在with作用域下的程序均執行在本機的CPU資源上。 dygraph.guard 表示在with作用于下的程序會以動態圖的模式執行(實時執行)。
  • 聲明模型實例:聲明定義好的回歸模型Regressor實例,并將模型的狀態設置為訓練。
  • 加載訓練和測試數據:使用load_data 函數加載訓練數據和測試數據。
  • 設置優化算法和學習率:優化算法采用隨機梯度下降SGD,學習率設置為0.01.
  • # 初始化with fluid.dygraph.guard():'''在paddlepaddle中,模型實例有兩個狀態:train()和eval()。訓練時要執行正向計算和反向傳播梯度兩個過程,而預測只需要執行正向計算。另外,with fluid.dygraph.guard()創建了飛槳動態圖的工作環境,在該環境中完成模型聲明、數據轉換及模型訓練等。'''# 聲明定義好的線性回歸模型(Regressor)model = Regressor('Regressor')model.train()# 數據加載training_data, test_data = load_data()print(training_data[10:20])# 定義優化算法,SGD# 學習率設置為0.01opt = fluid.optimizer.SGD(learning_rate=0.01, parameter_list= model.parameters())

    模型訓練

    ??模型訓練過程采用內層循環外層循環嵌套的方式。

    ??內層循環負責整個數據集的一次遍歷,采用分批次(batch)方式。Batch的取值會影響模型訓練效果:batch過大,會增大內存消耗和計算時間,且效果不會明顯提升;batch過小,每個batch的樣本數據將沒有統計意義。

    ??內循環四個步驟

  • 數據準備:將一個批次的數據轉變為np.array和內置格式。
  • 前向計算:將一個批次的樣本數據灌入網絡中,計算輸出結果。
  • 計算損失函數:以前向計算結果和真實房價作為輸入,通過損失函數square_error_cost計算出損失函數值(Loss).
  • 反向傳播: 執行梯度反向傳播backward函數,即從后到前逐層計算每一層的梯度,并根據設置的優化算法更新參數opt.minimize。
  • ??外層循環定義遍歷數據集的次數,通過參數EPOCH_NUM設置。

    # 定義訓練過程 with dygraph.guard(fluid.CPUPlace()):EPOCH_NUM = 10 # 設置外層循環次數BATCH_SIZE = 10 # 設置batch大小# 定義外層循環for epoch_id in range(EPOCH_NUM):# 在每輪迭代開始之前,將訓練數據的順序隨機打亂np.random.shuffle(training_data)# 將訓練數據進行拆分,每個batch包含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")

    保存并測試模型

    ??首先我們將模型當前的參數數據model.state_dict()保存在文件中(通過參數指定保存的文件LR_model),以備預測或校驗的程序調用。

    # 定義飛槳動態圖工作環境 with fluid.dygraph.guard():# 保存模型參數,文件為LR_modelfluid.save_dygraph(model.state_dict(),'LR_model')print("模型保存成功,模型參數保存在LR_model中") 模型保存成功,模型參數保存在LR_model中

    ??然后可以對模型進行測試,測試過程與在應用場景中使用模型的過程一致,主要分為如下三個步驟:

    (1)、配置模型預測的機器資源;

    (2)、將訓練好的模型參數加載到模型。加載完畢后,需要將模型的狀態調整為evaluation(校驗)。

    (3)、將待預測的樣本特征輸入模型中,打印輸出的預測結果。

    ??通過load_one_example函數從數據集中抽出一條樣本作為測試樣本。

    # 讀取測試樣本 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])data = np.reshape(np.array(one_data[:-1]), [1,-1]).astype(np.float32)label = one_data[-1]return data, label# 測試模型 with dygraph.guard():# 參數為保存模型參數的文件地址model_dict, _ = fluid.load_dygraph("LR_model")model.load_dict(model_dict)model.eval()# 參數為數據集的文件地址test_data, label = load_one_example('./work/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)) Inference result is [[14.326102]], the corresponding label is 19.7

    總結

    以上是生活随笔為你收集整理的PaddlePaddle实现波士顿房价预测的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。