ML-Notebooks项目解析:基于PyTorch的简洁逻辑回归图像分类实现
ML-Notebooks :fire: Machine Learning 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模块进行标准化处理:
- 图像尺寸调整:统一调整为224x224像素
- 中心裁剪:确保输入尺寸一致
- 张量转换:将PIL图像转换为PyTorch张量
- 展平操作:将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([...]) # 验证集使用相同的变换
}
逻辑回归模型实现
模型架构
逻辑回归模型本质上是一个单层神经网络,包含以下组件:
- 线性层:将输入特征映射到单个输出
- 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作为阈值,计算分类准确率。
模型训练与评估
训练配置
- 损失函数:二元交叉熵(BCELoss),适合二分类问题
- 优化器:随机梯度下降(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)
训练过程
训练循环包含以下关键步骤:
- 前向传播计算预测值
- 计算损失
- 反向传播更新参数
- 定期评估模型性能
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%,表明模型有一定泛化能力
- 损失函数值持续下降,表明学习过程有效
这种简单的逻辑回归模型在图像分类任务上表现有限,主要是因为:
- 图像数据的高维特性
- 线性模型的表达能力有限
- 没有利用图像的局部空间信息
扩展思考
虽然逻辑回归在图像分类任务上表现一般,但这个简洁实现具有重要教育意义:
- 理解基础:帮助初学者掌握机器学习的基本流程
- PyTorch入门:展示了PyTorch的核心组件使用方式
- 性能基准:可以作为更复杂模型的基准对比
对于实际应用,可以考虑以下改进方向:
- 使用卷积神经网络(CNN)提取图像特征
- 添加正则化防止过拟合
- 尝试不同的优化器和学习率调度策略
- 使用数据增强提高泛化能力
这个简洁实现为理解更复杂的深度学习模型奠定了坚实基础。
ML-Notebooks :fire: Machine Learning Notebooks 项目地址: https://gitcode.com/gh_mirrors/ml/ML-Notebooks
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考