卷積神經網絡(CNN)原理與實現

  • 卷積神經網絡(CNN)
    • 卷積神經網絡原理
    • 卷積神經網絡的數學推導
    • 卷積層反向傳播算法數學推導
    • 卷積層實現代碼

卷積神經網絡(CNN)

卷積神經網絡原理

卷積神經網絡是一種用于圖像、語音、自然語言等數據的深度學習模型,其核心思想是使用卷積操作提取輸入數據的特征,從而實現數據分類、目標檢測、圖像分割等任務。

卷積操作是卷積神經網絡的核心操作,它通過卷積核(也稱為濾波器)對輸入數據進行卷積運算,提取出輸入數據的特征。具體來說,卷積操作對于每個位置,將卷積核中的值與輸入數據的對應位置相乘,然后將所有乘積相加得到輸出數據的對應位置的值。卷積核的大小、步長和填充方式都可以影響卷積操作的輸出結果。

卷積神經網絡通常包括卷積層、池化層、全連接層等多個層次。卷積層用于提取輸入數據的特征,通過多個卷積核進行卷積操作,得到多個特征圖(feature map)。池化層用于降低特征圖的空間分辨率,減少計算量和參數數量。全連接層用于將特征圖映射到目標類別,通常包含多個神經元,并使用softmax函數進行輸出。

卷積神經網絡在訓練過程中通常使用反向傳播算法進行梯度下降優化。反向傳播算法可以通過將目標函數的梯度反向傳遞回網絡中的每個神經元,計算每個神經元的梯度,并使用梯度下降更新網絡參數,從而最小化目標函數。

卷積神經網絡的數學推導

卷積神經網絡(CNN)的核心操作是卷積(convolution),卷積的本質是信號處理中的一種數學運算,將兩個函數進行疊加并積分,得到一個新的函數。

在CNN中,卷積的輸入是一個二維矩陣(通常是圖像)和一個卷積核(也稱為濾波器)。卷積核是一個小的二維矩陣,大小通常為3x3或5x5,其內部的數值是需要通過訓練學習得到的。
在這里插入圖片描述

下面是卷積的數學推導過程:

設輸入矩陣為 X ∈ R H × W X\in R^{H\times W} XRH×W,卷積核為 K ∈ R K h × K w K\in R^{K_h\times K_w} KRKh?×Kw?,其中 H H H表示矩陣的高度, W W W表示矩陣的寬度, K h K_h Kh?表示卷積核的高度, K w K_w Kw?表示卷積核的寬度。

在進行卷積操作時,將卷積核沿著輸入矩陣的每個位置進行滑動,對應位置的元素相乘并相加,得到輸出矩陣 Y ∈ R ( H ? K h + 1 ) × ( W ? K w + 1 ) Y\in R^{(H-K_h+1)\times(W-K_w+1)} YR(H?Kh?+1)×(W?Kw?+1)。具體來說,輸出矩陣 Y Y Y的第 i i i行第 j j j列的元素為:

y i , j = ∑ m = 1 K h ∑ n = 1 K w x i + m ? 1 , j + n ? 1 k m , n y_{i,j}=\sum\limits_{m=1}^{K_h}\sum\limits_{n=1}^{K_w}x_{i+m-1,j+n-1}k_{m,n} yi,j?=m=1Kh??n=1Kw??xi+m?1,j+n?1?km,n?

其中, x i + m ? 1 , j + n ? 1 x_{i+m-1,j+n-1} xi+m?1,j+n?1?表示輸入矩陣 X X X的第 i + m ? 1 i+m-1 i+m?1行第 j + n ? 1 j+n-1 j+n?1列的元素, k m , n k_{m,n} km,n?表示卷積核 K K K的第 m m m行第 n n n列的元素。

需要注意的是,在卷積操作時通常還會進行填充(padding)和步長(stride)的設置。填充是在輸入矩陣的邊緣添加一些額外的元素,使得卷積操作后輸出矩陣的大小與輸入矩陣相同;步長是在滑動卷積核時的間隔,可以控制輸出矩陣的大小。

卷積神經網絡通常會在卷積層后加入激活函數,如ReLU函數,來增加非線性能力。此外,卷積神經網絡還可以通過池化(pooling)層來減小特征圖的大小,從而減少計算量和參數數量。池化層通常采用最大池化(max pooling)或平均池化(average pooling)操作,對每個特征圖的每個小區域進行取最大值或取平均值的操作,從而得到更小的特征圖。

卷積神經網絡的數學推導主要是通過卷積操作、激活函數和池化操作實現。在卷積神經網絡中,每個卷積層通常包含多個卷積核,每個卷積核對應一個特征圖(也稱為卷積映射)。因此,每個卷積層輸出的是多個特征圖,這些特征圖可以進一步傳遞到下一層進行計算。

在進行卷積神經網絡的訓練過程中,通常采用反向傳播算法(backpropagation)來求解模型參數。反向傳播算法基于梯度下降的思想,通過計算損失函數對模型參數的偏導數(梯度),從而不斷更新模型參數,使得模型能夠更好地擬合訓練數據。

總之,卷積神經網絡的數學推導涉及到卷積操作、激活函數和池化操作,這些操作是卷積神經網絡的核心。在進行訓練時,通常采用反向傳播算法來求解模型參數,從而使得模型能夠更好地擬合訓練數據。

卷積層反向傳播算法數學推導

卷積層反向傳播算法是卷積神經網絡中最為核心的算法之一,其目的是求解每個卷積核的權重參數和偏置項的梯度,從而進行模型參數的更新。

卷積層反向傳播算法的數學推導主要分為兩個步驟:前向傳播和反向傳播。前向傳播通過卷積操作和激活函數對輸入數據進行處理,得到輸出數據;反向傳播根據誤差對輸出數據的梯度,利用卷積操作對輸入數據的梯度進行計算,進而求解每個卷積核的梯度。

下面是卷積層反向傳播算法的數學推導:

假設輸入數據為 X X X,卷積核為 W W W,偏置項為 b b b,輸出數據為 Y Y Y。其中, X X X W W W 的維度分別為 C i n × H i n × W i n C_{in} \times H_{in} \times W_{in} Cin?×Hin?×Win? C o u t × C i n × K h × K w C_{out} \times C_{in} \times K_h \times K_w Cout?×Cin?×Kh?×Kw? Y Y Y 的維度為 C o u t × H o u t × W o u t C_{out} \times H_{out} \times W_{out} Cout?×Hout?×Wout? K h K_h Kh? K w K_w Kw? 分別表示卷積核的高度和寬度, H o u t H_{out} Hout? W o u t W_{out} Wout? 分別表示輸出數據的高度和寬度。

前向傳播的數學表達式為:

Y k , i , j = σ ( ∑ c = 1 C i n ∑ p = 1 K h ∑ q = 1 K w X c , i + p ? 1 , j + q ? 1 W k , c , p , q + b k ) Y_{k,i,j}=\sigma(\sum_{c=1}^{C_{in}}\sum_{p=1}^{K_h}\sum_{q=1}^{K_w}X_{c,i+p-1,j+q-1}W_{k,c,p,q}+b_k) Yk,i,j?=σ(c=1Cin??p=1Kh??q=1Kw??Xc,i+p?1,j+q?1?Wk,c,p,q?+bk?)

其中, σ \sigma σ 表示激活函數。這里使用了 k k k i i i j j j 分別表示第 k k k 個特征圖、第 i i i 行、第 j j j 列的像素點。通過前向傳播,我們可以得到輸出數據 Y Y Y

反向傳播的數學表達式為:

? L ? X c , i , j = ∑ k = 1 C o u t ∑ p = 1 K h ∑ q = 1 K w W k , c , p , q ? L ? Y k , i + p ? 1 , j + q ? 1 \frac{\partial L}{\partial X_{c,i,j}}=\sum_{k=1}^{C_{out}}\sum_{p=1}^{K_h}\sum_{q=1}^{K_w}W_{k,c,p,q}\frac{\partial L}{\partial Y_{k,i+p-1,j+q-1}} ?Xc,i,j??L?=k=1Cout??p=1Kh??q=1Kw??Wk,c,p,q??Yk,i+p?1,j+q?1??L?

? L ? W k , c , p , q = ∑ i = 1 H o u t ∑ j = 1 W o u t X c , i + p ? 1 , j + q ? 1 ? L ? Y k , i , j \frac{\partial L}{\partial W_{k,c,p,q}}=\sum_{i=1}^{H_{out}}\sum_{j=1}^{W_{out}}X_{c,i+p-1,j+q-1}\frac{\partial L}{\partial Y_{k,i,j}} ?Wk,c,p,q??L?=i=1Hout??j=1Wout??Xc,i+p?1,j+q?1??Yk,i,j??L?

? L ? b k = ∑ i = 1 H o u t ∑ j = 1 W o u t ? L ? Y k , i , j \frac{\partial L}{\partial b_k}=\sum_{i=1}^{H_{out}}\sum_{j=1}^{W_{out}}\frac{\partial L}{\partial Y_{k,i,j}} ?bk??L?=i=1Hout??j=1Wout???Yk,i,j??L?

其中, L L L 表示損失函數。通過反向傳播,我們可以求解出每個卷積核的梯度,從而進行模型參數的更新。

解釋一下上述公式的含義:

首先,由于卷積操作是可微分的,因此可以通過鏈式法則來求解輸入數據 X X X 的梯度。假設 L L L 表示損失函數,則 Y Y Y L L L 的梯度為 ? L ? Y k , i , j \frac{\partial L}{\partial Y_{k,i,j}} ?Yk,i,j??L?,因此可以通過卷積操作來計算 X X X L L L 的梯度。

反向傳播中第一個公式表示, X c , i , j X_{c,i,j} Xc,i,j? L L L 的梯度等于所有輸出數據 Y k , i + p ? 1 , j + q ? 1 Y_{k,i+p-1,j+q-1} Yk,i+p?1,j+q?1? L L L 的梯度乘以對應的權重 W k , c , p , q W_{k,c,p,q} Wk,c,p,q? 的和。其中, k k k 取遍所有特征圖, p p p q q q 分別表示卷積核在 H H H W W W 方向上的偏移量。

反向傳播中第二個公式表示, W k , c , p , q W_{k,c,p,q} Wk,c,p,q? L L L 的梯度等于所有輸入數據 X c , i + p ? 1 , j + q ? 1 X_{c,i+p-1,j+q-1} Xc,i+p?1,j+q?1? L L L 的梯度乘以對應的輸出數據 Y k , i , j Y_{k,i,j} Yk,i,j? 的和。同樣地, k k k 取遍所有特征圖, i i i j j j 分別表示輸出數據在 H H H W W W 方向上的偏移量。(解釋與公式矛盾)

反向傳播中第三個公式表示, b k b_k bk? L L L 的梯度等于所有輸出數據 Y k , i , j Y_{k,i,j} Yk,i,j? L L L 的梯度的和。

在實際應用中,通常會采用基于梯度下降的優化算法來進行模型參數的更新。在卷積層反向傳播算法中,可以通過上述公式計算出每個卷積核的梯度,然后利用梯度下降算法對模型參數進行更新,從而提高模型的性能。

卷積層實現代碼

下面是一個使用 NumPy 實現的簡單 Conv2d 類的示例代碼:

import numpy as npclass Conv2d:def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, bias=True):self.in_channels = in_channelsself.out_channels = out_channelsself.kernel_size = kernel_sizeself.stride = strideself.padding = paddingself.bias = bias# 初始化卷積核和偏置項self.weights = np.random.randn(out_channels, in_channels, kernel_size, kernel_size)self.bias_values = np.zeros(out_channels)def forward(self, x):# 計算輸出大小out_h = int((x.shape[2] + 2*self.padding - self.kernel_size) / self.stride + 1)out_w = int((x.shape[3] + 2*self.padding - self.kernel_size) / self.stride + 1)# 對輸入數據進行填充x = np.pad(x, [(0, 0), (0, 0), (self.padding, self.padding), (self.padding, self.padding)], mode='constant')# 初始化輸出數據output = np.zeros((x.shape[0], self.out_channels, out_h, out_w))# 對每個通道進行卷積操作for i in range(self.out_channels):# 對每個像素進行卷積操作for h in range(out_h):for w in range(out_w):# 計算卷積結果conv = np.sum(x[:, :, h*self.stride:h*self.stride+self.kernel_size, w*self.stride:w*self.stride+self.kernel_size] * self.weights[i, :, :, :], axis=(1,2,3))# 加上偏置項conv += self.bias_values[i]# 存儲卷積結果output[:, i, h, w] = convreturn output

這個示例實現了一個簡單的 Conv2d 類,其構造函數接受輸入通道數、輸出通道數、卷積核大小、步長、填充和偏置項等參數。在構造函數中,我們隨機初始化了卷積核和偏置項。

forward 函數接受輸入數據 x,并根據卷積核大小、步長和填充對輸入數據進行填充。然后,我們對每個通道和每個像素進行卷積操作,并將結果存儲在輸出數據中。在卷積操作中,我們使用 NumPy 的數組乘法和求和操作實現了卷積運算,并加上了偏置項。

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

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

相關文章

4、通達OA代碼審計

一、文件操作 1、文件上傳配合文件包含審計 文件上傳首先確定存在漏洞的文件。和文件上傳相關的函數比如upload。在從上到下分析構造的條件1. 從 POST 請求中提取變量 P 的值。 2. 檢查 P 是否已設置且不為空字符串。 3. 如果 P 已設置且非空,進入包含 "inc/…

JavaScript定義函數,創建函數實例時的內部原理

1、定義一個函數,JavaScript內部各做了哪些事情 定義一個函數時,JavaScript內部執行了以下步驟: 解析函數聲明: 當你定義一個函數時,JavaScript的解析器會首先解析函數聲明。這意味著它會檢查函數聲明的語法是否正確,…

[NSSCTF 2nd]MyJs

做一題ejs原型鏈污染 首先是登錄界面 源碼里面提示了源碼的路由 js不熟先審計一下 const express require(express); #導入Express框架,用于構建Web應用程序的服務器和路由 const bodyParser require(body-parser); #導入body-parser中間件,用于解析…

軟考證書=職稱證書?

官方的回答 根據《計算機技術與軟件專業技術資格(水平)考試暫行規定》(國人部發〔2003〕39號)規定,通過考試并獲得相應級別計算機專業技術資格(水平)證書的人員,表明其已具備從事相…

學習Android的第二十二天

目錄 Android ContextMenu 上下文菜單 ContextMenu 范例 參考文檔 Android SubMenu 子菜單 范例 參考文檔 Android PopupMenu 彈出菜單 范例 參考文檔 Android ContextMenu 上下文菜單 在Android開發中,ContextMenu(上下文菜單)為…

使用Javassist 在android運行時生成類

序言 最近在寫框架,有一個需求就是動態的生成一個類,然后查閱了相關文獻,發現在android中動態生成一個類還挺麻煩。因次把一些內容分享出來,幫助大家少走彎路。 方案一 DexMaker DexMaker 是一個針對 Android 平臺的庫&#xf…

Myqsort:基于冒泡排序算法的C語言實現

我們將詳細介紹一個基于冒泡排序算法的自定義排序函數——Mysqrt。該函數通過使用用戶提供的比較函數進行元素間的比較&#xff0c;并結合swap交換函數對任意類型的數據進行排序。下面是對代碼的逐行解析。 邏輯導圖 代碼實現 // 頭文件 #include<stdio.h>// 定義比較函…

華為自動駕駛技術詳解報告分享

ADS2.0首發搭載問界M5智駕版&#xff0c;城市NCA計劃年底全國開通。2023年4月16日華為在智能汽車解決方案發布會上發布了最新的ADS2.0產品&#xff0c;硬件數量減少至27個(11個攝像頭12個超聲波雷達3個毫米波雷達1個激光雷達,ADS1.0有34個)&#xff0c;車載計算平臺改為MDC610&…

python自學2

第一階段第三章 if&#xff0c;elif&#xff0c;else語句 這個是有順序的&#xff0c;如果第一個滿足下面的就不會執行&#xff0c;else也可以不寫&#xff0c;執行的效果等同于三個獨立的if。 還可以寫的更加簡潔一些 直接輸入的參數帶入到判斷里面去 小練習&#xff1a; 做…

打造專屬投屏體驗:Windows系統投屏到iOS系統

想要將電腦投屏共享給同事或朋友&#xff0c;又擔心隱私內容泄露&#xff1f;來來來&#xff0c;這里有妙招&#xff01; AirDroid Cast網頁版讓電腦投屏變得挑剔&#xff0c;只展示你允許共享的內容。會議資料、個人照片、敏感文件&#xff0c;都將得到嚴格的篩選&#xff0c;…

云原生之容器編排實踐-ruoyi-cloud項目部署到K8S:Nacosv2.2.3

背景 前面搭建好了 Kubernetes 集群與私有鏡像倉庫&#xff0c;終于要進入服務編排的實踐環節了。本系列拿 ruoyi-cloud 項目進行練手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

傳輸層Transport layer (ISO15118-20:2022) (7.7 part1) -- TCPUDP

7.7 Transport layer 這段描述闡明了文檔中子條款及其所有子條款的特定要求,這些要求分別適用于私有SECC(Supply Equipment Communication Controller)和公共SECC。除非在特定子條款或其內部的任何子條款中另有說明,否則不應將私有SECC和公共SECC視為可互換的。 這意味著…

問題解決 | RuntimeError: CUDA error: invalid device ordinalCUDA kernel errors

錯誤&#xff1a; RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING1. Compile with TO…

windows環境下Grafana+loki+promtail入門級部署日志系統,收集Springboot(Slf4j+logback)項目日志

&#x1f339;作者主頁&#xff1a;青花鎖 &#x1f339;簡介&#xff1a;Java領域優質創作者&#x1f3c6;、Java微服務架構公號作者&#x1f604; &#x1f339;簡歷模板、學習資料、面試題庫、技術互助 &#x1f339;文末獲取聯系方式 &#x1f4dd; 往期熱門專欄回顧 專欄…

動態規劃DP之背包問題4---分組背包問題

目錄 DP分析&#xff1a; 例題&#xff1a; 01背包&#xff1a; 一種物品只有一件 動態規劃DP之背包問題1---01背包問題-CSDN博客 完全背包&#xff1a;一種物品有無限件 動態規劃DP之背包問題2---完全背包問題-CSDN博客 多重背包&#xff1a;一種物品有有限…

【三維重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)

題目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 機構&#xff1a;CMU&#xff08;卡內基梅隆大學&#xff09;、MIT&#xff08;美國麻省理工&#xff09; 總結&#xff1a;SplaTAM&#xff0c;一個新…

十個勤天生菜原價4.9元被炒到300元,2024新商機!新興創業項目!

近日&#xff0c;一則關于生菜價格暴漲的新聞引起了廣泛關注。原價4.9元的生菜&#xff0c;在短短時間內被炒至300元&#xff0c;令人咋舌。在這背后&#xff0c;除了市場供需失衡、炒作等因素外&#xff0c;我們不禁思考&#xff1a;這樣的現象背后是否隱藏著更大的商機&#…

怎么更改淘寶開店時間

更改淘寶開店時間的注意事項與建議 在淘寶上開店&#xff0c;對于許多賣家來說&#xff0c;選擇合適的開店時間是非常重要的。本文將為您介紹如何更改淘寶開店時間&#xff0c;以及在更改過程中需要注意的事項和建議。 一、如何更改淘寶開店時間 在淘寶上更改開店時間相對簡…

LaTeX插入圖片占位符

關于插入圖片更多說明&#xff08;多圖并排、子標題設置等&#xff09;可參考鏈接 LaTeX插入圖片 插入圖片占位符 參考鏈接&#xff1a;https://blog.csdn.net/yq_forever/article/details/129431799 在論文草稿階段有的時候想先插入圖片占位符擬定大綱或寫作思路&#xff0…

張宇30講學習筆記

初等數學 x \sqrt{x} x ?是算數平方根&#xff0c;一定≥0&#xff1b; x 2 \sqrt{x^2} x2 ?|x| x2|x2||x|2 x3≠|x3||x|3 不等式 a>0&#xff0c;b>0&#xff0c;則ab≥2 a b \sqrt{ab} ab ? 對數 ln a b \frac{a}{b} ba?lna-lnb 高等數學 單調性 線性代數