深度学习(2)——框架实现线性回归

前言

上一章介绍了线性回归的适用场景,代码实现以及简单的原理。但每次都要去写那么多代码去实现线性回归中的那些函数,例如优化算法,损失函数等等会比较麻烦,因此我们可以利用神经网络中的某些包中的某些方法就可以快速的来解决问题了。

一个例子

我们还是使用上一个blog中的例子,通过 synthetic_data 这个函数我们可以获得样本数据,然后自定义w和b值,可以得到样本y值。数据集创建见上一篇文章,接下来的读取与训练的方法将稍有不同。

读数据

这些代码可以替代上一篇博客中的data_iter函数,pytorch有一个自带的迭代器,将shuffle设置为True就可以实现打乱下标的操作。一个data.DataLoader就可以省去上一篇博客中许多的代码,还是很方便的。

def load_array(data_arrays, batch_size, is_train=True):  #@save
    """构造一个PyTorch数据迭代器"""
    dataset = data.TensorDataset(*data_arrays) #格式转变为数据集
    return data.DataLoader(dataset, batch_size, shuffle=is_train) #随机挑选batch_size个样本出来
batch_size = 10
data_iter = load_array((features, labels), batch_size)

定义模型

  1. 线性回归模型的神经网络写法
    这一段将使用神经网络的包来直接实现线性回归。
    这个语句就相当于上一个博客中的线性回归模型:
def linreg(X, w, b):  #@save
    """线性回归模型"""
    return torch.matmul(X, w) + b

Sequential这个类可以将神经网络中的多个层串联,例如第一层的输出就是第二层的输入,但我们这个问题只有一层就可以出结果,这边就是熟悉一下这个类。
这一层是一个全连接层,因为这层的计算就是矩阵点乘实现的,全连接是由神经网络中的Linear类实现的,他的两个参数分别是输入和输出的特征形状,因为本文中的例子是两个变量,也就有两个权重,是一个n行2列的矩阵点乘2行1列的矩阵,那么输入的特征形状就是2,假如有三个变量三个权重,那输入特征形状就是3。我是这样理解的,测试也验证了这一理解。接下来输出特征形状就是1,因为点乘出来的结果就是1个数,那么特征形状就是1。

from torch import nn #nn是神经网络的简写
net = nn.Sequential(nn.Linear(2, 1)) #
  1. 初始化模型参数
    net[0]就是神经网络中的第一层,我们可以通过weight和bias直接设置权重和误差值,使用.normal方法可以从正态分布中随机取一个数,.fill就是赋值0。
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
  1. 定义损失函数
    上一个博客中,损失函数的定义方法如下,这里返回的就是某个样本的损失
def squared_loss(y_hat, y):  #@save
    """均方损失"""
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

用这个函数返回的是样本损失的均值,这里就和之前说的原理保持一致了

loss = nn.MSELoss()
  1. 定义优化算法
    这个就直接实现了小批量随机梯度下降算法,net.parameters()就是获得我们模型中的变量的(w和b),lr就是学习率。
trainer = torch.optim.SGD(net.parameters(), lr=0.03)

训练

这里的 l 是均分误差的均值,因此我们不需要像上一个博客先对 l 求sum(),也不需要在sgd里面去除以batch_size,使用神经网络中的包就能很方便的去使用线性回归。

num_epochs = 3 #3次迭代
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X) ,y) #获得一批的损失均值
        trainer.zero_grad() 
        l.backward() #求导
        trainer.step() #优化
    l = loss(net(features), labels) #优化后的某次迭代的误差值
    print(f'epoch {epoch + 1}, loss {l:f}')

小结一下

使用神经网络的包可以快速的解决很多深度学习的问题,但我们还是最好能先了解一下每个算法的原理,这样可以帮助我们了解神经网络每个方法在做什么。
训练完成后,我们就可以用训练好的w和b值去预测y值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值