天天看點

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測

作者簡介:在校大學生一枚,華為雲享專家,阿裡雲專家部落客,騰雲先鋒(TDP)成員,雲曦智劃項目總負責人,全國高等學校計算機教學與産業實踐資源建設專家委員會(TIPCC)志願者,以及程式設計愛好者,期待和大家一起學習,一起進步~

.

部落格首頁:ぃ靈彧が的學習日志

.

本文專欄:人工智能

.

專欄寄語:若你決定燦爛,山無遮,海無攔

.

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

(文章目錄)

前言

(一)、任務描述

經典的線性回歸模型主要用來預測一些存在着線性關系的資料集。回歸模型可以了解為:存在一個點集,用一條曲線去拟合它分布的過程。如果拟合曲線是一條直線,則稱為線性回歸。如果是一條二次曲線,則被稱為二次回歸。線性回歸是回歸模型中最簡單的一種。 本教程使用PaddlePaddle建立起一個房價預測模型。

線上性回歸中:

(1)假設函數是指,用數學的方法描述自變量和因變量之間的關系,它們之間可以是一個線性函數或非線性函數。 在本次線性回顧模型中,我們的假設函數為 Y’= wX+b ,其中,Y’表示模型的預測結果(預測房價),用來和真實的Y區分。模型要學習的參數即:w,b。

(2)損失函數是指,用數學的方法衡量假設函數預測結果與真實值之間的誤差。這個差距越小預測越準确,而算法的任務就是使這個差距越來越小。 建立模型後,我們需要給模型一個優化目标,使得學到的參數能夠讓預測值Y’盡可能地接近真實值Y。這個實值通常用來反映模型誤差的大小。不同問題場景下采用不同的損失函數。 對于線性模型來講,最常用的損失函數就是均方誤差(Mean Squared Error, MSE)。

(3)優化算法:神經網絡的訓練就是調整權重(參數)使得損失函數值盡可能得小,在訓練過程中,将損失函數值逐漸收斂,得到一組使得神經網絡拟合真實模型的權重(參數)。是以,優化算法的最終目标是找到損失函數的最小值。而這個尋找過程就是不斷地微調變量w和b的值,一步一步地試出這個最小值。 常見的優化算法有随機梯度下降法(SGD)、Adam算法等等

(二)、環境配置

本實踐代碼運作的環境配置如下:Python版本為3.7,PaddlePaddle版本為2.0.0,操作平台為AI Studio。大部分深度學習項目都要經過以下幾個過程:資料準備、模型配置、模型訓練、模型評估。

import paddle
import numpy as np
import matplotlib.pyplot as plt
print(paddle.__version__)

# cpu/gpu環境選擇,在 paddle.set_device() 輸入對應運作裝置。
# device = paddle.set_device('gpu')
           

一、資料準備

(1)uci-housing資料集介紹

資料集共506行,每行14列。前13列用來描述房屋的各種資訊,最後一列為該類房屋價格中位數。

PaddlePaddle提供了讀取uci_housing訓練集和測試集的接口,分别為paddle.dataset.uci_housing.train()和paddle.dataset.uci_housing.test()。

(2)train_reader和test_reader

paddle.reader.shuffle()表示每次緩存BUF_SIZE個資料項,并進行打亂

paddle.batch()表示每BATCH_SIZE組成一個batch

BUF_SIZE=500
BATCH_SIZE=20

#用于訓練的資料提供器,每次從緩存中随機讀取批次大小的資料
train_reader = paddle.batch(
    paddle.reader.shuffle(paddle.dataset.uci_housing.train(), 
                          buf_size=BUF_SIZE),                    
    batch_size=BATCH_SIZE)   
#用于測試的資料提供器,每次從緩存中随機讀取批次大小的資料
test_reader = paddle.batch(
    paddle.reader.shuffle(paddle.dataset.uci_housing.test(),
                          buf_size=BUF_SIZE),
    batch_size=BATCH_SIZE)  
    
           

(3)列印看下資料是什麼樣的?PaddlePaddle接口提供的資料已經經過歸一化等處理

(array([-0.02964322, -0.11363636, 0.39417967, -0.06916996, 0.14260276, -0.10109875, 0.30715859, -0.13176829, -0.24127857, 0.05489093, 0.29196451, -0.2368098 , 0.12850267]), array([15.6])),

#設定預設的全局dtype為float64
paddle.set_default_dtype("float64")
#下載下傳資料
print('下載下傳并加載訓練資料')
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('加載完成')
           

輸出結果如下圖1所示:

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

二、網絡配置

(1)網絡搭建:對于線性回歸來講,它就是一個從輸入到輸出的簡單的全連接配接層。

對于波士頓房價資料集,假設屬性和房價之間的關系可以被屬性間的線性組合描述。

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

(一)、定義全連接配接網絡

# 定義全連接配接網絡
class Regressor(paddle.nn.Layer):
    def __init__(self):
        super(Regressor, self).__init__()
        # 定義一層全連接配接層,輸出次元是1,激活函數為None,即不使用激活函數
        self.linear = paddle.nn.Linear(13, 1, None)
    
    # 網絡的前向計算函數
    def forward(self, inputs):
        x = self.linear(inputs)
        return x

           
Batch=0
Batchs=[]
all_train_accs=[]
def draw_train_acc(Batchs, train_accs):
    title="training accs"
    plt.title(title, fontsize=24)
    plt.xlabel("batch", fontsize=14)
    plt.ylabel("acc", fontsize=14)
    plt.plot(Batchs, train_accs, color='green', label='training accs')
    plt.legend()
    plt.grid()
    plt.show()

all_train_loss=[]
def draw_train_loss(Batchs, train_loss):
    title="training loss"
    plt.title(title, fontsize=24)
    plt.xlabel("batch", fontsize=14)
    plt.ylabel("loss", fontsize=14)
    plt.plot(Batchs, train_loss, color='red', label='training loss')
    plt.legend()
    plt.grid()
    plt.show()
           

(二)、模型執行個體化

model=Regressor() # 模型執行個體化
model.train() # 訓練模式
mse_loss = paddle.nn.MSELoss()
opt=paddle.optimizer.SGD(learning_rate=0.0005, parameters=model.parameters())

epochs_num=200 #疊代次數
for pass_num in range(epochs_num):
    for batch_id,data in enumerate(train_loader()):
        image = data[0]
        label = data[1]
        predict=model(image) #資料傳入model
        # print(predict)
        # print(np.argmax(predict,axis=1))
        loss=mse_loss(predict,label)
        # acc=paddle.metric.accuracy(predict,label.reshape([-1,1]))#計算精度
        # acc = np.mean(label==np.argmax(predict,axis=1))
        
        if batch_id!=0 and batch_id%10==0:
            Batch = Batch+10
            Batchs.append(Batch)
            all_train_loss.append(loss.numpy()[0])
            # all_train_accs.append(acc.numpy()[0]) 
            print("epoch:{},step:{},train_loss:{}".format(pass_num,batch_id,loss.numpy()[0])  )      
        loss.backward()       
        opt.step()
        opt.clear_grad()   #opt.clear_grad()來重置梯度
paddle.save(model.state_dict(),'Regressor')#儲存模型
draw_train_loss(Batchs,all_train_loss)
           

部分輸出結果如下圖2所示:

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

(三)、可視化分析

def draw_train_acc(Batchs,train_accs):
	title="training accs"
	plt.title(title,fontsize=24)
	plt.xlabel("batch",fontsize=14)
	plt.ylabel("acc",fontsize=14)
	plt.plot(Batchs,train_accs,color='green',label='training accs')
	plt.legend()
	plt.grid()
	plt.show()
draw_train_loss(Batchs,all_train_loss)
           

輸出結果如下圖3所示:

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

三、模型評估

#模型評估
para_state_dict = paddle.load("Regressor") 
model = Regressor()
model.set_state_dict(para_state_dict) #加載模型參數
model.eval() #驗證模式

losses = []
infer_results=[]
groud_truths=[]
for batch_id,data in enumerate(eval_loader()):#測試集
    image=data[0]
    label=data[1] 
    groud_truths.extend(label.numpy())    
    predict=model(image) 
    infer_results.extend(predict.numpy())      
    loss=mse_loss(predict,label)
    losses.append(loss.numpy()[0])
    avg_loss = np.mean(losses)
print("目前模型在驗證集上的損失值為:",avg_loss)
           

輸出結果如下圖4所示:

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

四、模型預測

#繪制真實值和預測值對比圖
def draw_infer_result(groud_truths,infer_results):
    title='Boston'
    plt.title(title, fontsize=24)
    x = np.arange(1,20) 
    y = x
    plt.plot(x, y)
    plt.xlabel('ground truth', fontsize=14)
    plt.ylabel('infer result', fontsize=14)
    plt.scatter(groud_truths, infer_results,color='green',label='training cost') 
    plt.grid()
    plt.show()

draw_infer_result(groud_truths,infer_results)
           

輸出結果如下圖5所示:

【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測前言一、資料準備二、網絡配置三、模型評估四、模型預測總結

總結

本系列文章内容為根據清華社出版的《自然語言處理實踐》所作的相關筆記和感悟,其中代碼均為基于百度飛槳開發,若有任何侵權和不妥之處,請私信于我,定積極配合處理,看到必回!!!

繼續閱讀