Pytorch:一維線性迴歸

1.目標

找到一條 直線

儘可能接近已知點,如下圖:

Pytorch:一維線性迴歸

2.理論

2.1 待擬合公式

$$ f(x)=k·x+b $$,

其中,$ k $, $ b $ 為需要求的參數。

2.2 思路

給定數據集$ D=\\{(x_1, y_1),(x_2, y_2),...,(x_n,y_n)\\} $,找出$ f(x) $,使得$ f(x_i)=k·x_i+b $儘可能接近 $ y_i $。

2.3 誤差計算

使用均方差來計算誤差(當然也可以使用其他的)

$$ Loss = \\sum_{i=1}^{n}{(f(x_i)-y_i)^2} $$

2.4 反向傳播

自己推推就出來了:)(損失函數分別對$k$和$b$求偏導再令其等於0)

3.實現

3.0 環境

<code>python == 3.6
torch == 1.4/<code>

3.1 必要的包

<code>import torch 
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt # 畫圖必備/<code>

3.2 創造數據並預覽

<code>x_train = np.array([[3.3],[4.4],[5.5],[6.6],[6.69],[4.4],[9.8],[6.12],[7.7],[2.67],[7.42],[10.91],[5.13],[7.97],[3.1]], dtype=np.float32)
y_train = np.array([[1.7],[2.76],[2.09],[3.19],[1.694],[1.573],[3.366],[2.596],[2.53],[1.221],[2.827],[3.465],[1.65],[2.904],[1.3]], dtype=np.float32)

plt.plot(x_train, y_train, 'ro')
plt.show()

# 將numpy對象轉換為torch對象
x_train = torch.from_numpy(x_train)
y_train = torch.from_numpy(y_train)/<code>
Pytorch:一維線性迴歸

3.3 構造模型並創建對象

<code>class LinearRegression(nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(1,1) # 因為y和x是一對一的關係

def forward(self, x):
out = self.linear(x)

return out

model = LinearRegression()/<code>

3.4 檢查是否有可用的GPU

如果有就將模型和數據放入GPU中訓練

<code>if torch.cuda.is_available():
model = model.cuda()
x_train = x_train.cuda()
y_train = y_train.cuda()/<code>

3.5 創建優化器

<code># 這是均方誤差
criterion = nn.MSELoss()
# 優化器使用隨機梯度下降,學習率為0.001
optimizer = optim.SGD(model.parameters(), lr=1e-3)/<code>

3.6 進行訓練

<code>epoch = 0
while True:
out = model(x_train)
loss = criterion(out, y_train) # 損失計算
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向傳播
loss_value = loss.data.cpu().numpy() # 獲取損失的值

optimizer.step() # 更新參數

# 每100次迭代輸出一次損失
if (epoch+1)%100==0:
print('Epoch{}, loss:{:.6f}'.format(epoch+1, loss_value))
epoch += 1
# if loss_value < 1e-3:
if epoch >= 1000: # 1000次迭代後退出
break/<code>

3.7 驗證訓練結果

<code>model.eval()  # 模型轉換為驗證模式
predict = model(x_train)
predict = predict.data.cpu().numpy() # 獲取預測的值
# 'o'代表畫點, 'r'代表紅色, '-'代表畫直線
plt.plot(x_train.cpu().numpy(), y_train.cpu().numpy(), 'ro')
plt.plot(x_train.cpu().numpy(), predict, '-')
plt.show()/<code>
Pytorch:一維線性迴歸


分享到:


相關文章: