《动手学深度学习v2》之细致解析(4) 线性回归从零实现及相关函数的解析与测试

本文详述了如何从零实现线性回归,包括构建人造数据集、定义模型、损失函数和优化算法。通过李沐老师的《动手学深度学习v2》学习,探讨了自动求导的原理,如requires_grad、backward()、torch.no_grad()和optimizer.zero_grad()。同时介绍了迭代器和生成器的概念及其区别。
摘要由CSDN通过智能技术生成

前言

        作者来自北京某不知名985,现在是本科在读学生,专业是数据科学与大数据技术,班上同学都太卷了,没办法,需要学习深度学习,经大佬介绍,在B站上找到了一个很不错的资源,李沐老师的《动手学深度学习v2》,不仅有全套视频,讲解细致,而且配套资料全部公开免费,不用加公众号也不用私别人的vx,我觉得挺不错,在这里做一个学习记录,也想跟大家一起讨论深度学习相关的问题。新的一年,不要摆烂,一起加油!!!

 这里附上连接:

跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频

1. 引言 — 动手学深度学习 2.0.0 documentation

相关的视频和书籍的pdf都有介绍,可以免费下载,然后还有jupyter,非常nice,ok下面咱们进入正题,本博客的图片基本来自李沐老师的视频

 本文章包含了《动手学深度学习v2》视频中的 08

视频合集如下:

08 线性回归 + 基础优化算法【动手学深度学习v2】_哔哩哔哩_bilibili

目录

前言

线性回归从零实现

导包

构建人造数据集

 

构建数据迭代器来获得小批量数据

定义初始化模型参数

定义模型

定义损失函数

定义优化算法

训练过程

比较真实参数和通过训练学到的参数来评估训练的成功程度

梯度计算相关的函数和参数

第一处,也就是requires_grad,这里也就是自动求导的一个参数

第二处,也就是 l.sum().backward()

第三处 torch.no_grad():

第四处 每轮训练需要梯度清零操作optimizer.zero_grad()的原因

生成器和迭代器

迭代器

生成器

两者区别


线性回归从零实现

导包

我们将从零开始实现整个方法,包括数据流水线、模型、损失函数和小批量随机梯度下降优化器

import random
import torch
from d2l import torch as d2l

构建人造数据集

这里我们根据有噪声的线性模型构建一个人造数据集。我们使用线性模型参数

权重和偏差:w=[2,-3.4]^T b=4.2  噪声项\epsilon 生成数据集以及其标签:

y=Xw+b+\epsilon

def synthetic_data(w, b, num_examples):  
    """生成 y = Xw + b + 噪声。"""
    X = torch.normal(0, 1, (num_examples, len(w)))
    """这里是说生成一个正态分布中提取随机数的张量,其均值为0,方差为1,形状为 num_examples行,len(w)列,在这里len(w)也就是2 """
    y = torch.matmul(X, w) + b
    """这里是使用了矩阵乘法torch.matmul,对应元素相乘则用torch.mul,在这里我们刚好能得到y的形状为(num_examples,1)"""
    y += torch.normal(0, 0.01, y.shape)
    """再对y加上一个标量偏差b,之后返回样本和其对应的标签"""
    return X, y.reshape((-1, 1))
"""这里我们记录一下我们人工设定的真实的权重和标量偏差"""
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

这里我们再来看一下 features 和labels长什么样子

print('features:', features[0], '\nlabel:', labels[0])

我们得到的输出:

features: tensor([ 0.9958, -0.7299]) 
label: tensor([8.6615])

正如我们所料,feature有两个特征维度,而标签则是一个标量

d2l.set_figsize()
d2l.plt.scatter(features[:, 1].detach().numpy(),
                labels.detach().numpy(), 1);

我们选择feature的第一列,也就是第二个维度,其权重为-3.4,可以看到其与labels的相关性基本为线性相关,且为负相关,与我们的设定一致!

 

构建数据迭代器来获得小批量数据

接下来我们应用前面学到的小批量随机梯度下降的知识进行数据迭代器的构建,选取一些样本点作为梯度下降法的数据来训练模型

def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    random.shuffle(in
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值