前言
作者来自北京某不知名985,现在是本科在读学生,专业是数据科学与大数据技术,班上同学都太卷了,没办法,需要学习深度学习,经大佬介绍,在B站上找到了一个很不错的资源,李沐老师的《动手学深度学习v2》,不仅有全套视频,讲解细致,而且配套资料全部公开免费,不用加公众号也不用私别人的vx,我觉得挺不错,在这里做一个学习记录,也想跟大家一起讨论深度学习相关的问题。新的一年,不要摆烂,一起加油!!!
这里附上连接:
1. 引言 — 动手学深度学习 2.0.0 documentation
相关的视频和书籍的pdf都有介绍,可以免费下载,然后还有jupyter,非常nice,ok下面咱们进入正题,本博客的图片基本来自李沐老师的视频
本文章包含了《动手学深度学习v2》视频中的 08
视频合集如下:
08 线性回归 + 基础优化算法【动手学深度学习v2】_哔哩哔哩_bilibili
目录
第一处,也就是requires_grad,这里也就是自动求导的一个参数
第四处 每轮训练需要梯度清零操作optimizer.zero_grad()的原因
线性回归从零实现
导包
我们将从零开始实现整个方法,包括数据流水线、模型、损失函数和小批量随机梯度下降优化器
import random
import torch
from d2l import torch as d2l
构建人造数据集
这里我们根据有噪声的线性模型构建一个人造数据集。我们使用线性模型参数
权重和偏差: 噪声项
生成数据集以及其标签:
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