日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

深度学习之卷积神经网络(1)什么是卷积

發(fā)布時間:2023/12/15 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习之卷积神经网络(1)什么是卷积 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

深度學(xué)習(xí)之卷積神經(jīng)網(wǎng)絡(luò)(1)什么是卷積

  • 1. 全連接網(wǎng)絡(luò)的問題
  • 2. 局部相關(guān)性
  • 3. 權(quán)值共享
  • 4. 卷積運算

1. 全連接網(wǎng)絡(luò)的問題

?首先我們來分析全連接網(wǎng)絡(luò)存在的問題??紤]一個簡單的4層全連接層網(wǎng)絡(luò),輸入是28×2828×2828×28打平后為784節(jié)點的手寫數(shù)字圖片向量,中間三個隱藏層的節(jié)點數(shù)都是256,輸出層的節(jié)點數(shù)是10,如圖所示:




?通過TensorFlow快速地搭建此網(wǎng)絡(luò)模型,添加4個Dense層,并使用Squential容器封裝為一個網(wǎng)絡(luò)對象:

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers, Sequential, losses, optimizers, datasets# 創(chuàng)建4層全連接網(wǎng)絡(luò) model = keras.Sequential([layers.Dense(256, activation='relu'),layers.Dense(256, activation='relu'),layers.Dense(256, activation='relu'),layers.Dense(10) ]) # build模型,并打印模型信息 model.build(input_shape=(4, 784)) # 利用summary()函數(shù)打印出模型每一層的參數(shù)量統(tǒng)計結(jié)果 model.summary()

?利用summary()函數(shù)打印出模型每一層的參數(shù)統(tǒng)計結(jié)果,如圖所示:

?網(wǎng)絡(luò)的參數(shù)量是怎么計算的呢?對于每一條連接線的權(quán)值標量,視作一個參數(shù),因此對輸入節(jié)點數(shù)為nnn,輸出節(jié)點數(shù)為mmm的全連接層來說,W\boldsymbol WW張量包含的參數(shù)量共有n?mn\cdot mn?m個,b\boldsymbol bb向量包含的參數(shù)量有mmm個,則全連接的總參數(shù)量為n?m+mn\cdot m+mn?m+m。以第一層為例,輸入特征長度為784,輸出特征長度為256,當前層的參數(shù)量為784?256+256=200960784\cdot 256+256=200960784?256+256=200960,同樣的方法可以計算第二、三、四層的參數(shù)量分別為: 65792、65792、2570,總參數(shù)量約34萬個。在計算機中,如果將單個權(quán)值保存為float類型的變量,至少需要占用4個字節(jié)內(nèi)存(Python語言中float占用內(nèi)存更多),那么34萬個網(wǎng)絡(luò)參數(shù)至少需要約1.34MB內(nèi)存。也就是說,單就存儲網(wǎng)絡(luò)的參數(shù)就需要1.34MB內(nèi)存,實際上,網(wǎng)絡(luò)的訓(xùn)練過程中還需要緩存計算機圖模型、梯度信息、輸入和中間計算結(jié)果等,其中梯度相關(guān)運算占用資源非常多。

網(wǎng)絡(luò)參數(shù)量統(tǒng)計 層數(shù)隱藏層1隱藏層2隱藏層3輸出層
參數(shù)量20096065792657922570


?那么訓(xùn)練訓(xùn)練這樣一個網(wǎng)絡(luò)到底需要多少內(nèi)存呢?我們可以在現(xiàn)代GPU設(shè)備上簡單模擬一下資源消耗情況。在TensorFlow中,如果不設(shè)置顯存占用方式,那么默認會占用全部顯存。這里將TensorFlow的顯存使用方式設(shè)置為按需分配,觀測其真實占用的GPU顯存資源情況,代碼如下:

# 獲取所有GPU設(shè)備列表 gpus = tf.config.experimental.list_physical_devices('GPU') if gpus:try:# 設(shè)置GPU顯存占用為按需分配,增長式for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)except RuntimeError as e:# 異常處理print(e)

?上述代碼插入在TensorFlow庫導(dǎo)入后、模型創(chuàng)建前的位置,通過tf.config.experimental.set_memory_growth(gpu, True)設(shè)置TensorFlow按需申請顯存資源,這樣TensorFlow占用的顯存大小即為運算需要的數(shù)量。在Batch Size設(shè)置為32的情況下,x訓(xùn)練時我們觀察到顯存占用了約708MB,內(nèi)存占用約870MB。由于現(xiàn)代深度學(xué)習(xí)框架設(shè)計考量不一樣,這個數(shù)字僅做參考。即便如此,我們也能感受到4層的全連接的計算代價并不小。
?回到1980年代,1.3MB的網(wǎng)絡(luò)參數(shù)量是什么概念呢?1989年,Yann LeCun在手寫郵政編碼識別的論文中采用了一臺256KB內(nèi)存的計算機實現(xiàn)了他的算法,這臺計算機還配備了一塊AT&T DSP-32C的DSP計算卡(浮點數(shù)計算能力約為25MFLOPS)。對于1.3MB的網(wǎng)絡(luò)參數(shù),256KB內(nèi)存的計算機連網(wǎng)絡(luò)參數(shù)都裝載不下,更別提網(wǎng)絡(luò)訓(xùn)練了。由此可見,全連接層較高的內(nèi)存占用量嚴重限制了神經(jīng)網(wǎng)絡(luò)朝著更大規(guī)模、更深層數(shù)方向的發(fā)展。

2. 局部相關(guān)性

?接下來我們探索如何避免全連接網(wǎng)絡(luò)的參數(shù)量過大的缺陷。為了便于討論,我們以圖片類型數(shù)據(jù)為輸入的場景為例。對于2D的圖片數(shù)據(jù),在進入全連接層之前,需要將矩陣數(shù)據(jù)打平成1D向量,然后每個像素點與輸出節(jié)點兩兩相連,我們把連接關(guān)系非常形象地對應(yīng)到圖片的像素位置上,如圖所示:


?可以看出,網(wǎng)絡(luò)層的每個輸出節(jié)點都與所有的輸入節(jié)點5連接,用于提取所有輸出節(jié)點的特征信息,這種稠密的連接方式是全連接層參數(shù)量大、計算代價高的根本原因。全連接層也稱為稠密連接層(Dense Layer),輸入與輸出的關(guān)系為:
oj=σ(∑i∈nodes(I)wijxi+bj)o_j=\sigma(\sum_{i∈\text{nodes}(I)}{w_{ij} x_i+b_j} )oj?=σ(inodes(I)?wij?xi?+bj?)
其中nodes(I)\text{nodes}(I)nodes(I)表示I\text{I}I層的節(jié)點集合。

?那么,輸出節(jié)點是否有必要和全部的輸入節(jié)點相連接呢?有沒有一種近似的簡化模型呢?我們可以分析輸入節(jié)點對輸出節(jié)點的重要性分布,僅考慮較重要的一部分輸入節(jié)點,而拋棄重要性較低的部分節(jié)點,這樣輸出節(jié)點只需要與部分輸入節(jié)點相連接,表達為:
oj=σ(∑i∈top(I,j,k)wijxi+bj)o_j=\sigma(\sum_{i∈\text{top}(I,j,k)}{w_{ij} x_i+b_j} )oj?=σ(itop(I,j,k)?wij?xi?+bj?)
其中top(I,j,k)\text{top}(I,j,k)top(I,j,k)表示I\text{I}I層中對于J\text{J}J層中的jjj號節(jié)點重要性最高的前kkk個節(jié)點集合。通過這種方式,可以把全連接層的∥I∥?∥J∥\Vert I\Vert \cdot \Vert J\VertI?J個權(quán)值連接減少到k?∥J∥k \cdot\Vert J\Vertk?J個,其中∥I∥\Vert I\VertI∥J∥\Vert J\VertJ分別表示I\text{I}I、J\text{J}J層的節(jié)點數(shù)量。

?那么問題就轉(zhuǎn)變?yōu)樘剿?span id="ozvdkddzhkzd" class="katex--inline">I\text{I}I層輸入節(jié)點對于j號輸出節(jié)點的重要性分布。然而找出每個中間節(jié)點的重要性分布是件非常困難的事情,我們可以針對于具體問題,利用先驗知識把這個問題進一步簡化。
?在現(xiàn)實生活中,存在著大量以位置或距離作為重要性分布衡量標準的數(shù)據(jù),比如和自己居住更近的人更有可能對自己影響更大(位置相關(guān)),股票的走勢預(yù)測應(yīng)該更加關(guān)注近段時間的數(shù)據(jù)趨勢(時間相關(guān)),圖片每個像素點和周邊像素點的關(guān)聯(lián)度更大(位置相關(guān))。以2D圖片為例,如果簡單地認為與當前像素歐式距離(Euclidean Distance)≤k2\le \frac{k}{\sqrt 2}2?k?的像素點重要性較高,歐式距離>k2>\frac{k}{\sqrt 2}>2?k?的像素點重要性較低,那么我們就很輕松地建華路每個像素點的重要性分布問題。如圖所示:

圖片像素的重要性分布


?可以看出,以紅色實心網(wǎng)格所在的像素為參考點,它周邊歐式距離≤k2\le \frac{k}{\sqrt 2}2?k?的像素點以矩形網(wǎng)格表示,網(wǎng)格內(nèi)的像素點重要性較高,網(wǎng)格外的像素點較低。這個高寬為k的窗口稱為感受野(Reception Field),它表征了每個像素對中心像素的重要性分布情況,網(wǎng)格內(nèi)的像素才會被考慮,網(wǎng)格外的像素對于中心像素會被簡單地忽略。
?這種基于距離的重要性分布假設(shè)特性稱為局部相關(guān)性,它只關(guān)注和自己距離較近的部分節(jié)點,而忽略距離較遠的節(jié)點。在這種重要性分布假設(shè)下,全連接層的連接模式變成了如圖所示,輸出節(jié)點j只與以j為中心的局部區(qū)域(感受野)相連接,與其它像素?zé)o連接。

局部連接的網(wǎng)絡(luò)層示意圖


?利用局部相關(guān)性的思想,我們把感受野窗口的高、寬記為k(感受野的高、寬可以不相等,為了便于表達,這里只討論高寬相等的情況),當前位置的節(jié)點與大小為k的窗口內(nèi)的所有像素相連接,與窗口外的其它像素點無關(guān),此時網(wǎng)絡(luò)層的輸入輸出關(guān)系表達如下:
oj=σ(∑dist(i,j)≤k2wijxi+bj)o_j=\sigma(\sum_{\text{dist}(i,j)\le \frac{k}{\sqrt 2}}{w_{ij} x_i+b_j} )oj?=σ(dist(i,j)2?k??wij?xi?+bj?)
其中dist(i,j)\text{dist}(i,j)dist(i,j)表示節(jié)點i、j之間的歐式距離。

3. 權(quán)值共享

?每個輸出節(jié)點僅與感受野區(qū)域內(nèi)k×kk×kk×k個輸入節(jié)點相連接,輸出層節(jié)點數(shù)為∥J∥\Vert J\VertJ,則當前層的參數(shù)量為k×k×∥J∥k×k×\Vert J\Vertk×k×J,相對于全連接層的∥I∥×∥J∥\Vert I\Vert \times\Vert J\VertI×J,考慮到kkk一般取值較小,如1、3、5等,k×k?∥J∥k×k?\Vert J\Vertk×k?J,因此成功地將參數(shù)量減少了很多。

?能否再將參數(shù)量進一步減小,比如只需要k×kk×kk×k個參數(shù)即可完成當前層的計算?答案是肯定的,通過權(quán)值共享的思想,對于每個輸出節(jié)點ojo_joj?,均使用相同的權(quán)值矩陣W\boldsymbol WW,那么無論輸出節(jié)點的數(shù)量∥J∥\Vert J\VertJ是多少,網(wǎng)絡(luò)層的參數(shù)量總是k×kk×kk×k。如圖所示:

權(quán)值共享矩陣示意圖


?在計算左上角位置的輸出像素時,使用權(quán)值矩陣:
W=[w11w12w13w21w22w23w31w32w33]\boldsymbol W=\begin{bmatrix}w_{11}&w_{12}&w_{13}\\ w_{21}&w_{22}&w_{23}\\ w_{31}&w_{32}&w_{33} \end{bmatrix}W=???w11?w21?w31??w12?w22?w32??w13?w23?w33?????


?與對應(yīng)感受野內(nèi)部的像素相乘累加,作為左上角像素的輸出值; 在計算右下方感受野區(qū)域時,共享權(quán)值參數(shù)W\boldsymbol WW,即使用相同的權(quán)值參數(shù)W相乘累加,得到右下角像素的輸出值,此時網(wǎng)絡(luò)層的參數(shù)量只有3×3=93×3=93×3=9個,且與輸入、輸出節(jié)點數(shù)無關(guān)。
?通過運用局部相關(guān)性和權(quán)值共享的思想,我們成功把網(wǎng)絡(luò)的參數(shù)量從∥I∥×∥J∥\Vert I\Vert \times\Vert J\VertI×J減少到k×kk×kk×k(準確地說,是在單輸入通道、單卷積核的條件下)。這種權(quán)值共享的“局部連接層”網(wǎng)絡(luò)其實就是卷積神經(jīng)網(wǎng)絡(luò)。接下來我們將從數(shù)學(xué)角度介紹卷積運算,進而正式學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)的原理與計算方法。

4. 卷積運算

?在局部相關(guān)性的先驗下,我們提出了簡化的“局部連接層”,對于窗口k×kk×kk×k內(nèi)的所有像素,采用權(quán)值相乘累加的方式提取特征信息,每個輸出節(jié)點提取對應(yīng)感受野區(qū)域的特征信息。這種運算其實是信號處理領(lǐng)域的一種標準運算: 離散卷積運算。離散卷積運算在計算機視覺領(lǐng)域中有著廣泛的應(yīng)用,這里給出卷積網(wǎng)絡(luò)層從數(shù)學(xué)角度的闡述。
?在信號處理領(lǐng)域,1D連續(xù)信號的卷積運算被定義兩個函數(shù)的積分: 函數(shù)f(τ)f(τ)f(τ)、函數(shù)g(τ)g(τ)g(τ),其中g(τ)g(τ)g(τ)經(jīng)過了翻轉(zhuǎn)g(?τ)g(-τ)g(?τ)和平移后變成g(n?τ)g(n-τ)g(n?τ)。卷積的“卷”是指翻轉(zhuǎn)平移操作,“積”是指積分運算,1D連續(xù)卷積定義為:
(f?g)(n)=∫?∞∞f(τ)g(n?τ)dτ(f\otimes g)(n)=\int_{-\infty}^{\infty}f(τ)g(n-τ)dτ(f?g)(n)=??f(τ)g(n?τ)dτ
離散卷積將積分運算換成累加運算:
(f?g)(n)=∑τ=?∞∞f(τ)g(n?τ)(f\otimes g)(n)=\sum_{τ=-∞}^∞f(τ)g(n-τ)(f?g)(n)=τ=??f(τ)g(n?τ)
注:


?至于卷積為什么這么定義,限于篇幅不做深入闡述。我們重點介紹2D離散卷積運算。在計算機視覺中,卷積運算基于2D圖片函數(shù)f(m,n)f(m,n)f(m,n)和2D卷積核g(m,n)g(m,n)g(m,n),其中f(i,j)f(i,j)f(i,j)g(i,j)g(i,j)g(i,j)僅在各自窗口有效區(qū)域存在值,其它區(qū)域視為0,如圖所示:

此時的2D離散卷積定義為:
(f?g)(m,n)=∑i=?∞∞∑j=?∞∞f(i,j)g(m?i,n?j)(f\otimes g)(m,n)=\sum_{i=-∞}^∞\sum_{j=-∞}^∞f(i,j)g(m-i,n-j)(f?g)(m,n)=i=??j=??f(i,j)g(m?i,n?j)
我們來詳細介紹2D卷積運算。首先,將卷積核g(i,j)g(i,j)g(i,j)函數(shù)翻轉(zhuǎn)(沿著xxxyyy方向各翻轉(zhuǎn)一次),變成g(?i,?j)g(-i,-j)g(?i,?j)。
(m,n)=(?1,?1)(m,n)=(-1,-1)(m,n)=(?1,?1)時,g(?1?i,?1?j)g(-1-i,-1-j)g(?1?i,?1?j)表示卷積核翻轉(zhuǎn)后再向左、向上各平移一個單元,此時:
(f?g)(?1,?1)=∑i=?∞∞∑j=?∞∞f(i,j)g(?1?i,?1?j)=∑i∈[?1,1]∞∑j∈[?1,1]∞f(i,j)g(?1?i,?1?j)\begin{aligned} (f\otimes g)(-1,-1) &=\sum_{i=-∞}^∞\sum_{j=-∞}^∞f(i,j)g(-1-i,-1-j)\\ &=\sum_{i\in[-1,1]}^∞\sum_{j\in[-1,1]}^∞f(i,j)g(-1-i,-1-j) \end{aligned}(f?g)(?1,?1)?=i=??j=??f(i,j)g(?1?i,?1?j)=i[?1,1]?j[?1,1]?f(i,j)g(?1?i,?1?j)?
2D函數(shù)只在i∈[?1,1],j∈[?1,1]i∈[-1,1],j∈[-1,1]i[?1,1],j[?1,1]存在有效值,其它位置為0。如下圖所示:

離散卷積運算1


同理,當(m,n)=(0,?1)(m,n)=(0,-1)(m,n)=(0,?1)時:
(f?g)(0,?1)=∑i∈[?1,1]∞∑j∈[?1,1]∞f(i,j)g(0?i,?1?j)(f\otimes g)(0,-1)=\sum_{i\in[-1,1]}^∞\sum_{j\in[-1,1]}^∞f(i,j)g(0-i,-1-j)(f?g)(0,?1)=i[?1,1]?j[?1,1]?f(i,j)g(0?i,?1?j)

即卷積核翻轉(zhuǎn)后再向上平移一個單元后對應(yīng)位置相乘累加:
(f?g)(0,?1)=7(f\otimes g)(0,-1)=7(f?g)(0,?1)=7
如下圖所示:

離散卷積運算2


(m,n)=(1,?1)(m,n)=(1,-1)(m,n)=(1,?1)時:
(f?g)(1,?1)=∑i∈[?1,1]∞∑j∈[?1,1]∞f(i,j)g(1?i,?1?j)(f\otimes g)(1,-1)=\sum_{i\in[-1,1]}^∞\sum_{j\in[-1,1]}^∞f(i,j)g(1-i,-1-j)(f?g)(1,?1)=i[?1,1]?j[?1,1]?f(i,j)g(1?i,?1?j)

即卷積核翻轉(zhuǎn)后再向右、向上平移一個單元后對應(yīng)位置相乘累加:
(f?g)(1,?1)=1(f\otimes g)(1,-1)=1(f?g)(1,?1)=1
如下圖所示:

離散卷積運算3


(m,n)=(?1,0)(m,n)=(-1,0)(m,n)=(?1,0)時:
(f?g)(?1,0)=∑i∈[?1,1]∞∑j∈[?1,1]∞f(i,j)g(?1?i,0?j)(f\otimes g)(-1,0)=\sum_{i\in[-1,1]}^∞\sum_{j\in[-1,1]}^∞f(i,j)g(-1-i,0-j)(f?g)(?1,0)=i[?1,1]?j[?1,1]?f(i,j)g(?1?i,0?j)
即卷積核翻轉(zhuǎn)后再向左平移一個單元后對應(yīng)位置相乘累加:
(f?g)(?1,0)=?8(f\otimes g)(-1,0)=-8(f?g)(?1,0)=?8
如下圖所示:

離散卷積運算4


按照此種方式循環(huán)計算,可以計算出函數(shù)[f?g](m,n),m∈[?1,1],n∈[?1,1][f\otimes g](m,n),m∈[-1,1],n∈[-1,1][f?g](m,n),m[?1,1],n[?1,1]的所有值,如下圖所示:

2D離散卷積運算


?至此,我們成功完成圖片函數(shù)與卷積核函數(shù)的卷積運算,得到一個新的特征圖。
?回顧“權(quán)值相乘累加”的運算,我們把它即為[f?g](m,n)[f\cdot g](m,n)[f?g](m,n):
(f?g)(m,n)=∑i∈[?w/2,w/2]∞∑j∈[?h/2,h/2]∞f(i,j)g(i?m,j?m)(f\cdot g)(m,n)=\sum_{i\in[-w/2,w/2]}^∞\sum_{j\in[-h/2,h/2]}^∞f(i,j)g(i-m,j-m)(f?g)(m,n)=i[?w/2,w/2]?j[?h/2,h/2]?f(i,j)g(i?m,j?m)
仔細比較它與標準的2D卷積運算不難發(fā)現(xiàn),在“權(quán)值相乘累加”中的卷積核函數(shù)g(m,n)g(m,n)g(m,n),并沒有經(jīng)過翻轉(zhuǎn)。只不過對于神經(jīng)網(wǎng)絡(luò)來說,目標是學(xué)到一個函數(shù)g(m,n)g(m,n)g(m,n)使得L\mathcal{L}L越小越好,至于g(m,n)g(m,n)g(m,n)是不是恰好就是卷積運算中定義的“卷積核”函數(shù)并不十分重要,因為我們并不會直接利用它。在深度學(xué)習(xí)中,函數(shù)g(m,n)g(m,n)g(m,n)統(tǒng)一稱為卷積核(Kernel),有時也叫Filter、Weight等。由于始終使用g(m,n)g(m,n)g(m,n)函數(shù)完成卷積運算,卷積運算其實已經(jīng)實現(xiàn)了權(quán)值共享的思想。

?我們來小結(jié)2D離散卷積運算流程: 每次通過移動卷積核,并與圖片對應(yīng)位置處的感受野像素相乘累加,得到此位置的輸出值。卷積核即是行、列為kkk大小的權(quán)值矩陣W\boldsymbol WW,對應(yīng)到特征圖上大小為kkk的窗口即為感受野,感受野與權(quán)值矩陣W\boldsymbol WW相乘累加,得到此位置的輸出值。通過權(quán)值共享,我們從左上方逐步向右、向下移動卷積核,提取每個位置上的像素特征,直至最右下方,完成卷積運算。可以看出,兩種理解方式殊途同歸,從數(shù)學(xué)角度理解卷積神經(jīng)網(wǎng)絡(luò)即是完成了2D函數(shù)的離散卷積運算; 從局部相關(guān)與權(quán)值共享角度理解,也能的帶一樣的效果。通過這兩種角度,我們既能直觀理解卷積神經(jīng)網(wǎng)絡(luò)的計算流程,又能嚴謹?shù)貜臄?shù)學(xué)角度進行推導(dǎo)。正是基于卷積運算,卷積神經(jīng)網(wǎng)絡(luò)才能如此命名。
?在計算機視覺領(lǐng)域,2D卷積運算能夠提取數(shù)據(jù)的有用特征,通過特定的卷積核與輸入圖片進行卷積運算,獲得不同特征的輸出圖片,如下表所示,列舉了一些常見的卷積核及其效果樣片。

常見卷積核及其效果

參考文獻:
[1] 龍良曲:《深度學(xué)習(xí)與TensorFlow2入門實戰(zhàn)》

總結(jié)

以上是生活随笔為你收集整理的深度学习之卷积神经网络(1)什么是卷积的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。