2019年4月12日 星期五

機器學習 百日馬拉松 - Day 1. 資料介紹與評估資料

算是暖身開始,先看講義了解一下。
內容大概是"在面對資料時,我們應該思考哪些問題?"
作業:可參考 my Github - Day_001_HW.ipynb
看到作業3. 身為先修過的人,應該要來嘗試一下簡單的 Linear Regression。
w = 3 b = 0.5 x_lin = np.linspace(0, 100, 101) y = (x_lin + np.random.randn(101) * 5) * w + b plt.plot(x_lin, y, 'b.', label = 'data points') plt.title("Assume we have data points") plt.legend(loc = 2) plt.show()
直接拿之前寫過的 torch 來練習。
import numpy as np import matplotlib.pyplot as plt import torch from torch.autograd import Variable
將x_lin,y 丟進 Variable 容器。
X=Variable(torch.Tensor(x_lin).reshape(101,1)) Y=Variable(torch.Tensor(y).reshape(101,1))
此為一階線性回歸問題,建立簡單模型即可。
model = torch.nn.Sequential( torch.nn.Linear(1, 1),) optimizer = torch.optim.SGD(model.parameters(), lr=0.1) loss_function = torch.nn.MSELoss()
直接 train 一發!!
for i in range(3000): prediction = model(X) loss = loss_function(prediction, Y) optimizer.zero_grad() loss.backward() optimizer.step()
可視化結果
plt.figure(1, figsize=(25, 5)) plt.subplot(131) plt.title('model') plt.scatter(X.data.numpy(), Y.data.numpy()) plt.plot(X.data.numpy(), prediction.data.numpy(), 'r-', lw=5) plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'}) plt.show()
WTF!? 盡然 train 不起來!? 發生什麼事了…?
原來是資料Y輸出差異過大,導致 SGD 無法收斂,這在ML算是蠻常遇到的問題!!
修改一下代碼:
Normalization
X = torch.Tensor(x_lin).reshape(101,1)/300 Y = torch.Tensor(y).reshape(101,1)/300
Normalization後再丟進 Variable 容器。
X = Variable(X) Y = Variable(Y)
定義model
model = torch.nn.Sequential( torch.nn.Linear(1, 1),) optimizer = torch.optim.SGD(model.parameters(), lr=0.1) loss_function = torch.nn.MSELoss()
再 train 一發
for i in range(3000): prediction = model(X) loss = loss_function(prediction, Y) optimizer.zero_grad() loss.backward() optimizer.step()
可視化結果
plt.figure(1, figsize=(25, 5)) plt.subplot(131) plt.title('model') plt.scatter(X.data.numpy(), Y.data.numpy()) plt.plot(X.data.numpy(), prediction.data.numpy(), 'r-', lw=5) plt.text(0.2, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'}) plt.show()
不錯,fit的很完美
將 model 的 weight 輸出比對真實 weight。
for param in model.parameters(): print(param.data)
tensor([[3.0260]])
tensor([0.0025])
因為是有 Normalization 過的,所以還原model後的line是 y = 3.026 * x + 0.75
與真實的line y = 3 * x + 0.5 有些許誤差。

沒有留言:

張貼留言