pytorch入门——边学边练02线性回归

访问本站观看效果更佳

写在前面

如果您先前看过吴恩达的机器学习教程,想必您对线性回归并不陌生。这个问题要如何用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()

image
别忘了保存一下模型:

# Save the model checkpoint
torch.save(model.state_dict(), 'model.ckpt')

线性回归的内容就介绍到这里了~

猜你喜欢

转载自blog.csdn.net/zcgyq/article/details/83088049