[神經網絡]使用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)可以顯著提升神經網絡的訓練效果和泛化能力。
  • 歸一化有助于加速收斂,正則化有助于防止過擬合,兩者結合效果更佳。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82639.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82639.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法分析·回溯法

回溯法 方法概述算法框架問題實例TSP 問題n皇后問題 回溯法效率分析 方法概述 回溯法是一個既帶有系統性又帶有跳躍性的搜索算法; **系統性:**它在包含問題的所有解的解空間樹中,按照深度優先的策略,從根結點出發搜索解空間樹。…

Golang分布式系統開發實踐指南

Golang分布式系統開發實踐指南 一、為什么選擇Golang? ?原生并發模型? Goroutine和Channel機制天然適合分布式系統的并發需求?高性能編譯? 靜態編譯生成二進制文件,部署簡單,內存占用低?豐富生態? Go Module管理、標準庫支持HTTP/2、…

基于stm32風速風向溫濕度和瓦斯檢測(仿真+代碼)

資料下載地址:基于stm32風速風向溫濕度和瓦斯檢測 一、項目功能 1.風速,風向,溫濕度,瓦斯,報警。 2.可以設置溫濕度,瓦斯,風速報警閾值。 3.數據上傳到云平臺。 二、仿真圖 三、程序 #inc…

桃黑黑反斗戰

1.編寫求解Hanoi漢諾塔的遞歸算法代碼&#xff0c;輸出移動過程&#xff0c;并統計總移動次數。 對不同規模的漢諾塔&#xff0c;給出測試的結果 #include <stdio.h> #include <time.h> int moveCount 0; void hanoi(int n,char source,char auxiliary,char targ…

react-native的token認證流程

在 React Native 中實現 Token 認證是移動應用開發中的常見需求&#xff0c;它用于驗證用戶的身份并授權其訪問受保護的 API 資源。 Token 認證的核心流程&#xff1a; 用戶登錄 (Login): 用戶在前端輸入用戶名和密碼。前端將這些憑據發送到后端 API。后端驗證憑據。如果驗證成…

Dify:詳解 docker-compose.yaml配置文件

詳解 docker-compose.yaml 配置文件 docker-compose.yaml 是用于定義和運行多容器 Docker 應用的配置文件。下面&#xff0c;我們將詳細解釋您提供的 docker-compose.yaml 文件&#xff0c;包括各個服務的作用、配置&#xff0c;以及它們與 .env 文件之間的關系。 文件概覽 自…

Python基于Django的主觀題自動閱卷系統【附源碼、文檔說明】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

今日行情明日機會——20250528

上證指數縮量收小陰線&#xff0c;個股跌多漲少&#xff0c;總體情緒偏差&#xff0c;注意風險為主。 深證指數&#xff0c;縮量收小陰線&#xff0c;連續5天陰線&#xff0c;明后天反彈的概率增大&#xff0c;但仍要注意風險。 2025年5月28日漲停股主要行業方向分析 1. 無人…

基于stm32LORA無線抄表系統仿真

資料下載地址&#xff1a;基于stm32LORA無線抄表系統仿真 1、項目介紹 基于LoRa的無線通信的電力抄表系統&#xff0c;采集節點數據&#xff0c;通過LoRa無線通信進行數據傳輸&#xff0c;最后再網關節點上顯示。 2、仿真圖 3、仿真代碼 #include "oled.h" #incl…

不同電腦同一個網絡ip地址一樣嗎

不同電腦在連接同一個WiFi時&#xff0c;它們的IP地址會相同嗎&#xff1f;相信不少朋友都對這個問題感到好奇&#xff0c;今天我們就來詳細探討一下。 一、基礎概念&#xff1a;IP地址的本質與分類 IP地址是分配給網絡設備的唯一標識符&#xff0c;用于在互聯網或局域網中定位…

CentOS 7 下 Redis 從 5.0 升級至 7.4.3 全流程實踐

目錄 前言1 查看 Redis 運行情況與配置1.1 查看 Redis 是否正在運行1.2 連接 Redis 服務并獲取配置信息1.3 查找 redis.conf 配置文件位置 2 關閉舊版本 Redis 實例2.1 使用客戶端命令關閉 Redis2.2 驗證 Redis 是否完全關閉 3 升級 GCC 編譯環境3.1 檢查當前 GCC 版本3.2 安裝…

SQLord: 基于反向數據生成和任務拆解的 Text-to-SQL 企業落地方案

曾在Text-to-SQL方向做過深入的研究&#xff0c;以此為基礎研發的DataAgent在B2B平臺成功落地&#xff0c;因此作為第一作者&#xff0c;在 The Web Conference (WWW’2025, CCF-A) 會議上發表了相關論文&#xff1a; SQLord: A Robust Enterprise Text-to-SQL Solution via R…

內網搭建NTS服務器

內網搭建NTS服務器 關鍵字 : ntp nts ipv6 NTS 是 Network Time Security&#xff08;網絡時間安全&#xff09;的縮寫,是 NTP 的一種安全擴展機制。它利用傳輸層安全&#xff08;TLS&#xff09;和相關數據的認證加密&#xff08;AEAD&#xff09;&#xff0c;為 NTP 的客戶…

AD9268、AD9643調試過程中遇到的問題

Ad9268芯片 AD9268是一款雙通道、16位、80 MSPS/105 MSPS/125 MSPS模數轉換器(ADC)。AD9268旨在支持要求高性能、低成本、小尺寸和多功能的通信應用。雙通道ADC內核采用多級差分流水線架構&#xff0c;集成輸出糾錯邏輯。每個ADC都具有寬帶寬、差分采樣保持模擬輸入放大器&…

用豆包寫單元測試

用豆包寫單元測試&#xff0c; 輸入 vue 模板內容&#xff0c;輸入 參考vue模板內容寫一個單元測試要求用jest.mock實現構造完成&#xff0c;修復bug。npm run test:unit – tests/unit/views/xxx/xxx.spec.js看下 % Stmts 語句覆蓋率&#xff1a;執行到的代碼語句占總語句的比…

css樣式塊重復調用

通譯靈碼解釋。還給了一些示例&#xff0c;包含傳參等內容 scss和sass的區別。scss與sass是兩種樣式編寫風格&#xff0c;scss是大括號加;號形式。而sass是縮進的格式使用scss為什么要要安裝sass呢。sass是一門css預處理器語言。所以要安裝。

【深度學習新浪潮】以圖搜地點是如何實現的?(含大模型方案)

1. 以圖搜地點的實現方式有哪些? 掃描手機照片中的截圖并識別出位置信息,主要有以下幾種實現方式: 通過照片元數據獲取: 原理:現代智能手機拍攝的照片通常會包含Exif(Exchangeable Image File)元數據。Exif中除了有像素信息之外,還包含了光圈、快門、白平衡、ISO、焦距…

DeepSeek R1 與 V3 的全面對比,兩個版本有什么差別?

DeepSeek R1與DeepSeek V3是深度求索&#xff08;DeepSeek&#xff09;公司推出的兩款定位不同的大語言模型&#xff0c;界面上用戶可選擇基礎模型(V3)、深度思考(R1)、聯網搜索。 基礎模型(V3)是DeepSeek的標配,沒有勾選默認就是基礎模型。為了讓用戶更清晰地了解兩款模型的差…

Spring Boot 深度集成 Ollama 指南:從聊天模型配置到生產級應用開發

Spring Boot 深度集成 Ollama 指南&#xff1a;從聊天模型配置到生產級應用開發 前言 在人工智能應用開發中&#xff0c;大語言模型&#xff08;LLM&#xff09;的本地化部署需求日益增長。Ollama 作為開源的本地LLM運行平臺&#xff0c;支持Mistral、LLaMA等主流模型&#x…

查詢oracle進程數和會話數進行優化

查看當前參數配置 首先需要查詢當前的 processes 和 sessions 參數值&#xff0c;以確定是否需要調整。 SQL SHOW PARAMETER processes; SHOW PARAMETER sessions; 這些命令可以顯示當前實例中允許的最大進程數和會話數 查詢當前連接數&#xff0c;查詢并發會話 SELECT COUNT…