深度学习(一) 之线性模型【附代码详解】

线性模型

1.深度学习介绍

1.1 监督学习和无监督学习

监督学习、无监督学习、半监督学习、强化学习是我们日常接触到的常见的四个机器学习方法:

  • 监督学习:通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出。
  • 无监督学习:它与监督学习的不同之处,在于我们事先没有任何训练样本,而需要直接对数据进行建模。
  • 半监督学习 :在训练阶段结合了大量未标记的数据和少量标签数据。与使用所有标签数据的模型相比,使用训练集的训练模型在训练时可以更为准确。
  • 强化学习:我们设定一个回报函数(reward function),通过这个函数来确认否越来越接近目标,类似我们训练宠物,如果做对了就给他奖励,做错了就给予惩罚,最后来达到我们的训练目的。

这里我们只着重介绍监督学习,因为我们后面的绝大部们课程都是使用的监督学习的方法,在训练和验证时输入的数据既包含输入x,又包含x对应的输出y,即学习数据已经事先给出了正确答案。

1.2 线性回归(Linear Regreesion)

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为 y = w T x + e y = w^Tx+e y=wTx+e e e e为误差服从均值为0的正态分布。

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。 摘自百度百科

简单的说: 线性回归对于输入 x x x与输出 y y y有一个映射 f f f y = f ( x ) y=f(x) y=f(x),而 f f f的形式为 a X + b aX+b aX+b。其中 a a a b b b是两个可调的参数,我们训练的时候就是训练这两个参数。

用Pytorch来实现:

# 导库
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__
'1.7.1+cpu'

下面定义一个线性函数,这里使用 y = 5 x + 7 y=5x+7 y=5x+7,这里的5和7就是上面说到的参数 a a a b b b,我们先使用matplot可视化一下这个函数

x = np.linspace(0,20,500)#从0-20等间距取500个数,含0和20
y = 5*x + 7
plt.plot(x,y);

在这里插入图片描述

下面我生成一些随机的点,来作为我们的训练数据;

x = np.random.rand(256) # 0-1之间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⋅x+b y=wx+b,其中 w w w代表权重, b b b 代表偏置

损失函数我们使用均方损失函数:MSELoss,这个后面会详细介绍

criterion = MSELoss()

优化器我们选择最常见的优化方法 SGD,就是每一次迭代计算 mini-batch 的梯度,然后对参数进行更新,学习率 0.01 ,优化器本章后面也会进行介绍

list(model.parameters())
[Parameter containing:
 tensor([[-0.3856]], requires_grad=True),
 Parameter containing:
 tensor([-0.0133], requires_grad=True)]

模型的参数一个是 w w w,一个是 b b b,都随机初始化好的,并且nn模块里面已经指定了需要求梯度

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()))       
epoch 0, loss 97.3932epoch 100, loss 0.7145epoch 200, loss 0.1337epoch 300, loss 0.1130epoch 400, loss 0.0997epoch 500, loss 0.0896epoch 600, loss 0.0819epoch 700, loss 0.0760epoch 800, loss 0.0715epoch 900, loss 0.0681epoch 1000, loss 0.0655epoch 1100, loss 0.0636epoch 1200, loss 0.0620epoch 1300, loss 0.0609epoch 1400, loss 0.0600epoch 1500, loss 0.0594epoch 1600, loss 0.0588epoch 1700, loss 0.0585epoch 1800, loss 0.0582epoch 1900, loss 0.0579epoch 2000, loss 0.0578epoch 2100, loss 0.0576epoch 2200, loss 0.0575epoch 2300, loss 0.0575epoch 2400, loss 0.0574epoch 2500, loss 0.0574epoch 2600, loss 0.0573epoch 2700, loss 0.0573epoch 2800, loss 0.0573epoch 2900, loss 0.0573

训练完成了,看一下训练的成果是多少。用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())
4.948962211608887 7.039998531341553

.item()把值取出来

再次可视化一下我们的模型,看看我们训练的数据,可以直接使用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()

在这里插入图片描述

注意:这里的predicted是把训练数据再次传入模型model(x_train_tensor).data.numpy()或者用model.forward(x_train_tensor).detach().numpy()得到的结果,可以不用forward

参考:深度学习基础及数学原理

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值