线性回归与梯度下降在PyTorch中的实现

线性回归机器学习中的基础算法之一,它旨在建立输入特征(X)和输出标签(y)之间的线性关系。在线性回归中,每个输出标签被表达为输入特征的线性函数,该函数使用权重和偏置。这些权重和偏置是模型参数,它们最初是随机初始化的,但随后会通过训练/学习过程中的每个周期更新。完成一次训练数据迭代的训练称为一个“周期”(epoch)。因此,需要训练模型多个周期,以便权重和偏置能够学习输入特征和输出标签之间的线性关系。

本教程将创建一个基于假设数据的模型,这些数据包括特定地区的平均气温、年降雨量和湿度对芒果和橙子产量的影响。训练数据如下表所示:

地区 温度(F) 降雨量(mm) 湿度(%) 芒果(吨) 橙子(吨)

线性回归中,每个目标标签被表达为输入变量的加权和加上偏置,即:

芒果 = w11 * 温度 + w12 * 降雨量 + w13 * 湿度 + b1 橙子 = w21 * 温度 + w22 * 降雨量 + w23 * 湿度 + b2

最初,权重和偏置是随机初始化的,然后在训练过程中相应更新,以便这些权重和偏置能够预测任何地区在给定温度、降雨量和湿度条件下生产的芒果和橙子的数量,达到一定的准确度。这就是机器学习的核心。

现在,让开始使用PyTorch实现...

导入必要的库

import torch import numpy as np

加载数据

上述表格中的训练数据可以使用NumPy表示为矩阵。因此,分别定义输入和目标:

inputs = np.array([...], dtype='float32') targets = np.array([...], dtype='float32')

输入和目标矩阵都作为NumPy数组加载。这应该使用torch.from_numpy()方法转换为torch张量:

inputs = torch.from_numpy(inputs) targets = torch.from_numpy(targets)

创建TensorDataset

现在创建一个TensorDataset,它将输入和目标张量包装到一个数据集中。从torch.utils.data导入TensorDataset方法。可以使用索引像在Python中一样访问数据集中的行作为元组。

from torch.utils.data import TensorDataset dataset = TensorDataset(inputs, targets)

转换为DataLoader

使用Pytorch的DataLoader类,可以将数据集转换为预定义批量大小的批次,并随机从数据集中创建批次。

from torch.utils.data import DataLoader batch_size = 3 train_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

定义线性回归算法

线性回归中,需要找到最优的权重和偏置,以定义输入和输出之间的理想线性关系。因此,定义一组权重来建立输入特征和目标之间的线性关系。这里还设置超参数(即权重和偏置)的requires_grad属性为True。

w = torch.randn(2, 3, requires_grad=True) b = torch.randn(2, requires_grad=True)

损失函数

损失函数是衡量模型性能的指标。损失函数在更新超参数中起着重要作用,以便结果损失更小。回归中最广泛使用的损失函数之一是均方误差(MSE)或L2损失。MSE定义了实际值和预测值之间差异的平方的平均值。

def mse_loss(predictions, targets): difference = predictions - targets return torch.sum(difference * difference) / difference.numel() epochs = 50 for i in range(epochs): for x, y in train_loader: preds = model(x) loss = mse_loss(preds, y) loss.backward() with torch.no_grad(): w -= w.grad * 1e-6 b -= b.grad * 1e-6 w.grad.zero_() b.grad.zero_() print(f"Epoch {i}/{epochs}: Loss: {loss}")
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485