线性回归模型的从零实现
2024-09-27 15:30:55 # 深度学习入门 # 线性神经网络
从零开始构建线性回归模型

整体步骤:

1
2
3
4
5
6
7
#1.构建数据集
#2.打乱数据集,获取更小批次的数据
#3.初始化权重参数
#4.模型定义
#5.损失函数定义
#6.优化算法定义
#7.开始训练

具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import torch
import random
from d2l import torch as d2l

#真实的模型参数
true_w = torch.tensor([2, -3.4])
true_b = 4.2

#1.首先生成随机数据集, 生成一个1000 * 2的特征矩阵, 标签为1000 * 1的向量
def synthetic_data(w, b, num_samples):
X = torch.normal(0, 1, (num_samples, len(w)))
y = torch.matmul(X, w) + b
y += torch.normal(0, 0.01, y.shape)
return X, y.reshape(-1, 1)
features, labels = synthetic_data(true_w, true_b, 1000)


#2. 将数据集分割成等大小的批量数据,为后续的批量梯度下降做准备
def data_iter(batch_size, features, labels):
num_examples = len(features)
#得到一个随机顺序的数据集
indices = list(range(num_examples))
random.shuffle(indices)
for i in range(0, num_examples, batch_size):
batch_indices = torch.tensor(
indices[i: min(i + batch_size, num_examples)])#获取索引号列表
yield features[batch_indices], labels[batch_indices]

#3. 初始化模型参数
w = torch.normal(0, 0.01, (2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

#4. 定义模型
def liner_regression(w, b, X):
y_hat = torch.matmul(X, w) + b.reshape(-1, 1)
return y_hat

#5. 定义损失函数
def square_loss(y_hat, y):
return 0.5 * ((y_hat - y) ** 2)

#6. 定义优化算法 小批量随机梯度下降
def sgd(params, lr, batch_size):
with torch.no_grad():
for param in params:
param -= lr * param.grad / batch_size
#可以简单的理解为我们对一个批量的数据进行了batch_size次的累积求梯度,现在取一个梯度的平均值
param.grad.zero_()
#7. 开始训练
def train():
lr = 0.03
batch_size = 10
num_epochs = 3
net = liner_regression
loss = square_loss
for epoch in range(num_epochs):
for X, y in data_iter(batch_size, features, labels):
y_pred = net(w, b, X)
l = loss(y_pred, y)
l.sum().backward()
sgd([w, b], lr, batch_size)
with torch.no_grad():
train_l = loss(net(w, b, features), labels)
print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')