2019年4月7日 星期日

PyTorch - 線性回歸 - Linear Regression - 1

先練習簡單的線性回歸問題,假定一個簡單的線性函數 y=a*x+b 利用此產生亂數個點,然後來試著擬合這些點。

1. 建立 DATA

import torch import matplotlib.pyplot as plt x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # x data (tensor), shape=(100, 1) y = 2*x + 0.3*torch.rand(x.size()) # noisy y data (tensor), shape=(100, 1) plt.scatter(x.data.numpy(), y.data.numpy()) plt.show()
將X,Y 丟進 Variable 做梯度計算用。
X=Variable(torch.Tensor(X.reshape(100,1))) Y=Variable(torch.Tensor(Y.reshape(100,1)))

2. 建立簡單模型

用簡易的 Sequential model,且使用單層的 linear neural network,優化器使用 SGD,lr=0.5 ,Loss function 使用 MSE(回歸問題通常使用MSE)。
model = torch.nn.Sequential(torch.nn.Linear(1, 1),) optimizer = torch.optim.SGD(model.parameters(), lr=0.5) loss_function = torch.nn.MSELoss()

3. 開始訓練

迭代500次訓練,其實很簡單的問題,在前幾次訓練就已經完美 fit 了 (Loss minimum)。
epochs = 500 for epoch in range(epochs): prediction = model(X) loss = loss_function(prediction, Y) optimizer.zero_grad() loss.backward() optimizer.step()

4. 訓練結果可視化

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

沒有留言:

張貼留言