1. 导入pytorch库
import torch
2. 设定超参数
包括特征数量,训练的次数,学习率
input_size = 3
num_epochs = 60
learning_rate = 0.001
3. 随机生成训练数据
x_train 是一个形状为 [100, input_size] 的张量,代表着 100 个样本的特征值
y_train 的生成规则是对 x_train 的每一列分别乘以一定的权重并相加,然后加上一些随机噪声——torch.randn(100, output_size)
x_train = torch.randn(100, input_size)
y_train = 2 * x_train[:, 0] + 3 * x_train[:, 1] - 4 * x_train[:, 2] + 5 + torch.randn(100, output_size)
随机生成x_train,y_train
4. 初始化w,b
初始化了权重 w 和偏置 b。w 是一个形状为 [input_size, output_size] 的张量,b 是一个标量。将 requires_grad 设为 True,这两个张量在后续的计算中需要计算梯度。
w = torch.randn(input_size, output_size, requires_grad=True)
b = torch.randn(1, requires_grad=True)
随机初始化w,b
把w,b都设置为零向量的情况
w = torch.tensor([[0.0],[0.0],[0.0]], requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)
初始化w,b为0
5.前向传播
进行了前向传播,计算了模型的输出和损失。通过矩阵乘法 mm 计算了 x_train 和 w 的乘积,然后加上偏置 b,得到了模型的输出。损失函数是平方误差函数,通过计算模型输出和真实值 y_train 的差的平方,然后求均值得到。
for epoch in range(num_epochs):
outputs = x_train.mm(w) + b loss = torch.mean((outputs - y_train) ** 2)
6.梯度下降法更新w,b
使用梯度下降法,用学习率乘以对应的梯度,然后从原来的参数值中减去。然后将权重 w 和偏置 b 的梯度清零。在每5轮训练后,打印出了当前的损失值,观察训练过程中损失的变化情况。最后,打印出了训练完成后的权重 w 和偏置 b。调用了 detach() 方法,将 w 从计算图中分离出来,这样就不会计算它的梯度了。
loss.backward()
with torch.no_grad():
w -= learning_rate * w.grad
b -= learning_rate * b.grad
# 清零梯度
w.grad.zero_()
b.grad.zero_()
if (epoch + 1) % 5 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, loss.item()))
print(f'Weights: {w.detach().numpy()}, Bias: {b.item()}')
结果