PyTorch例項:房價預測
阿新 • • 發佈:2020-07-06
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()