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()

