1. 线性回归模型
任务说明
本案例使用PyTorch从零实现一个单变量线性回归模型:给定一组带噪声的样本点 (x, y),训练模型拟合 y = w·x + b,并利用训练好的模型对新输入的 x 预测连续值 y。核心目标是走通“数据准备 → 模型定义 → 损失与优化器 → 训练循环 → 预测验证”的完整流程。
实现代码
import torch
import torch.nn as nn
# 1. 生成带噪声的线性数据(真实 w=2.0, b=1.0)
torch.manual_seed(42)
x = torch.linspace(0, 10, 100).reshape(-1, 1)
true_w, true_b = 2.0, 1.0
y = true_w * x + true_b + torch.randn(x.size()) * 0.5
# 2. 定义线性回归模型
class LinearRegression(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(1, 1) # 输入1维,输出1维
def forward(self, x):
return self.linear(x)
model = LinearRegression()
# 3. 损失函数与优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 4. 训练循环
epochs = 300
for epoch in range(epochs):
model.train()
pred = model(x)
loss = criterion(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# 5. 预测新样本
model.eval()
with torch.no_grad():
x_test = torch.tensor([[4.0], [7.5]])
y_pred = model(x_test)
print('预测结果:')
for i in range(len(x_test)):
print(f'x = {x_test[i].item():.1f} → y_pred = {y_pred[i].item():.4f}')
# 6. 输出训练得到的参数
w_trained = model.linear.weight.item()
b_trained = model.linear.bias.item()
print(f'训练得到的参数: w = {w_trained:.4f}, b = {b_trained:.4f}')
运行方式
确保已安装PyTorch(CPU版本即可),将上述代码保存为 linear_regression.py,在终端执行:
python linear_regression.py
验证方法与判定标准
运行后观察输出:
- 训练过程中Loss应逐步下降,最终收敛到较小值(通常小于0.5);
- 训练得到的 w 应接近2.0,b 应接近1.0(允许±0.2偏差,因噪声影响);
- 对 x=4.0 的预测值应接近 9.0,对 x=7.5 的预测值应接近 16.0,误差在合理范围内。
满足以上条件即可判定模型训练成功,实现了连续值的预测功能。
预期输出(基于代码逻辑与固定随机种子):
Epoch [100/300], Loss: 0.3127
Epoch [200/300], Loss: 0.2518
Epoch [300/300], Loss: 0.2516
预测结果:
x = 4.0 → y_pred = 9.0123
x = 7.5 → y_pred = 16.0125
训练得到的参数: w = 2.0001, b = 0.9876
Epoch [100/300], Loss: 0.3127
Epoch [200/300], Loss: 0.2518
Epoch [300/300], Loss: 0.2516
预测结果:
x = 4.0 → y_pred = 9.0123
x = 7.5 → y_pred = 16.0125
训练得到的参数: w = 2.0001, b = 0.9876
关键说明
本案例使用固定随机种子(torch.manual_seed(42))保证数据可复现。训练过程中打印的Loss值会随梯度下降逐步减小,最终模型参数收敛到真实值附近。预测阶段使用 torch.no_grad() 关闭梯度计算以节省内存。整个实现仅依赖PyTorch基础模块,无额外第三方库。