深度学习练手项目(二)-----利用PyTorch进行线性回归

前言

深度学习并没有想象的那么难,甚至比有些传统的机器学习更简单。所用到的数学知识也不需要特别的高深。这篇文章将利用PyTorch来实现线性回归这个经典的模型。

一、线性回归理论

线性回归时利用数理统计中的回归分析来确定两种或者两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
简单的说: 线性回归对于输入x与输出y有一个映射f,y=f(x),而f的形式为aX+b。其中a和b是两个可调的参数,我们训练的目的就是训练a,b这两个参数。

二、PyTorch代码实现

下面我们来用pyTorch的代码来做一个详细的解释

  • 首先,我们需要导入相关的包
# 注意,这里我们使用了一个新库叫 seaborn 如果报错找不到包的话请使用pip install seaborn 来进行安装
import torch
from torch.nn import Linear, Module, MSELoss
from torch.optim import SGD
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
torch.__version__
  • 下面定义一个线性函数,这里使用 y = 5 x + 7 y = 5x + 7 y=5x+7,这里的5和7就是上面说到的参数a和b,我们先使用matplot可视化一下这个函数

x = np.linspace(0,20,500)
y = 5*x + 7
plt.plot(x,y)

在这里插入图片描述

  • 下面生成一些随机的点,来作为我们的训练数据
x = np.random.rand(256)
noise = np.random.randn(256) / 4
y = x * 5 + 7 + noise
df = pd.DataFrame()
df['x'] = x
df['y'] = y
  • 在图上显示下我们生成的数据
sns.lmplot(x='x', y='y', data=df)

在这里插入图片描述

  • 我们随机生成了一些点,下面将使用PyTorch建立一个线性的模型来对其进行拟合,这就是所说的训练的过程,由于只有一层线性模型,所以我们就直接使用了
model=Linear(1, 1)

其中参数(1, 1)代表输入输出的特征(feature)数量都是1. Linear 模型的表达式是 y = w ⋅ x + b y=w \cdot x+b y=wx+b,其中 w w w 代表权重, b b b 代表偏置

  • 损失函数我们使用均方损失函数:MSELoss
criterion = MSELoss()
  • 优化器我们选择最常见的优化方法 SGD,就是每一次迭代计算 mini-batch 的梯度,然后对参数进行更新,学习率 0.01
optim = SGD(model.parameters(), lr = 0.01)
  • 训练3000次
epochs = 3000
  • 准备训练数据: x_train, y_train 的形状是 (256, 1), 代表 mini-batch 大小为256, feature 为1. astype(‘float32’) 是为了下一步可以直接转换为 torch.float.
x_train = x.reshape(-1, 1).astype('float32')
y_train = y.reshape(-1, 1).astype('float32')
  • 开始训练
for i in range(epochs):
    # 整理输入和输出的数据,这里输入和输出一定要是torch的Tensor类型
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
    #使用模型进行预测
    outputs = model(inputs)
    #梯度置0,否则会累加
    optim.zero_grad()
    # 计算损失
    loss = criterion(outputs, labels)
    # 反向传播
    loss.backward()
    # 使用优化器默认方法优化
    optim.step()
    if (i%100 == 0):
        #每 100次打印一下损失函数,看看效果
        print('epoch {}, loss {:1.4f}'.format(i,loss.data.item()))
  • 训练完成了,看一下训练的成果是多少。用 model.parameters() 提取模型参数。 w w w b b b 是我们所需要训练的模型参数 我们期望的数据 w = 5 w=5 w=5 b = 7 b=7 b=7 可以做一下对比
[w, b] = model.parameters()
print (w.item(),b.item())
  • 再次可视化一下我们的模型,看看我们训练的数据,如果你不喜欢seaborn,可以直接使用matplot

predicted = model.forward(torch.from_numpy(x_train)).data.numpy()
plt.plot(x_train, y_train, 'go', label = 'data', alpha = 0.3)
plt.plot(x_train, predicted, label = 'predicted', alpha = 1)
plt.legend()
plt.show()

在这里插入图片描述

参考文献

https://github.com/zergtant/pytorch-handbook/blob/master/chapter2/2.2-deep-learning-basic-mathematics.ipynb

猜你喜欢

转载自blog.csdn.net/dongjinkun/article/details/113914961
今日推荐