day41 python图像识别任务

目录

一、数据预处理:为模型打下坚实基础

二、模型构建:多层感知机的实现

三、训练过程:迭代优化与性能评估

四、测试结果:模型性能的最终检验

五、总结与展望


在深度学习的旅程中,多层感知机(MLP)作为最基础的神经网络结构,是每位初学者的必经之路。最近,我通过实现和训练MLP模型,对图像识别任务有了更深入的理解。本文将从数据预处理、模型构建、训练过程到最终的测试结果,详细记录我的学习过程,并总结MLP在图像识别任务中的优势与局限。

一、数据预处理:为模型打下坚实基础

在任何机器学习任务中,数据预处理都是至关重要的第一步。对于图像数据,我们需要将其转换为适合模型处理的格式。以MNIST手写数字数据集为例,我使用了torchvision.transforms库对图像进行了标准化处理:

transform = transforms.Compose([transforms.ToTensor(),  # 转换为张量并归一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST数据集的均值和标准差
])

通过ToTensor()操作,图像被转换为张量格式,并且像素值被归一化到[0,1]区间。Normalize()操作则进一步对图像进行标准化,使其均值为0,标准差为1。这有助于加速模型的收敛。

对于彩色图像数据集(如CIFAR-10),处理方式类似,只是需要对每个通道分别进行标准化:

transform = transforms.Compose([transforms.ToTensor(),                transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 标准化处理
])

数据加载器DataLoader的使用也非常关键,它能够高效地批量加载数据,并支持多线程加速数据读取:

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

通过设置shuffle=True,训练数据会在每个epoch开始时被打乱,这有助于模型更好地泛化。

二、模型构建:多层感知机的实现

多层感知机(MLP)是一种经典的神经网络结构,由多个全连接层组成。在MNIST数据集上,我构建了一个简单的MLP模型:

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  # 将28x28的图像展平为784维向量self.layer1 = nn.Linear(784, 128)  # 第一层:784个输入,128个神经元self.relu = nn.ReLU()  # 激活函数self.layer2 = nn.Linear(128, 10)  # 第二层:128个输入,10个输出(对应10个数字类别)def forward(self, x):x = self.flatten(x)  # 展平图像x = self.layer1(x)   # 第一层线性变换x = self.relu(x)     # 应用ReLU激活函数x = self.layer2(x)   # 第二层线性变换,输出logitsreturn x

在CIFAR-10数据集上,我将模型进行了扩展,增加了层数和神经元数量,并引入了Dropout来防止过拟合:

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  # 将3x32x32的图像展平为3072维向量self.layer1 = nn.Linear(3072, 512)  # 第一层:3072个输入,512个神经元self.relu1 = nn.ReLU()self.dropout1 = nn.Dropout(0.2)  # 添加Dropout防止过拟合self.layer2 = nn.Linear(512, 256)  # 第二层:512个输入,256个神经元self.relu2 = nn.ReLU()self.dropout2 = nn.Dropout(0.2)self.layer3 = nn.Linear(256, 10)  # 输出层:10个类别def forward(self, x):x = self.flatten(x)  # 输入尺寸: [batch_size, 3, 32, 32] → [batch_size, 3072]x = self.layer1(x)   # 线性变换: [batch_size, 3072] → [batch_size, 512]x = self.relu1(x)    # 应用ReLU激活函数x = self.dropout1(x) # 训练时随机丢弃部分神经元输出x = self.layer2(x)   # 线性变换: [batch_size, 512] → [batch_size, 256]x = self.relu2(x)    # 应用ReLU激活函数x = self.dropout2(x) # 训练时随机丢弃部分神经元输出x = self.layer3(x)   # 线性变换: [batch_size, 256] → [batch_size, 10]return x  # 返回未经过Softmax的logits

Dropout是一种有效的正则化技术,它在训练阶段随机丢弃部分神经元的输出,从而防止模型对训练数据过度拟合。

三、训练过程:迭代优化与性能评估

训练过程是模型学习数据特征的关键阶段。我使用了Adam优化器和交叉熵损失函数,这是分类任务中常用的组合:

criterion = nn.CrossEntropyLoss()  # 交叉熵损失函数,适用于多分类问题
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam优化器

在训练过程中,我记录了每个iteration的损失,并绘制了损失曲线,以便直观地观察模型的收敛情况:

def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 设置为训练模式all_iter_losses = []  # 存储所有 batch 的损失iter_indices = []     # 存储 iteration 序号for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)  # 移至GPUoptimizer.zero_grad()  # 梯度清零output = model(data)  # 前向传播loss = criterion(output, target)  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新参数iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 单Batch损失: {iter_loss:.4f} | 累计平均损失: {running_loss/(batch_idx+1):.4f}')epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totalepoch_test_loss, epoch_test_acc = test(model, test_loader, criterion, device)print(f'Epoch {epoch+1}/{epochs} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%')plot_iter_losses(all_iter_losses, iter_indices)return epoch_test_acc

通过每100个批次打印一次训练信息,我可以实时监控模型的训练进度。同时,每个epoch结束后,我会对模型进行测试,评估其在测试集上的性能。

四、测试结果:模型性能的最终检验

经过多次实验,我发现在MNIST数据集上,MLP模型能够达到较高的准确率(约96.75%)。然而,在更具挑战性的CIFAR-10数据集上,即使增加了模型的深度和训练轮次,最终测试准确率也仅能达到约52.40%。这表明MLP在处理复杂图像数据时存在明显的局限性。

五、总结与展望

通过这次学习,我深刻认识到MLP在图像识别任务中的优势与不足。MLP结构简单,易于理解和实现,但在处理图像数据时,它无法有效利用图像的空间结构信息,导致在复杂任务上性能受限。此外,深层MLP的参数规模呈指数级增长,容易过拟合,训练成本也较高。未来,我将深入学习卷积神经网络(CNN),它专门针对图像数据设计,能够自动提取图像的空间特征,具有更少的参数和更快的训练速度,是解决图像识别问题的更优选择。

@浙大疏锦行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS数组 concat() 与扩展运算符的深度解析与最佳实践

文章目录 前言一、语法对比1. Array.prototype.concat()2. 扩展运算符(解构赋值) 二、性能差异(大规模数组)关键差异原因 三、适用场景建议总结 前言 最近工作中遇到了一个大规模数组合并相关的问题,在数据合并时有些…

一套qt c++的串口通信

实现了创建线程使用串口的功能 具备功能: 1.线程使用串口 2.定时发送队列内容,防止粘包 3.没处理接收粘包,根据你的需求来,handleReadyRead函数中,可以通过m_receiveBuffer来缓存接收,然后拆分数据来处理 源码 seri…

设计模式-发布订阅

文章目录 发布订阅概念发布订阅 vs 监听者例子代码 发布订阅概念 发布/订阅者模式最大的特点就是实现了松耦合,也就是说你可以让发布者发布消息、订阅者接受消息,而不是寻找一种方式把两个分离 的系统连接在一起。当然这种松耦合也是发布/订阅者模式最大…

windows-cmd 如何查询cpu、内存、磁盘的使用情况

在 Windows 中,您可以使用命令提示符(CMD)通过一些命令来查询 CPU、内存和磁盘的使用情况。以下是常用的命令和方法: 1. 查询 CPU 使用情况 使用 wmic 命令 wmic cpu get loadpercentage 这个命令会显示当前 CPU 的使用百分比…

allWebPlugin中间件VLC专用版之截图功能介绍

背景 VLC控件原有接口具有视频截图方法,即video对象的takeSnapshot方法,但是该方法返回的是一个IPicture对象,不适合在谷歌等现代浏览器上使用。因此,本人增加一个新的视频截图方法takeSnapshot2B64方法,直接将视频截图…

第Y5周:yolo.py文件解读

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 本次任务:将YOLOv5s网络模型中的C3模块按照下图方式修改形成C2模块,并将C2模块插入第2层与第3层之间,且跑通YOLOv5s。 任务…

宝塔安装ssh证书报错:/usr/bin/curl: symbol lookup error: curl_easy_header

原因: 你当前的 curl 命令版本是 7.70.0(不是系统默认版本,应该是你手动安装的)。它链接的是 /usr/local/lib/libcurl.so.4,而不是 CentOS 系统默认的 /usr/lib64/libcurl.so.4。/usr/local/lib/libcurl.so.4 很可能是…

Apache SeaTunnel 引擎深度解析:原理、技术与高效实践

Apache SeaTunnel 作为新一代高性能分布式数据集成平台,其核心引擎设计融合了现代大数据处理架构的精髓。 Apache SeaTunnel引擎通过分布式架构革新、精细化资源控制及企业级可靠性设计,显著提升了数据集成管道的执行效率与运维体验。其模块化设计允许用…

测试用例及黑盒测试方法

一、测试用例 1.1 基本要素 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等4个主要要素。 1.1.1 测试环境 定义:测试执行所需的软硬件…

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

目录 1 运算放大电路基础 1.1 概述 1.1.1 基本结构 1.1.2 理想特性 1.2 运算放大分析方法 1.2.1 虚短 1.2.2虚断 1.2.3 叠加定理 2 同向比例运算放大电路 2.1 概述 2.1.1 基本电路结构 2.1.2 电路原理 2.2 仿真分析 2.2.1 电压增益 2.2.2 相位分析 3 反向比例运…

板凳-------Mysql cookbook学习 (九)

第4章:表管理 4.0 引言 MySQL :: 员工样例数据库 :: 3 安装 https://dev.mysql.com/doc/employee/en/employees-installation.html Employees 数据库与几种不同的 存储引擎,默认情况下启用 InnoDB 引擎。编…

MySQL省市区数据表

数据结构简单展示一下 具体的可以点击文章最后的链接地址下载 连接地址中有两个文件一个是详细的另一个是简洁的 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for ln_new_region -- ---------------------------- DROP…

无人机报警器探测模块技术解析!

一、运行方式 1. 频谱监测与信号识别 全频段扫描:模块实时扫描900MHz、1.5GHz、2.4GHz、5.8GHz等无人机常用频段,覆盖遥控、图传及GPS导航信号。 多路分集技术:采用多传感器阵列,通过信号加权合并提升信噪比,…

Oracle 导入导出 dmp 数据文件实战

一、DMP文件基础知识​​ 1. ​​DMP文件定义​​ DMP(Data Pump Dump File)是Oracle数据库专用的二进制格式文件,由expdp/impdp或旧版exp/imp工具生成。它包含数据库对象的元数据(表结构、索引等)和实际数据&#x…

Coursier:安装sbt

命令 ./cs launch sbt -- --version 的含义是​​通过 Coursier(cs)工具启动 SBT(Scala 构建工具),并查询其版本信息​​。具体解析如下: ​​1. 命令结构解析​​ ​​./cs​​: 这是 Coursie…

【深度学习】12. VIT与GPT 模型与语言生成:从 GPT-1 到 GPT4

VIT与GPT 模型与语言生成:从 GPT-1 到 GPT4 本教程将介绍 GPT 系列模型的发展历程、结构原理、训练方式以及人类反馈强化学习(RLHF)对生成对齐的改进。内容涵盖 GPT-1、GPT-2、GPT-3、GPT-3.5(InstructGPT)、ChatGPT …

项目更改权限后都被git标记为改变,怎么去除

❗问题描述: 当你修改了项目中的文件权限(如使用 chmod 改了可执行权限),Git 会把这些文件标记为“已更改”,即使内容并没有发生任何改变。 ✅ 解决方法: ✅ 方法一:告诉 Git 忽略权限变化&am…

openfeignFeign 客户端禁用 SSL

要针对特定的 Feign 客户端禁用 SSL 验证,可以通过自定义配置类实现。以下是完整解决方案: 1. 创建自定义配置类(禁用 SSL 验证) import feign.Client; import feign.httpclient.ApacheHttpClient; import org.apache.http.conn…

移动端 UI自动化测试学习之Appium框架(包含adb调试工具介绍)

文章目录 前言adb调试工具adb组成常用命令获取程序的包名和界面名文件传输发送文件到手机从手机中拉取文件 获取app启动时间获取手机日志其他命令 Appium 简介工作原理图 环境搭建安装客户端库(appium lib)安装Appium Server安装JDK(自行下载…

【论文解读】DETR: 用Transformer实现真正的End2End目标检测

1st authors: About me - Nicolas Carion‪Francisco Massa‬ - ‪Google Scholar‬ paper: [2005.12872] End-to-End Object Detection with Transformers ECCV 2020 code: facebookresearch/detr: End-to-End Object Detection with Transformers 1. 背景 目标检测&#…