1. 程式人生 > 實用技巧 >PyTorch例項:房價預測

PyTorch例項:房價預測

1.準備資料

import torch
from torch.autograd import Variable

# 構造0-100之間的均勻數字作為時間變數x
x = Variable(torch.linspace(0,100).type(torch.FloatTensor))
# 時間點上的歷史房價資料
rand = Variable(torch.randn(100)) * 10   # 均值為0,方差為10。 torch.randn(100)生成100個標準正態分佈隨機數
y = x + rand

x_train = x[: -10]  #倒數第10個元素之前的所有元素
x_test = x[-10:]    #最後面10個元素
y_train = y[: -10] y_test = y[-10:] # 訓練資料點視覺化 import matplotlib.pyplot as plt %matplotlib inline plt.figure(figsize=(10,8)) #設定繪製視窗大小為10*8inch #繪製資料,由於x和y都是Variable,需要用data獲取它們包裹的Tensor,並轉成Numpy plt.plot(x_train.data.numpy(), y_train.data.numpy(),'o') plt.xlabel('X') plt.ylabel('Y') plt.show()

Varibale包含三個屬性:

data:儲存了Tensor,是本體的資料
grad:儲存了data的梯度,本事是個Variable而非Tensor,與data形狀一致
grad_fn:指向Function物件,用於反向傳播的梯度計算之用。就是計算圖中的箭頭

2.模型設計及訓練

# y = ax+b
#定義兩個自動微分變數a和b
a = Variable(torch.rand(1),requires_grad = True)
b = Variable(torch.rand(1),requires_grad = True)
learning_rate = 0.0001 

for i in range(1000):
    predictions 
= a.expand_as(x_train) * x_train + b.expand_as(x_train) #使用expand_as提升a和b的尺寸,a.expand_as(x_train)是將a的維度調整為何x_train一致 loss = torch.mean((predictions - y_train) ** 2) print('loss:',loss) loss.backward() #對損失函式進行梯度反傳 a.data.add_(- learning_rate * a.grad.data) #在PyTorch中,如果某個函式後加了'_',表明要用這個函式的計算結果更新當前的變數;例如a.data.add_(3)是將a.data的數值更新為a.data加上3 b.data.add_(- learning_rate * b.grad.data) a.grad.data.zero_() #清空儲存在變數a和b中的梯度資訊,以免在backward的過程中反覆不停地累加 b.grad.data.zero_() # 畫出原始散點圖和擬合後的直線 x_data = x_train.data.numpy() plt.figure(figsize = (10,7)) xplot, = plt.plot(x_data, y_train.data.numpy(),'o') yplot, = plt.plot(x_data,a.data.numpy()*x_data + b.data.numpy()) #繪製擬合直線圖 plt.xlabel('X') plt.ylabel('Y') str1 = str(a.data.numpy()[0])+'x+'+str(b.data.numpy()[0]) plt.legend([xplot, yplot],['Data',str1]) plt.show()

3.預測

predictions = a.expand_as(x_test)*x_test + b.expand_as(x_test)
predictions

import numpy as np
x_data = x_train.data.numpy()
x_pred = x_test.data.numpy()
plt.figure(figsize = (10,7))
plt.plot(x_data, y_train.data.numpy(),'o') #訓練資料
plt.plot(x_pred, y_test.data.numpy(),'s') #測試資料

x_data = np.r_[x_data, x_test.data.numpy()]
plt.plot(x_data,a.data.numpy()*x_data + b.data.numpy()) #繪製擬合數據
plt.plot(x_pred,a.data.numpy()*x_pred + b.data.numpy(),'o') #繪製預測資料
plt.xlabel('X')
plt.ylabel('Y')
str1 = str(a.data.numpy()[0])+'x+'+str(b.data.numpy()[0])
plt.legend([xplot, yplot],['Data',str1])
plt.show()