4.4 线性回归代码实现







4.4.3 完整代码
接着将所有代码组合起来,看一下完整代码示例,输出值和上面代码应该是一样的。同学们可以自行修改数据维度、学习率、迭代次数进行实验。
import numpy as np
import torch
# 设置随机数种子,使得每次运行代码生成的数据相同
np.random.seed(42)
# 生成随机数据
x = np.random.rand(100, 1)
y = 1 + 2 * x + 0.1 * np.random.randn(100, 1)
# 将数据转换为 pytorch tensor
x_tensor = torch.from_numpy(x).float()
y_tensor = torch.from_numpy(y).float()
# 设置超参数
learning_rate = 0.1
num_epochs = 1000
# 初始化参数
w = torch.randn(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# 开始训练
for epoch in range(num_epochs):
# 计算预测值
y_pred = x_tensor * w + b
# 计算损失
loss = ((y_pred - y_tensor) ** 2).mean()
# 反向传播
loss.backward()
# 更新参数
with torch.no_grad():
w -= learning_rate * w.grad
b -= learning_rate * b.grad
# 清空梯度
w.grad.zero_()
b.grad.zero_()
# 输出训练后的参数
print('w:', w)
print('b:', b)
w: tensor([1.9540], requires_grad=True)
b: tensor([1.0215], requires_grad=True)
4.4.4 Pytorch模型实现
最后看一下如何使用Pytorch模型实现,前面是手动定义和更新参数w和b。但每次都手动操作实在是太麻烦了,当然还有更简单的方法。先把前面没有变化的内容复制过来。然后定义输入数据的维度和输出数据的维度,接下来使用 nn.Linear 模块定义一个线性回归模型,它有 input_dim 个输入特征和 output_dim 个输出特征。本质上就是一个神经元,和前面 w、b 的作用是一样的。
然后使用 nn.MSELoss 模块定义一个均方误差(MSE)损失函数,使用 torch.optim.SGD 模块定义一个随机梯度下降(SGD)优化器,并传入前面定义好的学习率。
import numpy as np
import torch
import torch.nn as nn
# 设置随机数种子,使得每次运行代码生成的数据相同
np.random.seed(42)
# 生成随机数据
x = np.random.rand(100, 1)
y = 1 + 2 * x + 0.1 * np.random.randn(100, 1)
# 将数据转换为 pytorch tensor
x_tensor = torch.from_numpy(x).float()
y_tensor = torch.from_numpy(y).float()
# 设置超参数
learning_rate = 0.1
num_epochs = 1000
# 定义输入数据的维度和输出数据的维度
input_dim = 1
output_dim = 1
# 定义模型
model = nn.Linear(input_dim, output_dim)
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)
# 开始训练
for epoch in range(num_epochs):
# 将输入数据喂给模型
y_pred = model(x_tensor)
# 计算损失
loss = criterion(y_pred, y_tensor)
# 清空梯度
optimizer.zero_grad()
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 输出训练后的参数
print('w:', model.weight.data)
print('b:', model.bias.data)
w: tensor([[1.9540]])
b: tensor([1.0215])
还是使用 for 循环迭代最大迭代次数。在每一次迭代中,我们首先用模型计算输入数据的预测值 y_pred ,然后使用损失函数计算 𝐿oss ,也就是MSE均方误差。
接着我们使用优化器的 zero_grad 方法清空梯度,然后调用 loss.backward 来反向传播梯度。
再直接调用优化器的 step 方法就可以更新模型的参数。
最后还是输出训练后的参数 w和b。可以看到和前面手动更新的输出值是完全一致的。通过这种模式可以进一步定义复杂网络,然后很容易的批量更新参数。
好了,这一节我们简单回顾了线性回归的要点,用代码一步步实现了线性回归并进行详细解释,最后使用Pytorch框架快速实现。大家加油。
机器学习必修课

同步更新:
Github/公众号:梗直哥
学习资料&分享交流:gengzhige99