[神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果
结合归一化和正则化来优化网络模型结构,观察对比loss结果
搭建的神经网络,使用olivettiface数据集进行训练,结合归一化和正则化来优化网络模型结构,观察对比loss结果
from sklearn.datasets import fetch_olivetti_faces #倒入数据集
olivetti_faces = fetch_olivetti_faces(data_home='./face_data', shuffle=True)
print(olivetti_faces.data.shape) #打印数据集的形状
print(olivetti_faces.target.shape) #打印目标的形状
print(olivetti_faces.images.shape) #打印图像的形状
(400, 4096)
(400,)
(400, 64, 64)
import matplotlib.pyplot as pltface = olivetti_faces.images[1] #选择第二张人脸图像
plt.imshow(face, cmap='gray') #显示图像 cmap='gray'表示灰度图
plt.show()
olivetti_faces.data[1] #选择第二张人脸图像的扁平化数据
array([0.76859504, 0.75619835, 0.74380165, ..., 0.48347107, 0.6280992 ,0.6528926 ], shape=(4096,), dtype=float32)
import torch
import torch.nn as nn
images = torch.tensor(olivetti_faces.data) #将数据转换为tensor
targets = torch.tensor(olivetti_faces.target) #将目标转换为tensor
images.shape #打印图像的形状
torch.Size([400, 4096])
targets.shape #打印目标的形状
torch.Size([400])
dataset = [(img,lbl) for img,lbl in zip(images, targets)] #将图像和标签组合成一个数据集
dataset[0] #打印数据集的第一个元素
(tensor([0.6694, 0.6364, 0.6488, ..., 0.0868, 0.0826, 0.0744]), tensor(13))
dataloader = torch.utils.data.DataLoader(dataset, batch_size=10, shuffle=True) #创建数据加载器,批量大小为10,打乱数据
# device = torch.device('mps' if torch.backends.mps.is_available() else 'cpu')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')device
device(type='cpu')
使用Dropout正则化优化
# 多层神经网络模型
model = nn.Sequential(nn.Linear(4096, 8192), # 输入层,输入特征数为4096nn.ReLU(), # ReLU激活函数nn.Dropout(), # Dropout正则化nn.Linear(8192, 16384), # 隐藏层,输出特征数为16384nn.ReLU(),nn.Dropout(),nn.Linear(16384, 1024), # 隐藏层,输出特征数为1024nn.ReLU(),nn.Dropout(),nn.Linear(1024, 40) # 输出层,输出特征数为40(对应40个类别)
).to(device) # 模型结构搬到GPU内存中
print(model) # 打印模型结构
Sequential((0): Linear(in_features=4096, out_features=8192, bias=True)(1): ReLU()(2): Dropout(p=0.5, inplace=False)(3): Linear(in_features=8192, out_features=16384, bias=True)(4): ReLU()(5): Dropout(p=0.5, inplace=False)(6): Linear(in_features=16384, out_features=1024, bias=True)(7): ReLU()(8): Dropout(p=0.5, inplace=False)(9): Linear(in_features=1024, out_features=40, bias=True)
)
criterion = nn.CrossEntropyLoss() # 损失函数为交叉熵损失
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3) # 优化器为Adam,学习率为1e-3
# 训练模型
loss_hist = [] # 用于记录损失值
# 将模型设置为训练模式
model.train()
for i in range(20): # 训练20个epochfor img,lbl in dataloader:img,lbl = img.to(device), lbl.to(device) # 数据和模型在同一个设备端result = model(img)loss = criterion(result, lbl)loss.backward()optimizer.step()optimizer.zero_grad()loss_hist.append(loss.item()) # 记录损失值print(f'epoch:{i+1} loss:{loss.item():.4f}') # 打印当前epoch和损失值
epoch:1 loss:3.7076
epoch:1 loss:12.3654
epoch:1 loss:13.7588
epoch:1 loss:6.2780
epoch:1 loss:4.3650
epoch:1 loss:3.9659
epoch:1 loss:3.9149
epoch:1 loss:3.8406
epoch:1 loss:3.8485
epoch:1 loss:3.8279
epoch:1 loss:3.8980
epoch:1 loss:3.8377
epoch:1 loss:3.7295
epoch:1 loss:3.7737
epoch:1 loss:3.7615
epoch:1 loss:3.7997
epoch:1 loss:3.7737
epoch:1 loss:3.7385
epoch:1 loss:3.7080
epoch:1 loss:3.6875
epoch:1 loss:3.7611
epoch:1 loss:3.6810
epoch:1 loss:3.5438
epoch:1 loss:3.7640
epoch:1 loss:3.9102
epoch:1 loss:4.2676
epoch:1 loss:3.8784
epoch:1 loss:3.8589
epoch:1 loss:3.6792
。。。。。。
epoch:20 loss:3.6929
epoch:20 loss:3.6839
epoch:20 loss:3.6866
epoch:20 loss:3.6917
epoch:20 loss:3.6881
epoch:20 loss:3.6903
epoch:20 loss:3.6893
epoch:20 loss:3.6838
epoch:20 loss:3.6909
epoch:20 loss:3.6903
epoch:20 loss:3.6869
epoch:20 loss:3.6871
epoch:20 loss:3.6939
epoch:20 loss:3.6909
epoch:20 loss:3.6971
epoch:20 loss:3.6935
epoch:20 loss:3.6875
epoch:20 loss:3.6901
epoch:20 loss:3.6864
epoch:20 loss:3.6891
epoch:20 loss:3.6912
epoch:20 loss:3.6913
epoch:20 loss:3.6845
epoch:20 loss:3.6889
epoch:20 loss:3.6898
epoch:20 loss:3.6811
epoch:20 loss:3.6926
epoch:20 loss:3.6888
epoch:20 loss:3.6993
epoch:20 loss:3.6898
epoch:20 loss:3.6947
epoch:20 loss:3.6931
epoch:20 loss:3.6951
epoch:20 loss:3.6901
epoch:20 loss:3.6877
epoch:20 loss:3.6880
epoch:20 loss:3.6926
epoch:20 loss:3.6864
epoch:20 loss:3.6910
epoch:20 loss:3.6951
plt.plot(range(len(loss_hist)), loss_hist) # 绘制损失值曲线
plt.show()
使用BatchNorm1d归一化优化
# 多层神经网络模型
model2 = nn.Sequential(nn.Linear(4096, 8192),nn.BatchNorm1d(8192),nn.ReLU(),nn.Dropout(),nn.Linear(8192, 16384),nn.BatchNorm1d(16384), # 批归一化nn.ReLU(),nn.Dropout(),nn.Linear(16384, 1024),nn.BatchNorm1d(1024),nn.ReLU(),nn.Dropout(),nn.Linear(1024, 40)
).to(device) # 模型结构搬到GPU内存中
print(model2)
Sequential((0): Linear(in_features=4096, out_features=8192, bias=True)(1): BatchNorm1d(8192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(2): ReLU()(3): Dropout(p=0.5, inplace=False)(4): Linear(in_features=8192, out_features=16384, bias=True)(5): BatchNorm1d(16384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(6): ReLU()(7): Dropout(p=0.5, inplace=False)(8): Linear(in_features=16384, out_features=1024, bias=True)(9): BatchNorm1d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(10): ReLU()(11): Dropout(p=0.5, inplace=False)(12): Linear(in_features=1024, out_features=40, bias=True)
)
criterion2 = nn.CrossEntropyLoss() # 损失函数为交叉熵损失
optimizer2 = torch.optim.Adam(model2.parameters(), lr=1e-3) # 优化器为Adam,学习率为1e-3
loss_hist2 = []
model2.train()
for i in range(20):for img,lbl in dataloader:img,lbl = img.to(device), lbl.to(device) # 数据和模型在同一个设备端result = model2(img)loss = criterion2(result, lbl)loss.backward()optimizer2.step()optimizer2.zero_grad()loss_hist2.append(loss.item())print(f'epoch:{i+1} loss:{loss.item():.4f}')
epoch:1 loss:3.5798
epoch:1 loss:3.2452
epoch:1 loss:3.5353
epoch:1 loss:4.1675
epoch:1 loss:4.0728
epoch:1 loss:3.4937
epoch:1 loss:3.9814
epoch:1 loss:3.6151
epoch:1 loss:3.5217
epoch:1 loss:3.1017
epoch:1 loss:3.4522
epoch:1 loss:4.8181
epoch:1 loss:4.0231
epoch:1 loss:4.3008
epoch:1 loss:3.3741
epoch:1 loss:3.9258
epoch:1 loss:3.6895
epoch:1 loss:4.0020
epoch:1 loss:3.1241
epoch:1 loss:2.9453
epoch:1 loss:3.3162
epoch:1 loss:4.3189
epoch:1 loss:3.4162
epoch:1 loss:4.3958
epoch:1 loss:3.1572
epoch:1 loss:3.2535
epoch:1 loss:3.4887
epoch:1 loss:3.4771
epoch:1 loss:3.5689
epoch:1 loss:2.5994
epoch:1 loss:2.7629
epoch:1 loss:2.9798
epoch:1 loss:2.7517
epoch:1 loss:2.7871
epoch:1 loss:2.6800
epoch:1 loss:2.9784
epoch:1 loss:3.4050
epoch:1 loss:2.6510
epoch:1 loss:3.5258
epoch:1 loss:4.0064
epoch:2 loss:2.8011
epoch:2 loss:2.5357
epoch:2 loss:2.6513
epoch:2 loss:2.5815
epoch:2 loss:2.0862
epoch:2 loss:2.9170
epoch:2 loss:2.5202。。。。。。
epoch:20 loss:0.0768
epoch:20 loss:0.0592
epoch:20 loss:0.4393
epoch:20 loss:0.2460
epoch:20 loss:0.1196
epoch:20 loss:0.0596
epoch:20 loss:0.0088
epoch:20 loss:0.1478
epoch:20 loss:0.0671
epoch:20 loss:0.1121
epoch:20 loss:0.1161
epoch:20 loss:0.0191
epoch:20 loss:0.1365
epoch:20 loss:0.0635
epoch:20 loss:0.0404
epoch:20 loss:0.0673
epoch:20 loss:0.0122
epoch:20 loss:0.6775
epoch:20 loss:0.0122
epoch:20 loss:0.0137
epoch:20 loss:0.0415
epoch:20 loss:0.1397
epoch:20 loss:0.0244
epoch:20 loss:0.2535
epoch:20 loss:0.3182
epoch:20 loss:0.2677
epoch:20 loss:0.0028
epoch:20 loss:0.0185
epoch:20 loss:0.1291
epoch:20 loss:0.0514
epoch:20 loss:0.0539
epoch:20 loss:0.0254
epoch:20 loss:0.0723
epoch:20 loss:0.4357
epoch:20 loss:0.1185
epoch:20 loss:0.0806
epoch:20 loss:0.7051
epoch:20 loss:0.0060
epoch:20 loss:0.0527
epoch:20 loss:0.0121
plt.plot(range(len(loss_hist2)), loss_hist2)
plt.show()
本实验主要内容和结论总结如下:
-
数据集
使用了sklearn.datasets
中的Olivetti人脸数据集,包含400张人脸图片,每张图片为64x64像素,分为40类。 -
数据处理
- 图像数据被扁平化为4096维向量。
- 使用PyTorch的
DataLoader
进行批量加载。
-
模型设计与优化
- 基础模型:多层全连接神经网络,使用ReLU激活和Dropout正则化。
- 优化模型:在基础模型的每一层后增加了
BatchNorm1d
批归一化层,进一步提升训练稳定性和收敛速度。
-
训练过程
- 均采用交叉熵损失函数和Adam优化器,训练20个epoch。
- 记录并可视化loss变化曲线。
结果对比与观察
- Dropout正则化:有效缓解过拟合,loss曲线整体下降,但可能波动较大。
- BatchNorm归一化+Dropout:loss下降更快更平滑,模型收敛速度提升,训练更稳定。
结论
- 结合归一化(BatchNorm)和正则化(Dropout)可以显著提升神经网络的训练效果和泛化能力。
- 归一化有助于加速收敛,正则化有助于防止过拟合,两者结合效果更佳。
相关文章:

[神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果
结合归一化和正则化来优化网络模型结构,观察对比loss结果 搭建的神经网络,使用olivettiface数据集进行训练,结合归一化和正则化来优化网络模型结构,观察对比loss结果 from sklearn.datasets import fetch_olivetti_faces #倒入数…...
小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战
一、文章标题 小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战 二、文章标签 Java面试, 智能家装, 微服务架构, 高并发设计, JVM调优, SpringCloud, 消息队列, 分布式缓存, 架构设计, 面试技巧 三、文章概述 本文模拟了程序员小明应聘智能家装平台后端架构师的5轮…...
n8n:技术团队的智能工作流自动化助手
在当前数字化时代,自动化已经成为提高效率和减轻人工工作负担的一大推动力。今天,我们要为大家介绍一款极具潜力的开源项目——n8n,它不仅拥有广泛的应用场景,还具备内置AI功能,能够完全满足技术团队的高效工作需求。n8n的出现,为技术团队提供了自由编程与快速自动化构建…...
Flink 核心机制与源码剖析系列
Flink 核心机制与源码剖析系列 目录 第一篇:Flink 状态管理原理与源码深度剖析第二篇:水位线、事件时间与定时器源码全流程第三篇:Flink CEP 模式建模与高效事件匹配机制 第一篇:Flink 状态管理原理与源码深度剖析 1. 背景与意…...

华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机
5月21日,信创论坛于上海漕河泾会议中心举办。本次论坛以“聚力融合,繁荣生态”为主题,话题聚焦工业制造、交通运输、金融、教育、医疗等领域。华院计算技术(上海)股份有限公司(以下简称“华院计算”&#x…...

华为OD机试真题——会议接待 /代表团坐车(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《会议…...

LabVIEW Val (Sgnl) 属性
在 LabVIEW 事件驱动架构中,Val (Sgnl) 属性(Value (Signaling))是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同,Val (Sgnl) 在修改控件值的同时强制生成值改变事件,确保程序逻辑与 UI 交互保持…...

STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联
目录 一、STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联1 TIM1 高级定时器发波1.1 stm32cubemx配置 2 TIM1 ADC COMP DAC级联2.1 stm32cubemx配置 附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^) 一、STM32G4 电机外设篇(三&…...

DAY 35 超大力王爱学Python
知识点回顾: 三种不同的模型可视化方法:推荐torchinfo打印summary权重分布可视化进度条功能:手动和自动写法,让打印结果更加美观推理的写法:评估模式 作业:调整模型定义时的超参数,对比下效果。…...

【数据结构】图的存储(十字链表)
弧节点 tailvex数据域:存储弧尾一端顶点在顺序表中的位置下标;headvex 数据域:存储弧头一端顶点在顺序表中的位置下标;hlink 指针域:指向下一个以当前顶点作为弧头的弧;tlink 指针域:指向下一个…...
005 flutter基础,初始文件讲解(4)
书接上回,今天继续完成最后的讲解: class _MyHomePageState extends State<MyHomePage> {int _counter 0;void _incrementCounter() {setState(() {_counter;});}可以看到,这里的_MyHomePageState是一个类,继承于 State&l…...

Redis最佳实践——秒杀系统设计详解
基于Redis的高并发秒杀系统设计(十万级QPS) 一、秒杀系统核心挑战 瞬时流量洪峰:100万 QPS请求冲击库存超卖风险:精准扣减防止超卖系统高可用性:99.99%服务可用性要求数据强一致性:库存/订单/支付状态同步…...

STM32软件spi和硬件spi
核心观点 本文主要介绍了SPI通信的两种实现方式:软件SPI和硬件SPI。详细阐述了SPI通信协议的基本概念、硬件电路连接方式、移位示意图、时序基本单元以及四种工作模式。同时,对W25Q64模块进行了详细介绍,包括其硬件电路、框图以及操作注意事…...
MATLAB实战:人脸检测与识别实现方案
我们要用电脑识别照片或视频中的人脸,并知道是谁的脸。就像手机相册能自动识别照片里的人是谁一样。 🔍 人脸检测(找脸) 目标:在图片中找到人脸的位置 怎么做: 用MATLAB的"人脸扫描仪"ÿ…...

深度刨析树结构(从入门到入土讲解AVL树及红黑树的奥秘)
目录 树的表示 二叉树的概念及结构(重点学习) 概念 : 特点: 树与非树 特殊的二叉树 二叉树的性质(重点) 二叉树的存储结构 堆的概念及结构 建堆方式: 向下调整算法 向上调整算法 建堆第一步初始化 建…...

【Linux】shell的条件判断
目录 一.使用逻辑运算符判定命令执行结果 二.条件判断方法 三.判断表达式 3.1文件判断表达式 3.2字符串测试表达式 3.3整数测试表达式 3.4逻辑操作符 一.使用逻辑运算符判定命令执行结果 && 在命令执行后如果没有任何报错时会执行符号后面的动作|| 在命令执行后…...

第九天:java注解
注解 1 什么是注解(Annotation) public class Test01 extends Object{//Override重写的注解Overridepublic String toString() {return "Test01{}";} }2 内置注解 2.1 Override Override重写的注解 Override public String toString() {ret…...

十一、【核心功能篇】测试用例管理:设计用例新增编辑界面
【核心功能篇】测试用例管理:设计用例新增&编辑界面 前言准备工作第一步:创建测试用例相关的 API 服务 (src/api/testcase.ts)第二步:创建测试用例编辑页面组件 (src/views/testcase/TestCaseEditView.vue)第三步:配置测试用例…...
react-native的token认证流程
在 React Native 中实现 Token 认证是移动应用开发中的常见需求,它用于验证用户的身份并授权其访问受保护的 API 资源。 Token 认证的核心流程: 用户登录 (Login): 用户在前端输入用户名和密码。前端将这些凭据发送到后端 API。后端验证凭据。如果验证成…...
ERP系统中商品定价功能设计:支持渠道、会员与批发场景的灵活定价机制
在现代零售、批发与电商环境下,商品的定价策略日益复杂。一个优秀的ERP系统不仅需要管理商品基础信息、库存与订单,还必须提供一套灵活且可扩展的商品定价机制,以满足: 不同销售渠道(如线上平台、线下门店、分销商&…...

Spring是如何实现属性占位符解析
Spring属性占位符解析 核心实现思路1️⃣ 定义占位符处理器类2️⃣ 处理 BeanDefinition 中的属性3️⃣ 替换具体的占位符4️⃣ 加载配置文件5️⃣ Getter / Setter 方法 源码见:mini-spring 在使用 Spring 框架开发过程中,为了实现配置的灵活性…...
数据结构之ArrayList
系列文章目录 目录 系列文章目录 前言 一、数据结构的前置语法 1. 时空复杂度 2. 包装类 3. 泛型 二、ArrayList 和顺序表 1. 顺序表的模拟实现 2. 源码 3. ArrayList 的优缺点 前言 本文介绍数据结构的前置算法,以及 ArrayList 的模拟实现,部…...

DDR4读写压力测试
1.1测试环境 1.1.1整体环境介绍 板卡: pcie-403板卡 主控芯片: Xilinx xcvu13p-fhgb2104-2 调试软件: Vivado 2018.3 代码环境: Vscode utf-8 测试工程: pcie403_user_top 1.1.2硬件介绍 UD PCIe-403…...
uniapp 开发企业微信小程序时,如何在当前页面真正销毁前或者关闭小程序前调用一个api接口
在 UniApp 开发企业微信小程序时,若需在页面销毁或小程序关闭前调用 API 接口,需结合页面生命周期和应用生命周期实现。以下是具体实现方案及注意事项: 一、在页面销毁前调用 API(页面级) 通过页面生命周期钩子 onUnl…...
WPF 按钮点击音效实现
WPF 按钮点击音效实现 下面我将为您提供一个完整的 WPF 按钮点击音效实现方案,包含多种实现方式和高级功能: 完整实现方案 MainWindow.xaml <Window x:Class"ButtonClickSound.MainWindow"xmlns"http://schemas.microsoft.com/win…...

编写测试用例
测试用例(Test Case)是用于测试系统的要素集合 目录 编写测试用例作用 编写测试用例要包含七大元素 测试用例的设计方法 1、等价类法 2、边界值法 3、正交表法 4、判定表法 5、错误推测法 6、场景法 编写测试用例作用 1、确保功能全面覆盖…...
解释程序(Python)不需要生成机器码 逐行解析 逐行执行
在计算机组成原理中,解释程序(Interpreter)通常不会生成独立的机器码,但具体情况取决于解释器的实现方式。以下是详细分析: 1. 传统解释程序:不生成机器码 直接逐行执行: 经典的解释器ÿ…...

每日Prompt:隐形人
提示词 黑色棒球帽,白色抹胸、粉色低腰短裙、白色襪子,黑色鞋子,粉紅色背包,衣服悬浮在空中呈现动态姿势,虚幻引擎渲染风格,高清晰游戏CG质感,户外山林背景,画面聚焦在漂浮的衣服上…...

TensorFlow深度学习实战(19)——受限玻尔兹曼机
TensorFlow深度学习实战(19)——受限玻尔兹曼机 0. 前言1. 受限玻尔兹曼机1.1 受限玻尔兹曼机架构1.2 受限玻尔兹曼机的数学原理 2. 使用受限玻尔兹曼机重建图像3. 深度信念网络小结系列链接 0. 前言 受限玻尔兹曼机 (Restricted Boltzmann Machine, RB…...

告别手动绘图!基于AI的Smart Mermaid自动可视化图表工具搭建与使用指南
以下是对Smart Mermaid的简单介绍: 一款基于 AI 技术的 Web 应用程序,可将文本内容智能转换为 Mermaid 格式的代码,并将其渲染成可视化图表可以智能制作流程图、序列图、甘特图、状态图等等,并且支持在线调整、图片导出可以Docke…...