算是暖身開始,先看講義了解一下。
內容大概是"在面對資料時,我們應該思考哪些問題?"
作業:可參考 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 有些許誤差。
內容大概是"在面對資料時,我們應該思考哪些問題?"
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()
import numpy as np
import matplotlib.pyplot as plt
import torch
from torch.autograd import 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()
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()
X = torch.Tensor(x_lin).reshape(101,1)/300
Y = torch.Tensor(y).reshape(101,1)/300
X = Variable(X)
Y = Variable(Y)
model = torch.nn.Sequential(
torch.nn.Linear(1, 1),)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
loss_function = torch.nn.MSELoss()
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()
將 model 的 weight 輸出比對真實 weight。
for param in model.parameters():
print(param.data)
tensor([[3.0260]])
tensor([0.0025])
與真實的line y = 3 * x + 0.5 有些許誤差。
沒有留言:
張貼留言