【DL學習筆記】各種卷積操作總結(深度可分離、空洞、轉置、可變形)

Vanilla Convolution 普通卷積

在這里插入圖片描述
卷積通道數:

  • 卷積核的數量決定輸出的張量的通道數nnn,輸入的張量和每一個核Kernel做卷積運算得到一個channel的輸出。
  • 輸入通道數CinC_{in}Cin?決定每一個卷積核的通道數

卷積輸出feature map的尺寸的計算公式:

  • W_out=Win+2Pw?KwSw+1W\_out = \frac{W_{in} + 2P_w - K_w}{S_w} + 1W_out=Sw?Win?+2Pw??Kw??+1
  • H_out=Hin+2Ph?KhSh+1H\_out = \frac{H_{in} + 2P_h - K_h}{S_h} + 1H_out=Sh?Hin?+2Ph??Kh??+1

其中,輸入的尺寸為 (Win,Hin)(W_{\text{in}}, H_{\text{in}})(Win?,Hin?),卷積核的尺寸為 (Kw,Kh)(K_w, K_h)(Kw?,Kh?),步幅為 (Sw,Sh)(S_w, S_h)(Sw?,Sh?),填充為 (Pw,Ph)(P_w, P_h)(Pw?,Ph?),輸出的尺寸為 (Wout,Hout)(W_{\text{out}}, H_{\text{out}})(Wout?,Hout?)

Group Convolution 分組卷積

Group convolution(分組卷積)最早是在AlexNet(Alex Krizhevsky等人于2012年提出的深度神經網絡模型)中引入的。在 AlexNet中,作者們使用了分組卷積來將計算分布到多個GPU上。

計算

在這里插入圖片描述

Group Convolution :將輸入的 feature map張量 在 channel 的維度上進行分組,然后再對每個分組 分別進行卷積操作,再將各個輸出沿channel維度拼接在一起。

參數量

Group Convolution 優點為可減小參數量。

如下圖,假設輸入尺寸為 Cin×H×WC_{in} \times H \times WCin?×H×W,卷積核尺寸為 K×KK \times KK×K,輸出的 Channel 數為 nnn,我們對于相同的輸入和輸出尺寸,分別使用 普通卷積 和 分組卷積來進行操作,并對比兩種卷積方式的參數量。

在這里插入圖片描述

  • 普通卷積:每個Kernel參數量為K×K×CinK \times K \times C_{in}K×K×Cin? 一共有nnn個Kernel,總共參數量為:
    K×K×Cin×nK \times K \times C_{in} \times n K×K×Cin?×n
  • 分組卷積:將輸入分為ggg個組,每個組進入普通卷積的channel數為 Cing\frac{C_{in}}{g}gCin??,要保證最后沿channel維度拼接后為nnn,所以每個普通卷積的數維度為ng\frac{n}{g}gn?,所以每個組用的卷積核參數量為 K×K×Cing×ngK \times K \times \frac{C_{in}}{g} \times \frac{n}{g}K×K×gCin??×gn?,一共ggg個組,所以總參數量為:
    (K×K×Cing×ng)×g=K×K×Cin×ng(K \times K \times \frac{C_{in}}{g} \times \frac{n}{g} ) \times g = K \times K \times C_{in}\times \frac{n}{g} (K×K×gCin??×gn?)×g=K×K×Cin?×gn?

所以分組卷積是普通卷積參數量的1g\frac{1}{g}g1?

代碼實現

  • 使用普通卷積方法 torch.nn.conv2d(),通過參數 groups 指定組數
  • 注意:in_channelsout_channels 都必須可以被 groups 整除,否則會報錯, 類似 :ValueError: in_channels must be divisible by groups
import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=15, kernel_size=3, groups=5, stride=1, padding=1)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 15, 20, 20])

Depth-wise Convolution 逐深度卷積

是分組卷積的特例:當Group Convolution 的分組數量 ggg 最大,等于輸入channel 數CinC_{in}Cin?時,就變為了 Depth-wise Convolution逐深度卷積。

計算

將輸入的每個通道(channel)獨立地進行 普通卷積運算(CinC_{in}Cin?CoutC_{out}Cout?都為1),每個通道使用一個單獨的卷積核進行處理,即為 DWConvolution

具體做法如下:

  • 將輸入特征圖按照 channel 進行分組,每個 channel 一個組,即 g=Cing = C_{in}g=Cin?
  • 每個 channel (即每個 group ) 使用一個獨立的卷積核(大小為 1×k×k1 \times k \times k1×k×k )對其對應通道做卷積運算,輸入輸出通道均為 1

在這里插入圖片描述

和Group Convolution的優點一樣,參數量和計算量小。

代碼實現

nn.Conv2d 的參數 out_channelsgroups 都設置為等于 in_channels

import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=10, kernel_size=3, groups=10, stride=1, padding=1)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 10, 20, 20])

Point-wise Convolution 逐點卷積

是特殊的普通卷積,kernel_size=1x1,也就是我們經常看到的一乘一卷積 conv 1x1
因為感受野是1x1,沒有融合垂直于channl維度的平面上的信息,所以它通常用來組合每個像素各個通道之間的特征信息。
在這里插入圖片描述

優點 :參數量和計算量小

代碼實現:將 nn.Conv2d 的參數 kernel_size 設置為等于 1

import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=10, kernel_size=1, stride=1)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 10, 20, 20])

Depth-wise Separable Convolution 深度可分離卷積

提出背景

Depth-wise Separable Convolution(深度可分離卷積)最早是由Google的研究團隊在2014年提出的。該方法首次出現在論文《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》中。

計算

Depth-wise Separable Convolution 是

  • 先做一個 Depth-wise Convolution ,后面再做一個 Point-wise Convolution
  • 或者 先做一個 Depth-wise Convolution ,后面再做一個 Point-wise Convolution

計算量

Depth-wise Separable Convolution 的優勢是 極大的減小了卷積的計算量。

這里還是對于相同的輸入和輸出尺寸,對比普通卷積核深度可分離卷積的計算量。
輸入尺寸DF×DF×MD_F\times D_F \times MDF?×DF?×M,輸出通道數為NNN

1、普通卷積計算量

在這里插入圖片描述
對于普通卷積,計算量公式:
Dk?Dk?M?N?DF?DF(1)D_k \cdot D_k \cdot M \cdot N \cdot D_F \cdot D_F \tag{1} Dk??Dk??M?N?DF??DF?(1)

2、深度可分離卷積(Depth-wise Separable Convolution)計算量

在這里插入圖片描述

計算量分為兩部分:

  • Depth-wise 卷積:計算量為 Dk?Dk?M?DF?DFD_k \cdot D_k \cdot M \cdot D_F \cdot D_FDk??Dk??M?DF??DF?
  • Point-wise 卷積:計算量為 (1?1?M?DF?DF)?N(1\cdot 1\cdot M \cdot D_F \cdot D_F) \cdot N(1?1?M?DF??DF?)?N

深度可分離卷積計算量公式:
Dk?Dk?M?DF?DF+M?N?DF?DF(2)D_k \cdot D_k \cdot M \cdot D_F \cdot D_F + M \cdot N \cdot D_F \cdot D_F \tag{2} Dk??Dk??M?DF??DF?+M?N?DF??DF?(2)

3、計算量對比(公式(2) ÷ 公式(1))

為對比普通卷積與深度可分離卷積的計算量,用作商法比大小,將公式(2)除以公式(1),推導得:

Dk?Dk?M?DF?DF+M?N?DF?DFDk?Dk?M?N?DF?DF=1N+1Dk2(3)\frac{D_k \cdot D_k \cdot M \cdot D_F \cdot D_F + M \cdot N \cdot D_F \cdot D_F}{D_k \cdot D_k \cdot M \cdot N \cdot D_F \cdot D_F} = \frac{1}{N} + \frac{1}{D_k^2} \tag{3} Dk??Dk??M?N?DF??DF?Dk??Dk??M?DF??DF?+M?N?DF??DF??=N1?+Dk2?1?(3)

4、典型場景(Dk=3D_k = 3Dk?=3,即 3×3 卷積)

實際常用 3×3 卷積(Dk=3D_k = 3Dk?=3 ),代入公式(3)得:

1N+1Dk2=1N+19\frac{1}{N} + \frac{1}{D_k^2} = \frac{1}{N} + \frac{1}{9} N1?+Dk2?1?=N1?+91?

5、結論

理論上,普通卷積計算量是深度可分離卷積的 8~9 倍(因NNN為輸出channel數往往很大,所以 1N\frac{1}{N}N1? 通常很小,主導項為 $ \frac{1}{9} $ ,故整體約為 9 倍 )。

Dilation/Atrous Convolution 膨脹卷積/空洞卷積

計算與代碼實現

  • 普通卷積輸出的每個像素是輸入的連續的像素與卷積核運算得到的。
  • 膨脹卷積輸出的每個像素是輸入的有間隔的像素與Kernel運算得到的。

在這里插入圖片描述

作用:增大卷積核的感受野。
感受野(Receptive Field)指CNN網絡中,每個特征圖的每個像素點對應輸入圖像的區域大小。

代碼實現:指定nn.Conv2d()的膨脹率參數 dilation

  • 當 dilation=1 時,沒有間隔,是普通卷積
  • 當 dilation=2 時,卷積核元素中間間隔一個像素
import torch
import torch.nn as nnconv = nn.Conv2d(in_channels=10, out_channels=10, kernel_size=3, stride=1, padding=2, dilation=2)
output = conv(torch.rand(1, 10, 20, 20))
print(output.shape)   # torch.Size([1, 10, 20, 20])

padding參數設置

在這里插入圖片描述
在這里插入圖片描述
要保證輸入輸出的大小尺寸不變

  • 普通卷積:步長stride=1,填充padding=1,即原圖多加一圈像素。
  • 膨脹卷積:步長stride=1,填充padding=2,加兩圈像素。

缺點:網格效應Gridding Effect

由于膨脹卷積是一種稀疏的采樣方式,當多個膨脹卷積疊加時,有些像素根本沒有被利用到,會損失信息的連續性與相關性,進而影響分割、檢測等要求較高的任務。

比如這里連續用了兩次膨脹卷積得到的feature map中的一個綠色的像素,回溯回去是由紫色像素得到的。所以如果整個網絡只有兩層膨脹卷積的話,相當于只有原圖的四分之一的像素用到了。
在這里插入圖片描述

Transposed Convolution 轉置卷積

轉置卷積也是卷積,只不過轉置卷積 是一種上采樣操作
如下圖的轉置卷積所示,輸入圖像尺寸為 2x2, 輸出圖像的尺寸為 4x4。
在這里插入圖片描述

參數設置

如何設置 轉置卷積 的 stride 和 padding
在這里插入圖片描述

已知 input 和 kernel 求 output

在這里插入圖片描述

Deformable Convolution 可變形卷積

論文:《Deformable Convolutional Networks》

普通卷積公式:
y(p0)=∑pn∈Rw(pn)?x(p0+pn)\mathbf{y}(\mathbf{p}_0) = \sum_{\mathbf{p}_n \in \mathcal{R}} \mathbf{w}(\mathbf{p}_n) \cdot \mathbf{x}(\mathbf{p}_0 + \mathbf{p}_n) y(p0?)=pn?R?w(pn?)?x(p0?+pn?)

  • y(p0)\boldsymbol{y(p_0)}y(p0?):輸出特征圖在位置 p0\boldsymbol{p_0}p0? 處的值
  • w(pn)\boldsymbol{w(p_n)}w(pn?):卷積核(權重)在位置 pn\boldsymbol{p_n}pn? 處的參數
  • x(p0+pn)\boldsymbol{x(p_0 + p_n)}x(p0?+pn?):輸入數據在位置 p0+pn\boldsymbol{p_0 + p_n}p0?+pn? 處的原始值
  • R\mathcal{R}R:卷積核的作用范圍(即卷積核覆蓋的所有位置集合,決定卷積的“視野”)

簡單說,就是輸出位置的值 = 卷積核權重與輸入對應區域的加權求和

可變性卷積公式:y(p0)=∑pn∈Rw(pn)?x(p0+pn+Δpn)\mathbf{y}(\mathbf{p}_{0})=\sum_{\mathbf{p}_{n}\in\mathcal{R}}\mathbf{w}(\mathbf{p}_{n})\cdot\mathbf{x}(\mathbf{p}_{0}+\mathbf{p}_{n}+\Delta\mathbf{p}_{n})y(p0?)=pn?R?w(pn?)?x(p0?+pn?+Δpn?)

  • y(p0)\mathbf{y}(\mathbf{p}_0)y(p0?):輸出特征圖在位置 p0\mathbf{p}_0p0? 處的像素值
  • R\mathcal{R}R:卷積核的固定感受野范圍(如 3×3 卷積的 9 個位置集合)
  • w(pn)\mathbf{w}(\mathbf{p}_n)w(pn?):卷積核在固定位置 pn\mathbf{p}_npn? 處的權重參數
  • x(?)\mathbf{x}(\cdot)x(?):輸入特征圖
  • Δpn\Delta\mathbf{p}_nΔpn?:偏移量表示卷積核第 nnn 個采樣點相對于固定位置 pn\mathbf{p}_npn? 的偏移。偏移量 Δpn\Delta\mathbf{p}_nΔpn?是學習到的值,是浮點型數據,由圖像經過普通卷積計算得到。

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

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

相關文章

【Ubuntu】請問,`ip -a`顯示的“wlo1”是什么呀?

商量AI wlo1 是 Linux 系統中 無線網絡接口(Wi-Fi 網卡)的名稱,其命名遵循現代 Linux 的 可預測網絡接口命名規則(Predictable Network Interface Names)。以下是詳細解析:命名規則拆解 wlo1 的結構由三部分…

Excel商業智能分析報表 【銷售管理分析儀】

1.銷售漏斗(Sales Funnel)分析🌟🌟 銷售漏斗定義:科學反映商機狀態及銷售效率的銷售管理模型。適用場景:關系型銷售運營(需長期維護客戶關系的銷售模式)。核心功能:按銷售…

【論文閱讀|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】

論文題目:V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING 年份:2024 期刊會議: arXiv 代碼鏈接:https://github.com/wangck20/V2M 目錄 現階段存在的問題 1. 二維結構信息丟失 2. 一維 Mamba 架構的局限性 3. 提升視覺任務表現 相關研究 方法 二維…

服務器數據安全:利用阿里云OSS/騰訊云COS實現網站數據自動備份

更多云服務器知識,盡在hostol.com你的網站,就像一座你親手在數字海灘上堆砌起來的、精美絕倫的“沙堡”。你為它設計了獨特的風格,添置了豐富的內容,吸引了越來越多的游客前來參觀。每一篇文章,每一條評論,…

AdGuard 安卓修改版:全方位廣告攔截與隱私保護專家

AdGuard 安卓版是一款功能強大的廣告攔截軟件,能夠有效阻止網頁和應用程序中的廣告和跟蹤器,提升用戶的瀏覽體驗。它不僅提供了廣泛的廣告攔截功能,還通過多種隱私保護功能,確保用戶的個人信息安全。以下是 AdGuard 安卓版的詳細介…

Mysql中的鎖到底是什么?鎖的是什么?

MySQL InnoDB 的鎖:一次從“守衛”到“交通指揮中心”的深度之旅 MySQL InnoDB 的鎖。這個概念常常讓人覺得復雜抽象,但我們需要抓住它的底層設計哲學 忘記那些代碼和術語定義,我們先從最底層的問題開始思考: 思考一:為…

CVE-2020-24557

一、漏洞原理 CVE-2020-24557 是 D-Link 路由器(如 DIR-816L2) 中存在的一個 命令注入(Command Injection) 漏洞,其核心原理為: ①路由器的管理界面(Web 或 CGI 接口)在處理某些用戶…

proxychains——Linux代理工具

簡介 ProxyChains是一個UNIX程序,通過預加載動態庫(dlsym(),LD_PRELOAD)劫持動態鏈接程序中與網絡相關的libc函數,將連接重定向至SOCKS4a/5或HTTP代理。僅支持TCP協議(不支持UDP/ICMP等)。它的工作方式基本…

精確調控建筑環境,樓宇自控系統大幅提升居住舒適度

在現代城市化進程中,建筑環境的舒適度已成為衡量生活質量的重要指標。隨著科技的飛速發展,樓宇自控系統(Building Automation System, BAS)正以前所未有的精準度重新定義人與空間的互動關系。這套集成了物聯網、大數據和人工智能的…

Echarts中的水波圖、水球圖、水半球實現的詳細步驟(vue)

目錄 一、實現效果 二、實現步驟 1. 安裝ECharts和Liquid Fill插件 2. 創建一個組件 3.在創建的vue中引入ECharts和Liquid Fill插件 4.在組件中初始化ECharts和Liquid Fill插件 5.完整代碼 一、實現效果 Echarts中的水位圖(水波圖、水球圖、水半球)…

Vue父組件向子組件傳遞一個動態的值,子組件如何保持實時更新實時更新?

父組件 通過 :issueDeptId this.form109.issueDeptId傳數據到子組件 <inv-info ehco-data"selectOutInvId" :purposeId this.form109.purposeId:issueDeptId this.form109.issueDeptId:projectNo this.form109.projectNo:invPhysicIds this.form109.issuePh…

如何通過主數據治理重構企業系統競爭力

在當前企業數字化轉型持續深化的背景下&#xff0c;IT系統復雜度與數據規模呈指數級增長。CRM、ERP、HRM、供應鏈、電商平臺等多系統并行運作已成為常態。然而&#xff0c;隨之而來的主數據&#xff08;Master Data&#xff09;管理難題&#xff0c;正日益成為制約系統穩定性、…

c++ 中 原子鎖、互斥鎖、自旋鎖的區別和詳細用法

用最生活化的比喻來解釋 C 中原子鎖、互斥鎖和自旋鎖的區別和用法&#xff0c;讓小白也能秒懂&#xff01;&#x1f604;想象你 ??&#xff08;線程&#xff09;?? 要去公共更衣室 ??&#xff08;共享資源&#xff0c;如變量、數據結構&#xff09;?? 換衣服。這個更衣…

RabbitMQ面試精講 Day 12:鏡像隊列與Quorum隊列對比

【RabbitMQ面試精講 Day 12】鏡像隊列與Quorum隊列對比 開篇&#xff1a;面試價值與核心要點 在RabbitMQ集群環境中&#xff0c;如何保證消息的高可用性是最常被問及的面試問題之一。今天我們將深入探討RabbitMQ提供的兩種高可用隊列實現方案&#xff1a;經典鏡像隊列(Mirror…

Maven 常用命令詳解

前言 Apache Maven 是 Java 項目管理和構建自動化工具&#xff0c;它通過一個項目對象模型&#xff08;POM, Project Object Model&#xff09;來管理項目的構建、報告和文檔。Maven 的核心優勢在于其強大的依賴管理、標準化的項目結構以及豐富的插件生態系統。掌握 Maven 的常…

Android Studio切換到經典UI,老UI

為什么要寫這邊文章&#xff0c;我自己的android studio年兒半載安裝一次新的&#xff0c;所以記錄一下。1、新android studio安裝后都是新工作室風格的UI。2、菜單File ->Settings ,在Setting界面將Enable New UI 的勾選去掉&#xff0c;點擊OK&#xff0c;重啟Android Stu…

走進“Mesh無線自組網”:開啟智能家居和智慧工廠

隨著科技的迅猛發展&#xff0c;互聯網已經滲透到我們生活的方方面面&#xff0c;而其中最引人矚目的便是“智能家居”和“智慧工廠”。這些新興領域的飛速發展&#xff0c;離不開底層網絡技術的支持。眾多的網絡通信技術中&#xff0c;Mesh無線自組網以其獨特的優勢&#xff0…

力扣熱題100——雙指針

雙指針兩數之和&#xff08;有序數組&#xff0c;相向雙指針&#xff09;問題&#xff1a;在有序數組中找到兩個數&#xff0c;使它們的和等于目標值。思路&#xff1a;左指針從起點出發&#xff0c;右指針從終點出發&#xff0c;根據和與目標值的大小調整指針。 #include <…

AI Infra與LLM的聯系與差異

一、定義與定位LLM&#xff08;大語言模型&#xff09; 定義&#xff1a;基于海量文本訓練的深度學習模型&#xff0c;通過Transformer架構實現語言理解與生成&#xff0c;典型代表如GPT-4、通義千問等。定位&#xff1a;AI應用的核心能力層&#xff0c;直接面向用戶提供文本生…

數據結構-雙鏈表

學習完單鏈表&#xff0c;現在繼續學習雙鏈表一、雙鏈表結構帶頭雙向循環鏈表&#xff08;簡稱&#xff1a;雙鏈表&#xff09;注意&#xff1a;這?的“帶頭”跟前面我們說的“頭節點”是兩個概念&#xff0c;實際前面的在單鏈表階段稱呼不嚴謹&#xff0c;但是為了同學們更好…