ML-Notebooks项目解析:基于PyTorch的简洁逻辑回归图像分类实现

ML-Notebooks项目解析:基于PyTorch的简洁逻辑回归图像分类实现

ML-Notebooks :fire: Machine Learning Notebooks ML-Notebooks 项目地址: https://gitcode.com/gh_mirrors/ml/ML-Notebooks

概述

逻辑回归(Logistic Regression)是机器学习中最基础但非常重要的分类算法之一。本文将深入解析如何使用PyTorch框架实现一个简洁但完整的逻辑回归模型,用于图像分类任务。这个实现来自一个专注于机器学习实践的教育性项目,展示了如何从数据加载到模型训练的全流程。

环境准备与数据加载

硬件配置

首先,我们需要检查并配置计算设备。现代深度学习通常利用GPU加速计算:

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

这段代码会自动检测是否有可用的GPU,如果有则使用GPU(cuda:0),否则回退到CPU。

数据预处理

图像分类任务中,数据预处理是关键步骤。我们使用PyTorch的transforms模块进行标准化处理:

  1. 图像尺寸调整:统一调整为224x224像素
  2. 中心裁剪:确保输入尺寸一致
  3. 张量转换:将PIL图像转换为PyTorch张量
  4. 展平操作:将2D图像展平为1D向量,这是逻辑回归需要的输入格式
class ReshapeTransform:
    def __init__(self, new_size):
        self.new_size = new_size

    def __call__(self, img):
        return torch.reshape(img, self.new_size)

data_transforms = {
    'train': transforms.Compose([
        transforms.Resize(224),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        ReshapeTransform((-1,))  # 展平图像
    ]),
    'val': transforms.Compose([...])  # 验证集使用相同的变换
}

逻辑回归模型实现

模型架构

逻辑回归模型本质上是一个单层神经网络,包含以下组件:

  1. 线性层:将输入特征映射到单个输出
  2. Sigmoid激活函数:将输出转换为概率值(0到1之间)
class LR(nn.Module):
    def __init__(self, dim):
        super(LR, self).__init__()
        self.linear = nn.Linear(dim, 1)  # 输入维度dim,输出1
        nn.init.zeros_(self.linear.weight)  # 权重初始化为0
        nn.init.zeros_(self.linear.bias)   # 偏置初始化为0

    def forward(self, x):
        x = self.linear(x)
        x = torch.sigmoid(x)  # 应用Sigmoid激活
        return x

预测函数

逻辑回归的输出是0到1之间的概率值,我们需要将其转换为类别标签(0或1):

def predict(yhat, y):
    yhat = yhat.squeeze()
    y_prediction = torch.zeros(y.size()[1])
    for i in range(yhat.shape[0]):
        y_prediction[i] = 0 if yhat[i] <= 0.5 else 1
    return 100 - torch.mean(torch.abs(y_prediction - y)) * 100

这里使用0.5作为阈值,计算分类准确率。

模型训练与评估

训练配置

  1. 损失函数:二元交叉熵(BCELoss),适合二分类问题
  2. 优化器:随机梯度下降(SGD),学习率设为0.0001
dim = train_dataset.dataset[0][0].shape[0]  # 获取输入维度
lrmodel = LR(dim).to(device)
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(lrmodel.parameters(), lr=0.0001)

训练过程

训练循环包含以下关键步骤:

  1. 前向传播计算预测值
  2. 计算损失
  3. 反向传播更新参数
  4. 定期评估模型性能
for ITER in range(100):
    # 训练阶段
    lrmodel.train()
    x, y = next(iter(train_dataset))
    yhat = lrmodel.forward(x.to(device))
    cost = criterion(yhat.squeeze(), y.type(torch.FloatTensor).to(device))
    
    # 反向传播
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()
    
    # 评估阶段
    lrmodel.eval()
    with torch.no_grad():
        yhat_test = lrmodel.forward(test_x.to(device))
        test_pred = predict(yhat_test, test_y)
    
    # 每10次迭代打印进度
    if ITER % 10 == 0:
        print(f"Cost after iteration {ITER}: {cost} | Train Acc: {train_pred} | Test Acc: {test_pred}")

结果分析

从训练输出可以看到:

  • 初始准确率约50%,相当于随机猜测
  • 随着训练进行,训练准确率逐步提升到约74%
  • 测试准确率提升到约58%,表明模型有一定泛化能力
  • 损失函数值持续下降,表明学习过程有效

这种简单的逻辑回归模型在图像分类任务上表现有限,主要是因为:

  1. 图像数据的高维特性
  2. 线性模型的表达能力有限
  3. 没有利用图像的局部空间信息

扩展思考

虽然逻辑回归在图像分类任务上表现一般,但这个简洁实现具有重要教育意义:

  1. 理解基础:帮助初学者掌握机器学习的基本流程
  2. PyTorch入门:展示了PyTorch的核心组件使用方式
  3. 性能基准:可以作为更复杂模型的基准对比

对于实际应用,可以考虑以下改进方向:

  • 使用卷积神经网络(CNN)提取图像特征
  • 添加正则化防止过拟合
  • 尝试不同的优化器和学习率调度策略
  • 使用数据增强提高泛化能力

这个简洁实现为理解更复杂的深度学习模型奠定了坚实基础。

ML-Notebooks :fire: Machine Learning Notebooks ML-Notebooks 项目地址: https://gitcode.com/gh_mirrors/ml/ML-Notebooks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尤嫒冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值