【計算機視覺(CV)】基于全連接配接神經網絡實作房價預測
作者簡介:在校大學生一枚,華為雲享專家,阿裡雲專家部落客,騰雲先鋒(TDP)成員,雲曦智劃項目總負責人,全國高等學校計算機教學與産業實踐資源建設專家委員會(TIPCC)志願者,以及程式設計愛好者,期待和大家一起學習,一起進步~
.
部落格首頁:ぃ靈彧が的學習日志
.
本文專欄:人工智能
.
專欄寄語:若你決定燦爛,山無遮,海無攔
.
(文章目錄)
前言
(一)、任務描述
經典的線性回歸模型主要用來預測一些存在着線性關系的資料集。回歸模型可以了解為:存在一個點集,用一條曲線去拟合它分布的過程。如果拟合曲線是一條直線,則稱為線性回歸。如果是一條二次曲線,則被稱為二次回歸。線性回歸是回歸模型中最簡單的一種。 本教程使用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所示:
二、網絡配置
(1)網絡搭建:對于線性回歸來講,它就是一個從輸入到輸出的簡單的全連接配接層。
對于波士頓房價資料集,假設屬性和房價之間的關系可以被屬性間的線性組合描述。
(一)、定義全連接配接網絡
# 定義全連接配接網絡
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所示:
(三)、可視化分析
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所示:
三、模型評估
#模型評估
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所示:
四、模型預測
#繪制真實值和預測值對比圖
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所示:
總結
本系列文章内容為根據清華社出版的《自然語言處理實踐》所作的相關筆記和感悟,其中代碼均為基于百度飛槳開發,若有任何侵權和不妥之處,請私信于我,定積極配合處理,看到必回!!!