访问本站观看效果更佳
写在前面
如果您先前看过吴恩达的机器学习教程,想必您对线性回归并不陌生。这个问题要如何用pytorch
实现呢?接下来我们进行实战操作。完整代码请参见linear_regression。
我们会用到什么包呢?
本节,我打算要用到Linear
那么肯定要引入torch.nn
。然后要画图,还要设置数据~所以我们先导入下面的包吧,不够再加。
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
数据从哪里来?
这里我们构造一个简单的数据集合,用x
去拟合y
吧。
# Toy dataset
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
[9.779], [6.182], [7.59], [2.167], [7.042],
[10.791], [5.313], [7.997], [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)
基本思路说一下
还记得上一节我们介绍的复杂一些的例子吗?里面提到了如何去构造一组线性关系。我们的思路很简单,确定好输入输出tensor
的维度,再利用nn.Linear()
算一下就好了。
之前的例子里,我们只进行了一次求导,似乎效果不是很好。这次我们就加个循环多做几次。而且本例是线性回归,直接就是一条直线,其实还比前面的例子简单些……
具体实现
记住我们的目标就是让预测值与真实值y
之间的差距越小越好。预测值是什么?就是x
经过Linear
后得到的东西吧!让我们先看看代码。
# Hyper-parameters
input_size = 1
output_size = 1
num_epochs = 60
learning_rate = 0.001
# Linear regression model
model = nn.Linear(input_size, output_size)
# Loss and optimizer
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# Train the model
for epoch in range(num_epochs):
# Convert numpy arrays to torch tensors
inputs = torch.from_numpy(x_train)
targets = torch.from_numpy(y_train)
# Forward pass
outputs = model(inputs)
loss = criterion(outputs, targets)
# Backward and optimize
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 5 == 0:
print ('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
结果如下所示:
Epoch [5/60], Loss: 1.7156
Epoch [10/60], Loss: 0.8695
Epoch [15/60], Loss: 0.5265
Epoch [20/60], Loss: 0.3873
Epoch [25/60], Loss: 0.3308
Epoch [30/60], Loss: 0.3077
Epoch [35/60], Loss: 0.2981
Epoch [40/60], Loss: 0.2941
Epoch [45/60], Loss: 0.2923
Epoch [50/60], Loss: 0.2913
Epoch [55/60], Loss: 0.2908
Epoch [60/60], Loss: 0.2904
上一节只是单纯的求导一次,现在我们看看多次求导的情况。每一轮从numpy
中读取训练数据以及目标数据y
。把input
送入model
(实际上就是一个nn.Linear
),计算损失MSE。这里的损失计算我们为了减少工作量,采用pytorch
提供的包来完成,具体计算过程参见上节,里面有详细公式以及说明。
设置好了loss
,我们求一下导数,利用优化器里提供的方法使loss
不断变小。每轮optimizer.step()
执行一次。就是这么简单。
看看结果如何
说了这么多,我们看看怎么可视化训练结果吧。此处我们用到了plt
模块。复杂的功能后续再接触。注意经过之前的训练model
的参数已经优化了。我们只要再把traindata
再输入一遍model
就可以了,此处detach
的意思也就是不再跟踪梯度。
# Plot the graph
predicted = model(torch.from_numpy(x_train)).detach().numpy()
plt.plot(x_train, y_train, 'ro', label='Original data')
plt.plot(x_train, predicted, label='Fitted line')
plt.legend()
plt.show()
别忘了保存一下模型:
# Save the model checkpoint
torch.save(model.state_dict(), 'model.ckpt')
线性回归的内容就介绍到这里了~