卷積神經網絡的參數量及尺度變化計算

文章目錄

  • 前言
  • 1.卷積
  • 2.參數量的計算
    • 2.1案例一
    • 2.2案例二
  • 3.奇怪的優化思想
    • 3.1使用小核卷積替換大核卷積
    • 3.2卷積核1×1的應用
  • 4.輸出圖像尺寸的計算
    • 4.1Same convolution
    • 4.2具體計算規則
    • 4.3轉置卷積
  • 小結

前言

本篇博客主要介紹卷積基本概念,卷積神經網絡的參數量計算、參數量優化的一些方法(VGG思想,1×1卷積核的應用)、輸出圖像尺寸的計算,同時也介紹了轉置卷積(反卷積)中該如何計算輸出圖像的尺寸大小。

1.卷積

在深度學習的世界里,卷積操作如同一位默默耕耘的幕后英雄,支撐起圖像識別、自然語言處理等眾多領域的技術突破。無論是識別交通標志的自動駕駛系統,還是能理解人類語言的智能助手,背后都離不開卷積操作的強大力量。那么,卷積操作究竟是什么?
從數學角度來看,卷積是一種數學運算,用于描述兩個函數如何通過某種方式相互作用,產生一個新的函數。在離散的數字信號處理場景下,卷積可以簡單理解為兩個序列通過特定的乘法和累加運算,得到一個新的序列,具體計算方式可以總結為8個字:翻褶、移位、相乘、相加,具體可見我之前博客的介紹卷積演示系統
而在計算機視覺領域,卷積與之類似,不同的是,處理的數據維度略有不同。
以3×3卷積核為例,其計算公式可以表示為;
g ( x , y ) = ∑ i = ? 1 1 ∑ j = ? 1 1 f ( x ? i ) ( x ? j ) ? w ( i , j ) g(x,y)=\sum_{i=-1}^{1}\sum_{j=-1}^{1}f(x-i)(x-j)*w(i,j) g(x,y)=i=?11?j=?11?f(x?i)(x?j)?w(i,j)
其中w(i,j)表示卷積核,f(x,y)輸入圖像,g(x,y)為輸出圖像。
由于在訓練過程中,學習的參數是w(i,j),因此加不加入翻褶區別并不大,因此在視覺領域一般不對卷積和進行翻褶操作。計算公式為:
g ( x , y ) = ∑ i = ? 1 1 ∑ j = ? 1 1 f ( x + i ) ( x + j ) ? w ( i , j ) g(x,y)=\sum_{i=-1}^{1}\sum_{j=-1}^{1}f(x+i)(x+j)*w(i,j) g(x,y)=i=?11?j=?11?f(x+i)(x+j)?w(i,j)
這一操作準確來說應該稱之為相關操作,但視覺領域一般并不區分這兩種操作,統一稱之為卷積操作
在這里插入圖片描述

2.參數量的計算

在計算機視覺領域,卷積核不僅具有寬和高,還具有深度,常寫成寬度×高度×深度的形式。
卷積核的參數不僅包括核中存儲的權值,還包括一個偏置值。

2.1案例一

下面通過一個簡單的例子介紹如何計算卷積和的參數量,這里定義如下網絡:

import torch.nn as nn
class Net1(nn.Module):def __init__(self):super(Net1, self).__init__()self.conv1 = nn.Conv2d(1, 32, 5, padding=1)def forward(self, x):x = self.conv1(x)return x

該網絡包括一個卷積層,輸入通道數為1,輸出通道數為32,卷積核大小為5×5,計算該層的參數量。
解釋:因為輸入通道數為1,因此卷積核大小可以表示為5×5×1,輸出通道數為32,表明該層使用32個卷積核,同時每個卷積核有一個偏置值,因此參數量為:5×5×1×32+32=832。
通過代碼驗證可得:


from ptflops import get_model_complexity_infomodel = Net1()
ops, params = get_model_complexity_info(model, (1, 512, 512), as_strings=True,print_per_layer_stat=False, verbose=True)
params,5*5*1*32+32

運行結果:
在這里插入圖片描述
這時可以看到,卷積操作的參數量核輸入圖像的尺寸大小無關,上述輸入圖像尺寸為1×512×512,如果使用全連接網絡的話,那么此時輸入層的結點個數為512×512=262144,如果隱含層結點個數為8,那么此時全連接網絡的參數量為262144×8+8,之所以加8,是因為隱含層每個神經元都有一個偏置。
這是可以看到,卷積神經網絡相對于全連接網絡的優勢,權值共享,參數量小
為什么稱權值共享呢?因為每個特征圖的計算依賴于同一個卷積核。

2.2案例二

為了避免你還未理清如何計算參數量這里再舉一個例子,網絡結構如下:

class Net2(nn.Module):def __init__(self):super(Net2, self).__init__()self.conv1 = nn.Conv2d(8, 32, 3, padding=1)def forward(self, x):x = self.conv1(x)return x

該網絡包括一個卷積層,輸入通道數為8,輸出通道數為32,卷積核大小為3×3,計算該層的參數量。
解釋:因為輸入通道數為8,因此卷積核大小可以表示為3×3×8,輸出通道數為32,表明該層使用32個卷積核,同時每個卷積核有一個偏置值,因此參數量為:3×3×8×32+32=2336。
代碼驗證:

model = Net2()
ops2, params2 = get_model_complexity_info(model, (8, 256, 256), as_strings=True,print_per_layer_stat=False, verbose=True)
params2,3*3*8*32+32

運行結果:
在這里插入圖片描述

3.奇怪的優化思想

在卷積這一塊,有很多優化思想,來所謂的減少參數量,這里主要介紹兩種主流思想。

3.1使用小核卷積替換大核卷積

該思想來源于VGG網絡的設計思想,論文地址:VGG網絡模型,眾所周知,之所以使用大核卷積,是為了獲得更大的感受野,捕獲更大的局部依賴關系。
前提知識:使用兩個3×3的卷積核的感受野和一個5×5的卷積核的感受野大小一致。
這里我們定義兩個網絡,一個使用小核卷積,另一個使用大核卷積,假設每個卷積操作前后圖像的深度保持不變。
大核卷積網絡結構:

import torch.nn as nn
class Net1(nn.Module):def __init__(self):super(Net1, self).__init__()self.conv1 = nn.Conv2d(32, 32, 5, padding=2)def forward(self, x):x = self.conv1(x)return x

參數量:
在這里插入圖片描述
小核卷積網絡結構:

class Net3(nn.Module):def __init__(self):super(Net3, self).__init__()self.conv1 = nn.Conv2d(32, 32, 3, padding=1)self.conv2 = nn.Conv2d(32, 32, 3, padding=1)self.relu = nn.ReLU()def forward(self, x):x = self.conv1(x)x = self.relu(x)x = self.conv2(x)x = self.relu(x)return x

參數量:
在這里插入圖片描述
從結果來看,小核卷積參數量更小,但能夠和大核卷積達到相同的感受野。這就是為什么越來越多的網絡結構使用小核卷積替換大核卷積。

3.2卷積核1×1的應用

這里直接舉兩個例子來介紹:
未使用1×1的卷積核:

class Net4(nn.Module):def __init__(self):super(Net4, self).__init__()self.conv1 = nn.Conv2d(256, 512, 3, padding=1)def forward(self, x):x = self.conv1(x)return x

參數量:
在這里插入圖片描述
使用1×1卷積核:

class Net5(nn.Module):def __init__(self):super(Net5, self).__init__()self.conv1 = nn.Conv2d(256, 32, 1)self.conv2 = nn.Conv2d(32, 512, 3, padding=1)def forward(self, x):x = self.conv1(x)x = self.conv2(x)return x

參數量:
在這里插入圖片描述
從結果來看,使用1×1的卷積核減少通道數,能夠在一定程度上減少參數量,但在減少參數量的同時,輸入的信息量也隨之減少,如果輸入的信息是一個稀疏矩陣的話,那么該方法確實適合減少參數量。

4.輸出圖像尺寸的計算

前面所說,都是考慮的是卷積的參數量,接著討論輸出圖像尺寸如何計算。
卷積主要分為三種,Full convolution、Same convolution、valid convolution,這里主要介紹用處較多的一種,即Same convolution

4.1Same convolution

主要是設置padding參數的值
網絡結構:

class Net6(nn.Module):def __init__(self):super(Net6, self).__init__()self.conv2 = nn.Conv2d(32, 512, 3, padding='same')def forward(self, x):x = self.conv2(x)return x

運行測試:

import torch
model = Net6()
I=torch.randn(32,128,128)
model(I).shape

運行結果:
在這里插入圖片描述
解釋:輸入圖像的尺寸為32×128×128,通過網絡結構可以看出,該層使用512個卷積核,因此輸出通道數為512,因為padding參數設置的是same,輸出會保持圖像的尺寸大小。
有時并不將其設置為same,而是設置一個具體的值,這里只是因為設置了same,其自動計算了一個具體的值代入進去了而已。

4.2具體計算規則

輸出圖像的尺寸,不僅和填充列數有關,還和卷積核大小以及卷積步長有關。具體計算公式如下:
W 2 = ( W 1 ? F + 2 P ) S + 1 W_2=\frac{(W_1-F+2P)}{S}+1 W2?=S(W1??F+2P)?+1
H 2 = ( H 1 ? F + 2 P ) S + 1 H_2=\frac{(H_1-F+2P)}{S}+1 H2?=S(H1??F+2P)?+1
其中, W 1 、 H 1 W_1、H_1 W1?H1?表示輸入圖像的尺寸大小, W 2 、 H 2 W_2、H_2 W2?H2?表示輸出圖像的尺寸大小,F為卷積核尺寸,S為卷積步長,P為零填充數量。
下面舉一個詳細的例子說明。
網絡結構為:

class Net7(nn.Module):def __init__(self):super(Net7, self).__init__()self.conv2 = nn.Conv2d(32, 512, 5, padding=1,stride=2)def forward(self, x):x = self.conv2(x)return x

輸出結果:
在這里插入圖片描述
解釋:根據公式計算即可,(128-5+2*1)/2+1=63,除法運算一律向下取整。輸出通道數和卷積核個數512保持一致,因此輸出形狀為512×63×63。

4.3轉置卷積

轉置卷積(Transposed Convolution),又稱反卷積(Deconvolution),具體計算方式也是卷積的逆運算。
由卷積計算公式為:
W 2 = ( W 1 ? F + 2 P ) S + 1 W_2=\frac{(W_1-F+2P)}{S}+1 W2?=S(W1??F+2P)?+1
H 2 = ( H 1 ? F + 2 P ) S + 1 H_2=\frac{(H_1-F+2P)}{S}+1 H2?=S(H1??F+2P)?+1
轉置卷積,與其計算方式相反,相當于反函數的關系。
W 1 = S × ( W 2 ? 1 ) ? 2 P + F W_1=S×(W_2-1)-2P+F W1?=S×(W2??1)?2P+F
H 1 = S × ( H 2 ? 1 ) ? 2 P + F H_1=S×(H_2-1)-2P+F H1?=S×(H2??1)?2P+F
其中, W 1 、 H 1 W_1、H_1 W1?H1?表示輸出圖像的尺寸大小, W 2 、 H 2 W_2、H_2 W2?H2?表示輸入圖像的尺寸大小,F為卷積核尺寸,S為卷積步長,P為零填充數量。
下面舉一個詳細的例子說明。

class Net8(nn.Module):def __init__(self):super(Net8, self).__init__()# 轉置卷積self.conv_transpose = nn.ConvTranspose2d(in_channels=32, out_channels=16, kernel_size=3, stride=2, padding=1)def forward(self, x):x = self.conv_transpose(x)return x

輸出結果:
在這里插入圖片描述
解釋:根據公式計算即可,2*(128-1)-2*1+3,輸出通道數和卷積核個數16保持一致,因此輸出形狀為16×255×255。

小結

通過本篇博客,相比你也能夠計算卷積神經網絡中圖像尺寸如何變化的,快去找一個深層的網絡試試看吧,看它的尺寸變化是否和你想的一樣呢?可以試試本篇博客設計的網絡模型——Unet語義分割模型

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

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

相關文章

OpenCV——圖像平滑

圖像平滑 一、圖像的噪聲1.1、噪聲來源1.2、噪聲類型1.3、噪聲模擬 二、濾波器三、線性濾波3.1、均值濾波3.2、方框濾波3.3、高斯濾波 四、非線性濾波4.1、中值濾波4.2、雙邊濾波 圖像在采集和傳輸過程中容易受到各種因素的影響而產生噪聲,而噪聲會對圖像的正確解讀…

鴻蒙系統備份恢復

鴻蒙系統嘗試者,在純血鴻蒙與鴻蒙4.2/4.3之前反復橫跳,中間折騰… 目錄 鴻蒙4.2/4.3升級鴻蒙5.0系統備份 鴻蒙5.0回退鴻蒙4.2/4.3系統備份備份恢復 華為手機助手注意 鴻蒙4.2/4.3升級鴻蒙5.0 系統備份 云空間備份手機本地備份華為手機助手備份 鴻蒙5.…

JS進階 Day03

1.兩種面向編程思想 2.構造函數實現封裝以及存在的問題 下面就引出了原型對象 3.原型對象prototype 共享原理圖&#xff1a; 4.數組擴展案例-求最大值和數組求和 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

visual studio小番茄插件某些快捷鍵失效

問題 AltO 切換頭文件和源文件失效。 背景 最近升級了 visual studio&#xff0c;多了一些插件 原因 Alt O 快捷鍵被其他插件占用了 解決方案 工具 → 選項 → 環境 → 鍵盤 搜索這個 VAssistX.OpenCorrespondingFile&#xff08;切換頭/源文件&#xff09; 發現命令的快…

基于單片機的PT100溫度變送器設計

基于單片機的PT100溫度變送器設計 文章目錄 基于單片機的PT100溫度變送器設計前言一、資源分享二、系統框架三、硬件準備1.主控制器2、PT100溫度傳感器3、顯示屏4、WIFI模塊5、USB轉RS485模塊6、SP3485EN7、K11-11D3 四、設計PCB1、安裝下載立創EDA專業版2、畫原理圖3、擺放元器…

Git 清理指南:如何從版本庫中移除誤提交的文件(保留本地文件)

場景 在 Git 項目中&#xff0c;我們可能會不小心提交了本應忽略的文件&#xff08;如 node_modules/、.env、*.log 等&#xff09;&#xff0c;導致倉庫體積膨脹或敏感信息泄露。本文介紹如何從 Git 歷史中徹底刪除這些文件&#xff0c;同時保留本地文件。 解決方案 1. 確認…

服務器數據恢復—重裝系統導致XFS文件系統分區無法訪問的數據恢復案例

服務器數據恢復環境&故障&#xff1a; 一臺服務器上通過磁盤柜RAID卡組建的riad5磁盤陣列&#xff0c;服務器上層安裝Linux操作系統&#xff0c;搭建XFS文件系統。服務器上層分配一個LUN&#xff0c;并劃分了兩個分區。通過LVM擴容的方式將sdc1分區加入到了root_lv中&#…

在QtCreator中使用GitHubCopilot

文章目錄 1.github copilot賬號2. 安裝node.js3.安裝 GitHub Copilot Neovim plugin4.在Qt中啟用4.1.在extension中啟用4.2.在配置中啟用4.3.使用/禁用 5.評價 在最新版的QtCreator中&#xff0c;已經通過Extension集成了GitHubCopilot進來。 我用的是16.0.2版本的&#xff08;…

島嶼周長問題的三種解法:直接計數法、數學計算法與深度優先搜索

問題描述 給定一個二維網格 grid&#xff0c;其中1表示陸地&#xff0c;0表示水域。網格中的格子水平和垂直方向相連&#xff08;對角線不相連&#xff09;。網格中恰好有一個島嶼&#xff08;即一個或多個相連的陸地格子&#xff09;&#xff0c;需要計算這個島嶼的周長。 解…

將包含父子關系的扁平列表 List<Demo> 轉換成樹形結構的 List<DemoVO>,每個節點包含自己的子節點列表

1.stream遞歸操作 private List<DemoVO> createtree(List<Demo> datas) {//得到父節點return datas.stream().filter(m -> TargetConstants.ROOT.equalsIgnoreCase(m.getParentId())).map(m -> {DemoVO vo new DemoVO();vo.setTaxonomyId(m.getPlatformTaxo…

【Jmeter】Jmeter 高并發性能壓力測試

目錄 一、下載 Jmeter 二、配置環境變量 三、設置中文語言 四、入門最簡單的高并發性能壓測流程 1. 添加線程組 2. 添加請求 3. 添加監聽器 3.1 添加聚合報告 3.2 添加結果樹 4. 啟動測試 2 種啟動方式&#xff1a; 查看結果樹&#xff1a; 聚合報告&#xff1a; 五…

芯片測試之VIL/VIH(輸入電平)Test全解析:從原理到實戰

大家好&#xff0c;我是硅言。在數字芯片的“溝通體系”中&#xff0c;??VIL&#xff08;輸入低電平&#xff09;??和??VIH&#xff08;輸入高電平&#xff09;??如同芯片的“聽覺閾值”&#xff0c;決定了它能否準確識別外部信號的邏輯狀態。本文將從原理剖析、測試方…

【WPF】MVVM的消息機制

在WVM&#xff08;Model-View-ViewModel&#xff09;架構中&#xff0c;消息機制主要用于實現ViewModel與View之間的通信&#xff0c;同時保持它們的分離。這對于維護代碼的清晰度和可測試性非常重要。在WPF&#xff08;Windows Presentation Foundation&#xff09;應用程序中…

以樓宇自控關鍵技術,夯實現代低碳建筑發展重要基礎

當“碳達峰、碳中和”成為全球發展共識&#xff0c;建筑行業作為能源消耗與碳排放的重要領域&#xff0c;正加速向低碳化轉型。在這場綠色變革中&#xff0c;樓宇自控技術憑借對建筑設備的智能管控與能源優化能力&#xff0c;成為現代低碳建筑建設的核心支撐。從數據采集到智能…

西電【信息與內容安全】課程期末復習筆記

西電【信息與內容安全】課程期末復習筆記 來自2022年春的古早遺留檔案&#xff0c;有人需要這個&#xff0c;我就再發一下吧。 ? 平時成績&#xff1a; 10%。線上&#xff1a; 10% &#xff08;線上學習內容&#xff0c; 共 100 分。&#xff09;實驗&#xff1a; 10% &#…

【論文閱讀筆記】ICLR 2025 | 解析Ref-Gaussian如何實現高質量可交互反射渲染

Reflective Gaussian Splatting Info 會議 【ICLR 2025】 作者 復旦大學&#xff0c;薩里大學&#xff1b;復旦張力教授團隊 Github地址 https://github.com/fudan-zvg/ref-gaussian.git Project地址 https://fudan-zvg.github.io/ref-gaussian/ Abstract 新視圖合成得益…

面向GPU、CPU及機器學習加速器的機器學習編譯器

機器學習編譯器概述 機器學習編譯器是一種專門針對機器學習工作負載設計的工具&#xff0c;旨在將高層模型描述&#xff08;如TensorFlow或PyTorch模型&#xff09;高效編譯為可在不同硬件&#xff08;如GPU、CPU或專用加速器&#xff09;上執行的底層代碼。其核心目標是優化計…

論文分類打榜賽Baseline(2):InternLM昇騰硬件微調實踐

本文來自社區投稿&#xff0c;作者丁一超 書生大模型實戰營第5期已正式啟動&#xff0c;本期實戰營新增「論文分類打榜賽」&#xff0c;以幫助學員更好地掌握大模型技能。 本文將手把手帶領大家如何基于昇騰微調 InternLM 模型&#xff0c;輕松上手論文自動分類任務。從環境配…

mac安裝mvnd結合idea

mac安裝mvnd結合idea hi&#xff0c;我是阿昌&#xff0c;今天記錄一下mac系統下如何安裝mvnd同時通過maven-helper插件配置mvnd命令&#xff0c;提升編譯速度&#xff1b; 0、前言 如果你正在開發一個由大量模塊組成的大型項目&#xff0c;Gradle可以讓大型項目構建的更快&…

擴展模塊--QWebEngine功能及架構解析

Qt WebEngine 模塊在 Qt 6.9 中提供了基于 Chromium 的網頁渲染引擎功能。 一、主要功能 核心功能 網頁渲染引擎 基于 Chromium 項目的最新穩定版本 支持現代 HTML5、CSS3 和 JavaScript 標準 主要組件 QWebEngineView - 用于顯示網頁內容的 widget QWebEnginePage - 表示…