欢迎光临散文网 会员登陆 & 注册

4.4 线性回归代码实现

2023-02-04 11:30 作者:梗直哥丶  | 我要投稿



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


4.4 线性回归代码实现的评论 (共 条)

分享到微博请遵守国家法律