cnn中池化層作用

一、池化層概述

在卷積神經網絡中,池化層是核心組件之一,主要作用是逐步降低特征圖的空間尺寸即寬和高,從而減少計算量、控制過擬合并增強模型的魯棒性。

核心作用

  1. 降維與減少計算量
    壓縮特征圖的尺寸,顯著減少后續層的參數數量和計算負擔。
  2. 引入平移不變性
    對微小位置變化不敏感。如輸入圖像中目標物體稍微移動后,池化層仍能提取相同特征。
  3. 抑制噪聲與保留主要特征
    通過取局部區域的最大值或平均值,保留顯著特征并過濾細節噪聲。
  4. 擴大感受野
    使后續層能融合更廣闊區域的上下文信息。

1. 最大池化

原理:取滑動窗口內的最大值。
例子:對 4×4 特征圖進行 2×2 窗口 + 步長2 的最大池化:

可以使用torch.nn.MaxPool2d構造最大池化層:

maxpool_layer = torch.nn.MaxPool2d(kernel_size, # 池化窗口的大小stride=None, # 池化操作的步長,默認等于窗口大小padding=0,   # 零像素的邊緣填充數量dilation=1,  # 擴張元素的數量return_indices=False, # 返回池化取值的索引,并通過nn.MaxUnpool2d()進行反池化ceil_mode=False # 在輸出尺寸中是否使用向上取整代替向下取整)
輸入特征圖(4×4):
[[1, 2, 5, 3],[4, 9, 6, 8],[7, 1, 4, 2],[3, 5, 2, 6]]池化操作:
| 1  2 | 5  3 |   → 取 max(1,2,4,9)=9    | 取 max(5,3,6,8)=8
| 4  9 | 6  8 |
-------------------
| 7  1 | 4  2 |   → 取 max(7,1,3,5)=7    | 取 max(4,2,2,6)=6
| 3  5 | 2  6 |輸出特征圖(2×2):
[[9, 8],[7, 6]]

效果:保留邊緣、紋理等顯著特征。


2. 平均池化

原理:取滑動窗口內的平均值。
例子:相同輸入,進行 2×2 平均池化:

可以使用torch.nn.AvgPool2d構造平均池化層:

avgpool_layer = torch.nn.AvgPool2d(kernel_size, # 池化窗口的大小stride=None, # 池化操作的步長,默認等于窗口大小padding=0,   # 零像素的邊緣填充數量ceil_mode=False # 在輸出尺寸中是否使用向上取整代替向下取整count_include_pad=True, # 計算均值時是否考慮填充像素divisor_override=None # 若指定將用作平均操作中的除數)
| 1  2 | 5  3 |   → 平均 = (1+2+4+9)/4 = 4   | (5+3+6+8)/4 = 5.5
| 4  9 | 6  8 |
-------------------
| 7  1 | 4  2 |   → 平均 = (7+1+3+5)/4 = 4   | (4+2+2+6)/4 = 3.5輸出特征圖(2×2):
[[4.0, 5.5],[4.0, 3.5]]

適用場景:全局信息平滑如圖像分類的背景區域。

應用:

  • 目標檢測:最大池化保留物體的關鍵特征如貓的耳朵,即使位置輕微變化仍能被識別。
  • 減少過擬合:通過降低特征圖尺寸,強制網絡學習更泛化的模式。
  • 加速訓練:減少全連接層的參數如將 200×200 特征圖池化為 100×100,后續計算量減少75%。

改進:

  • 趨勢:部分網絡(如ResNet)用步長>1的卷積層替代池化層,在降維的同時學習特征。
  • 全局平均池化(Global Average Pooling):將整個特征圖池化為一個值(替代全連接層),極大減少參數(如用于Inception、SqueezeNet)。

二、卷積層參數如何計算

2.1 參數數量計算

#例子
class CNN(nn.Module):def __init__(self, activation="relu"):super(CNN, self).__init__()self.activation = F.relu if activation == "relu" else F.selu#輸入通道數,圖片是灰度圖,所以是1,圖片是彩色圖,就是3,輸出通道數,就是卷積核的個數(32,1,28,28)self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1)#輸入x(32,32,28,28) 輸出x(32,32,28,28)self.conv2 = nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, padding=1)self.pool = nn.MaxPool2d(2, 2) #池化核大小為2(2*2),步長為2self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1)self.conv4 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1)self.conv5 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1)self.conv6 = nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, padding=1)self.pool2 = nn.MaxPool2d(2, 2)   #輸入(128,7,7) 輸出(128,3,3)self.flatten = nn.Flatten()# input shape is (28, 28, 1) so the fc1 layer in_features is 128 * 3 * 3self.fc1 = nn.Linear(128 * 3 * 3, 128)self.fc2 = nn.Linear(128, 10) #輸出尺寸(32,10)self.init_weights()
1. **卷積層 **

參數數量 = (in_channels × out_channels × kernel_height × kernel_width) + out_channels

  • 權重參數in_channels × out_channels × kernel_size2
  • 偏置參數out_channels(每個輸出通道一個偏置)
2. **全連接層 **

參數數量 = (in_features × out_features) + out_features

  • 權重參數in_features × out_features
  • 偏置參數out_features
3. 池化層/ Flatten 層

參數數量 = 0(無訓練參數)

以下是CNN模型中每一層的參數數量計算和輸出尺寸變化的詳細說明(輸入為 (batch_size, 1, 28, 28)):

  1. Conv1 層
  • 輸入尺寸(batch_size, 1, 28, 28)
  • 輸出尺寸(batch_size, 32, 28, 28)
    • Padding=1 保持空間尺寸不變((28 + 2 - 3)/1 + 1 = 28)。
  • 參數數量
    • 權重:1 × 32 × 3 × 3 = 288
    • 偏置:32
    • 總計:288 + 32 = 320
  1. Conv2 層
  • 輸入尺寸(batch_size, 32, 28, 28)
  • 輸出尺寸(batch_size, 32, 28, 28)
    • Padding=1 保持尺寸不變。
  • 參數數量
    • 權重:32 × 32 × 3 × 3 = 9,216
    • 偏置:32
    • 總計:9,216 + 32 = 9,248

  1. Pool 層(MaxPool2d, kernel=2, stride=2)
  • 輸入尺寸(batch_size, 32, 28, 28)
  • 輸出尺寸(batch_size, 32, 14, 14)
    • 下采樣公式:(28 - 2)/2 + 1 = 14
  • 參數數量0(池化層無參數)

  1. Conv3 層
  • 輸入尺寸(batch_size, 32, 14, 14)
  • 輸出尺寸(batch_size, 64, 14, 14)
    • Padding=1 保持尺寸不變。
  • 參數數量
    • 權重:32 × 64 × 3 × 3 = 18,432
    • 偏置:64
    • 總計:18,432 + 64 = 18,496

  1. Conv4 層
  • 輸入尺寸(batch_size, 64, 14, 14)
  • 輸出尺寸(batch_size, 64, 14, 14)
  • 參數數量
    • 權重:64 × 64 × 3 × 3 = 36,864
    • 偏置:64
    • 總計:36,864 + 64 = 36,928

  1. Pool 層(再次使用,kernel=2, stride=2)
  • 輸入尺寸(batch_size, 64, 14, 14)
  • 輸出尺寸(batch_size, 64, 7, 7)
    • 下采樣:(14 - 2)/2 + 1 = 7
  • 參數數量0

  1. Conv5 層
  • 輸入尺寸(batch_size, 64, 7, 7)
  • 輸出尺寸(batch_size, 128, 7, 7)
    • Padding=1 保持尺寸不變。
  • 參數數量
    • 權重:64 × 128 × 3 × 3 = 73,728
    • 偏置:128
    • 總計:73,728 + 128 = 73,856

  1. Conv6 層
  • 輸入尺寸(batch_size, 128, 7, 7)
  • 輸出尺寸(batch_size, 128, 7, 7)
  • 參數數量
    • 權重:128 × 128 × 3 × 3 = 147,456
    • 偏置:128
    • 總計:147,456 + 128 = 147,584

  1. Pool2 層(MaxPool2d, kernel=2, stride=2)
  • 輸入尺寸(batch_size, 128, 7, 7)
  • 輸出尺寸(batch_size, 128, 3, 3)
    • 下采樣:(7 - 2)/2 + 1 = 3(向下取整)。
  • 參數數量0

  1. Flatten 層
  • 輸入尺寸(batch_size, 128, 3, 3)
  • 輸出尺寸(batch_size, 128 × 3 × 3) = (batch_size, 1,152)
  • 參數數量0

  1. FC1 層(全連接層)
  • 輸入尺寸(batch_size, 1,152)
  • 輸出尺寸(batch_size, 128)
  • 參數數量
    • 權重:1,152 × 128 = 147,456
    • 偏置:128
    • 總計:147,456 + 128 = 147,584

  1. FC2 層(全連接層)
  • 輸入尺寸(batch_size, 128)
  • 輸出尺寸(batch_size, 10)
  • 參數數量
    • 權重:128 × 10 = 1,280
    • 偏置:10
    • 總計:1,280 + 10 = 1,290

完整計算流程(輸入 (1, 28, 28))

輸出尺寸參數計算參數數量
Conv1(32, 28, 28)(1×32×3×3) + 32320
Conv2(32, 28, 28)(32×32×3×3) + 329,248
Pool1(32, 14, 14)無參數0
Conv3(64, 14, 14)(32×64×3×3) + 6418,496
Conv4(64, 14, 14)(64×64×3×3) + 6436,928
Pool2(64, 7, 7)無參數0
Conv5(128, 7, 7)(64×128×3×3) + 12873,856
Conv6(128, 7, 7)(128×128×3×3) + 128147,584
Pool3(128, 3, 3)無參數0
Flatten(1152,)無參數0
FC1(128,)(1152×128) + 128147,584
FC2(10,)(128×10) + 101,290
總計--435,306

2.2 每層輸出尺寸變換原理

卷積輸出尺寸公式:

假設輸入尺寸為 Hin×Win

卷積核尺寸 K,步長 S,填充 P,輸出尺寸 Hout×Wout 為:
Hout=?Hin+2P?KS?+1 Hout= \left\lfloor \frac{H_{in} + 2P - K}{S} \right\rfloor + 1 Hout=?SHin?+2P?K??+1

Wout=?Win+2P?KS?+1 Wout=\left\lfloor \frac{W_{in} + 2P - K}{S} \right\rfloor + 1 Wout=?SWin?+2P?K??+1

默認設置(最常見):

  • kernel_size = 3
  • stride = 1
  • padding = 1
    則:

Hout=Hin,Wout=WinH

尺寸不變

當卷積核尺寸 K=2,步長 S=2.填充 P=1時

這個操作會讓圖像尺寸縮小一半:

簡化為:
Hout=?HinS? Hout= \left\lfloor \frac{H_{in} }{S} \right\rfloor Hout=?SHin???
例如:

  • 輸入 28×2814×14
  • 輸入 14×147×7
  • 輸入 7×73×3

Flatten 展平層

將形如 (batch_size, C, H, W) 的張量展平成 (batch_size, C × H × W),準備送入全連接層。

總結

輸入尺寸操作輸出尺寸說明
conv11×28×28Conv2d(3, p=1)32×28×28尺寸不變,通道變為 32
conv232×28×28Conv2d(3, p=1)32×28×28尺寸不變
pool132×28×28MaxPool2d(2,2)32×14×14高寬縮小一半
conv332×14×14Conv2d(3, p=1)64×14×14通道增加
conv464×14×14Conv2d(3, p=1)64×14×14通道不變
pool264×14×14MaxPool2d(2,2)64×7×7再次縮小
conv564×7×7Conv2d(3, p=1)128×7×7通道增加
conv6128×7×7Conv2d(3, p=1)128×7×7通道不變
pool3128×7×7MaxPool2d(2,2)128×3×3尺寸變為最終
flatten128×3×3Flatten1152送入全連接層
fc11152Linear(1152→128)128隱藏層
fc2128Linear(128→10)10輸出分類結果

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

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

相關文章

寫一個音樂爬蟲

今天我們寫一個網易云音樂的爬蟲,爬取網易云音樂熱歌榜音樂鏈接并下載,這里用到了之前引用的BeautifulSoup和requests。 BeautifulSoup是一個Python庫,用于從HTML和XML文件中提取數據。它提供了一種簡單的方式來遍歷文檔樹和搜索文檔樹中的元…

戰斗公式和傷害走配置文件

故事背景,上次屬性計算用的配置,這次傷害計算也走配置,下面是測試代碼和測試數據local formulas {[100001]{id 100001,name "基礎傷害",formula "function (self,tag,ishit,iscritial,counterratio)\n if ishit1 then\n …

線性代數 上

文章目錄線性代數知識整理一、求行列式1、 套公式2、利用性質,化為可套公式3、抽象行列式4、抽象向量二、代數余子式的線性組合三、求AnA^nAn四、證明A可逆五、求A的逆1、定義法2、初等變換3、公式六、求秩七、線性表示的判定八、線性無關九、求極大線性無關組十、等…

紅帽AI推理服務器三大特點

生成式人工智能(Gen AI)的迅猛發展,對大型語言模型(LLM)的部署提出了更高的性能、靈活性和效率要求。無論部署在何種環境中,紅帽AI推理服務器都為用戶提供經過強化并獲得官方支持的vLLM發行版,配…

開始記錄一步步學習pcl

安裝參考,大神寫的非常詳細,一步到位 https://blog.csdn.net/qq_36812406/article/details/144307648?ops_request_misc%257B%2522request%255Fid%2522%253A%25220e215e6ac266b90ded12ed6b2eab1257%2522%252C%2522scm%2522%253A%252220140713.13010233…

Linux系統Centos7 安裝mysql5.7教程 和mysql的簡單指令

目錄 一. 安裝 MySQL 官方 Yum 倉庫 二. 安裝 MySQL 5.7 1.查看可用的mysql版本倉庫 2.啟用MySql5.7倉庫 3.禁用更高版本的倉庫(可選) 4.導入 MySQL GPG 公鑰 5.安裝MySql5.7 三. 啟動 MySQL 服務 1.啟動 MySQL 服務 2. 設置開機自啟 3.查看服…

嵌入式——C語言:指針③

一、函數指針和指針函數(一)指針函數:是函數,函數的返回值是指針1.不能返回局部變量的值2.指針函數返回的地址可以作為下一個函數調用的參數(二)函數指針:是指針,指針指向一個函數in…

OpenCV(05)直方圖均衡化,模板匹配,霍夫變換,圖像亮度變換,形態學變換

【OpenCV(01)】基本圖像操作、繪制,讀取視頻 【OpenCV(02)】圖像顏色處理,灰度化,二值化,仿射變換 【OpenCV(03)】插值方法,邊緣填充&#xff0…

常見的未授權訪問漏洞靶場-練習教程

一.Redis未授權訪問漏洞1.首先需要準備一個vps和vulhub靶場,然后進入目錄。命令:進入靶場目錄:cd /etc/vulhub-master/redis/4-unacc 啟動靶場:docker-compose up -d2.然后啟動我們kali,下載redis服務然后連接redis,并執行命令。…

EAP(基于事件的異步編程模式)

📜 1. 核心思想 📌 事件驅動解耦 異步操作通過事件通知結果,調用者無需阻塞線程,通過事件處理器響應操作完成、錯誤或取消。 📌 線程池與UI線程協同 耗時操作在后臺線程池執行,完成后通過 SynchronizationC…

【三橋君】如何解決后端Agent和前端UI之間的交互問題?——解析AG-UI協議的神奇作用

?你好,我是 ?三橋君? 📌本文介紹📌 >> 一、引言 在智能體(Agent)領域,MCP、A2A、ANP等協議已經規范了Agent與工具、Agent與Agent之間的通信,但Agent與用戶之間的交互一直缺乏標準化。…

面試官:詳細說說Kafka rebalance 的策略以及具體過程

hello啊,各位觀眾姥爺們!!!本baby今天又來報道了!哈哈哈哈哈嗝🐶 程序員各種工具大全 Kafka 的 Rebalance(再平衡) 是消費者組(Consumer Group)在消費者數量…

C++入門自學Day2-- c++類與對象(初識)

一、面向對象和面向過程1、什么是面向過程(Process-Oriented Programming, POP)📌 定義面向過程強調的是 過程(過程函數),即:按照步驟(流程)組織代碼。程序結構 數據結構…

DAO組織智能合約開發:從理論到實踐

目錄 DAO組織智能合約開發:從理論到實踐 1. DAO概述:去中心化自治組織 2. DAO核心組件設計 2.1 架構設計 2.2 關鍵智能合約 3. 治理代幣實現 3.1 ERC20擴展合約 4. 提案管理系統實現 4.1 提案狀態機 4.2 提案合約實現 5. DAO核心合約實現 5.1 DAO合約架構 5.2 提案類型擴展 6…

Ubuntu系統完整配置教程

Ubuntu系統完整配置教程 目錄 配置鏡像源安裝網絡服務虛擬機中安裝CUDAPython開發環境配置Java開發環境配置 1. 配置鏡像源 1.1 備份原始源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup1.2 編輯源文件 sudo nano /etc/apt/sources.list1.3 各大鏡像源…

【mysql慢查詢】

mysql慢查詢慢查詢慢查詢日志配置慢查詢 慢查詢是指執行時間超過指定閾值的SQL語句。在MySQL中,默認情況下執行時間超過10秒的查詢會被認為是慢查詢,但這個閾值可以根據需要進行調整。 慢查詢日志配置 -- 查看當前慢查詢配置 SHOW VARIABLES LIKE slo…

django 按照外鍵排序

在Django中,使用外鍵(ForeignKey)進行排序是一種常見的需求,特別是在處理數據庫關系時,如用戶和訂單之間的關系(一個用戶有多個訂單)。下面是如何在使用Django ORM時進行基于外鍵的排序。 定義模…

JAVA_EIGHTEEN_特殊文件

目錄 Properties屬性文件 XML的作用和應用場景 日志技術 Properties屬性文件 約束:只能是鍵值對 鍵不能重復 文件后綴一般是.properties結尾的 是一個Map集合(鍵值對集合) 核心作用:Properties是用來代表屬性文件的&#…

第二十二節 MATLAB轉置向量、MATLAB追加向量

MATLAB中轉置操作能夠將一個行向量改變成一個列向量,反之亦然。MATLAB中轉置操作使用一個單引號()來表示。詳細例子在MATLAB中建立一個腳本文件,輸入下述代碼:r [ 1 2 3 4 ]; tr r; v [1;2;3;4]; tv v; disp(tr); …

window顯示驅動開發—Direct3D 11 視頻設備驅動程序接口 (DDI)

這些設備驅動程序接口 (DDI) 是新的或針對Windows 8更新的:CalcPrivateCryptoSessionSizeCalcPrivateAuthenticatedChannelSizeCalcPrivateVideoDecoderOutputViewSizeCalcPrivateVideoDecoderSizeCalcPrivateVideoProcessorEnumSizeCalcPrivateVideoProcessorInput…