先練習簡單的線性回歸問題,假定一個簡單的線性函數
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()
沒有留言:
張貼留言