当前位置: 首页 > article >正文

[神经网络]使用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()

在这里插入图片描述

本实验主要内容和结论总结如下:

  1. 数据集
    使用了sklearn.datasets中的Olivetti人脸数据集,包含400张人脸图片,每张图片为64x64像素,分为40类。

  2. 数据处理

    • 图像数据被扁平化为4096维向量。
    • 使用PyTorch的DataLoader进行批量加载。
  3. 模型设计与优化

    • 基础模型:多层全连接神经网络,使用ReLU激活和Dropout正则化。
    • 优化模型:在基础模型的每一层后增加了BatchNorm1d批归一化层,进一步提升训练稳定性和收敛速度。
  4. 训练过程

    • 均采用交叉熵损失函数和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)

书接上回&#xff0c;今天继续完成最后的讲解&#xff1a; class _MyHomePageState extends State<MyHomePage> {int _counter 0;void _incrementCounter() {setState(() {_counter;});}可以看到&#xff0c;这里的_MyHomePageState是一个类&#xff0c;继承于 State&l…...

Redis最佳实践——秒杀系统设计详解

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

STM32软件spi和硬件spi

核心观点 本文主要介绍了SPI通信的两种实现方式&#xff1a;软件SPI和硬件SPI。详细阐述了SPI通信协议的基本概念、硬件电路连接方式、移位示意图、时序基本单元以及四种工作模式。同时&#xff0c;对W25Q64模块进行了详细介绍&#xff0c;包括其硬件电路、框图以及操作注意事…...

MATLAB实战:人脸检测与识别实现方案

我们要用电脑识别照片或视频中的人脸&#xff0c;并知道是谁的脸。就像手机相册能自动识别照片里的人是谁一样。 &#x1f50d; 人脸检测&#xff08;找脸&#xff09; 目标&#xff1a;在图片中找到人脸的位置 怎么做&#xff1a; 用MATLAB的"人脸扫描仪"&#xff…...

深度刨析树结构(从入门到入土讲解AVL树及红黑树的奥秘)

目录 树的表示 二叉树的概念及结构&#xff08;重点学习&#xff09; 概念 &#xff1a; 特点&#xff1a; 树与非树 特殊的二叉树 二叉树的性质(重点) 二叉树的存储结构 堆的概念及结构 建堆方式&#xff1a; 向下调整算法 向上调整算法 建堆第一步初始化 建…...

【Linux】shell的条件判断

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

第九天:java注解

注解 1 什么是注解&#xff08;Annotation&#xff09; public class Test01 extends Object{//Override重写的注解Overridepublic String toString() {return "Test01{}";} }2 内置注解 2.1 Override Override重写的注解 Override public String toString() {ret…...

十一、【核心功能篇】测试用例管理:设计用例新增编辑界面

【核心功能篇】测试用例管理&#xff1a;设计用例新增&编辑界面 前言准备工作第一步&#xff1a;创建测试用例相关的 API 服务 (src/api/testcase.ts)第二步&#xff1a;创建测试用例编辑页面组件 (src/views/testcase/TestCaseEditView.vue)第三步&#xff1a;配置测试用例…...

react-native的token认证流程

在 React Native 中实现 Token 认证是移动应用开发中的常见需求&#xff0c;它用于验证用户的身份并授权其访问受保护的 API 资源。 Token 认证的核心流程&#xff1a; 用户登录 (Login): 用户在前端输入用户名和密码。前端将这些凭据发送到后端 API。后端验证凭据。如果验证成…...

ERP系统中商品定价功能设计:支持渠道、会员与批发场景的灵活定价机制

在现代零售、批发与电商环境下&#xff0c;商品的定价策略日益复杂。一个优秀的ERP系统不仅需要管理商品基础信息、库存与订单&#xff0c;还必须提供一套灵活且可扩展的商品定价机制&#xff0c;以满足&#xff1a; 不同销售渠道&#xff08;如线上平台、线下门店、分销商&…...

Spring是如何实现属性占位符解析

Spring属性占位符解析 核心实现思路1️⃣ 定义占位符处理器类2️⃣ 处理 BeanDefinition 中的属性3️⃣ 替换具体的占位符4️⃣ 加载配置文件5️⃣ Getter / Setter 方法 源码见&#xff1a;mini-spring 在使用 Spring 框架开发过程中&#xff0c;为了实现配置的灵活性&#xf…...

数据结构之ArrayList

系列文章目录 目录 系列文章目录 前言 一、数据结构的前置语法 1. 时空复杂度 2. 包装类 3. 泛型 二、ArrayList 和顺序表 1. 顺序表的模拟实现 2. 源码 3. ArrayList 的优缺点 前言 本文介绍数据结构的前置算法&#xff0c;以及 ArrayList 的模拟实现&#xff0c;部…...

DDR4读写压力测试

1.1测试环境 1.1.1整体环境介绍 板卡&#xff1a; pcie-403板卡 主控芯片&#xff1a; Xilinx xcvu13p-fhgb2104-2 调试软件&#xff1a; Vivado 2018.3 代码环境&#xff1a; Vscode utf-8 测试工程&#xff1a; pcie403_user_top 1.1.2硬件介绍 UD PCIe-403…...

uniapp 开发企业微信小程序时,如何在当前页面真正销毁前或者关闭小程序前调用一个api接口

在 UniApp 开发企业微信小程序时&#xff0c;若需在页面销毁或小程序关闭前调用 API 接口&#xff0c;需结合页面生命周期和应用生命周期实现。以下是具体实现方案及注意事项&#xff1a; 一、在页面销毁前调用 API&#xff08;页面级&#xff09; 通过页面生命周期钩子 onUnl…...

WPF 按钮点击音效实现

WPF 按钮点击音效实现 下面我将为您提供一个完整的 WPF 按钮点击音效实现方案&#xff0c;包含多种实现方式和高级功能&#xff1a; 完整实现方案 MainWindow.xaml <Window x:Class"ButtonClickSound.MainWindow"xmlns"http://schemas.microsoft.com/win…...

编写测试用例

测试用例&#xff08;Test Case&#xff09;是用于测试系统的要素集合 目录 编写测试用例作用 编写测试用例要包含七大元素 测试用例的设计方法 1、等价类法 2、边界值法 3、正交表法 4、判定表法 5、错误推测法 6、场景法 编写测试用例作用 1、确保功能全面覆盖…...

解释程序(Python)不需要生成机器码 逐行解析 逐行执行

在计算机组成原理中&#xff0c;解释程序&#xff08;Interpreter&#xff09;通常不会生成独立的机器码&#xff0c;但具体情况取决于解释器的实现方式。以下是详细分析&#xff1a; 1. 传统解释程序&#xff1a;不生成机器码 直接逐行执行&#xff1a; 经典的解释器&#xff…...

每日Prompt:隐形人

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

TensorFlow深度学习实战(19)——受限玻尔兹曼机

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

告别手动绘图!基于AI的Smart Mermaid自动可视化图表工具搭建与使用指南

以下是对Smart Mermaid的简单介绍&#xff1a; 一款基于 AI 技术的 Web 应用程序&#xff0c;可将文本内容智能转换为 Mermaid 格式的代码&#xff0c;并将其渲染成可视化图表可以智能制作流程图、序列图、甘特图、状态图等等&#xff0c;并且支持在线调整、图片导出可以Docke…...