這是love1005lin在CSDN上2021-11-19發(fā)布的一篇深度學(xué)習(xí)的卷積神經(jīng)網(wǎng),內(nèi)容整理的精簡,移動,現(xiàn)在將其進(jìn)行轉(zhuǎn)載,供大家參考。
01 基本原理
卷積神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)大致包括:卷積層、激活函數(shù)、池化層、全連接層、輸出層等。
▲ 圖1.1 CNN的基本結(jié)構(gòu)
▲ 圖1.2 CNN 的基本結(jié)構(gòu)
一、卷積層
1、二維卷積
給定二維的圖像作為輸入,二維卷積核,卷積運(yùn)算可以表示為:$$Sleft( {i,j} right) = left( {I * K} right)left( {i,j} right) = sumlimits_m{} {sumlimits_n{} {Ileft( {i - m,j - n} right) cdot Kleft( {m,n} right)} }$$
卷積運(yùn)算中的卷積核需要進(jìn)行上下翻轉(zhuǎn)和左右翻轉(zhuǎn):
如果忽略卷積核的左右翻轉(zhuǎn),對于實(shí)數(shù)卷積實(shí)際上與互相換運(yùn)算是一致的:
▲ 圖1.1.1 二維卷積 運(yùn)算示意圖
2、卷積步長
卷積步長,也就是每次卷積核移動的步長。
下圖顯示了卷積步長分別為1,2兩種情況下的輸出結(jié)果。從中可以看到,當(dāng)步長大于1之后,相當(dāng)于從原來的的步長為1的情況下結(jié)果進(jìn)行降采樣。
▲ 圖1.1.2 卷積步長分別為1,2兩種情況下輸出的結(jié)果
3、卷積模式
根據(jù)結(jié)果是否要求卷積核與原始圖像完全重合,部分重合以及結(jié)果尺寸的要求,卷積模式包括有三種:
- Full:允許卷積核部分與原始圖像重合;所獲得結(jié)果的尺寸等于原始圖像尺寸加上卷積核的尺寸減1;
- Same:允許卷積核部分與原始圖像重合;但最終截取Full卷積結(jié)果中中心部分與原始圖像尺寸相同的結(jié)果;
- Validate:所有卷積核與原始圖像完全重合下的卷積結(jié)果;結(jié)果的尺寸等于原始圖像的尺寸減去卷積核尺寸加1;
下面顯示了三種卷積模式對應(yīng)的情況。實(shí)際上可以通過對于原始圖像補(bǔ)零(Padding)然后通過Validate模式獲得前面的Full,Same兩種模式的卷積結(jié)果。
▲ 圖1.1.3 三種卷積模式示意圖
4、數(shù)據(jù)填充
(1)邊緣填充
數(shù)據(jù)填充,也稱為Padding。如果有一個尺寸為的圖像,使用尺寸為卷積核進(jìn)行卷積操作,在進(jìn)行卷積之前對于原圖像周圍填充層數(shù)據(jù),可以影響卷積輸出結(jié)果尺寸。
下面就是對于原始的圖像周圍進(jìn)行1層的填充,可以將Validate模式卷積結(jié)果尺寸增加1。
▲ 圖1.1.4 對于原始的圖像周圍進(jìn)行1層的填充,可以將Validate模式卷積結(jié)果尺寸增加1
▲ 圖1.1.5 邊緣填充,步長為2的卷積
(2)膨脹填充
對于數(shù)據(jù)的填充也可以使用數(shù)據(jù)上采樣填充的方式。這種方式主要應(yīng)用在轉(zhuǎn)置卷積(反卷積中)。
▲ 圖1.1.6 轉(zhuǎn)置卷積對于數(shù)據(jù)膨脹填充
5、感受野
感受野:卷積神經(jīng)網(wǎng)絡(luò)每一層輸出的特征圖(featuremap)上的像素點(diǎn)在輸 入圖片上映射的區(qū)域大小,即特征圖上的一個點(diǎn)對應(yīng)輸入圖上的區(qū) 域。
下圖反映了經(jīng)過幾層卷積之后,卷積結(jié)果所對應(yīng)前幾層的圖像數(shù)據(jù)范圍。
▲ 圖1.1.7 經(jīng)過幾層卷積之后,卷積結(jié)果所對應(yīng)前幾層的圖像數(shù)據(jù)范圍
計算感受野的大小,可以從后往前逐層計算:
- 第層的感受野大小和第層的卷積核大小、卷積步長有關(guān)系,同時也與層的感受野大小有關(guān)系;假設(shè)最后一層(卷積層或者池化層)輸出的特征圖感受也都大學(xué)(相對于其直接輸入而言)等于卷積核的大小;
● 公式中:
Si
:第i層步長,Stride
Ki
:第i層卷積核大小,Kernel Size
感受野的大小除了與卷積核的尺寸、卷積層數(shù),還取決與卷積是否采用空洞卷積(Dilated Convolve)有關(guān)系:
▲ 圖1.1.8 卷積核進(jìn)行膨脹之后,進(jìn)行空洞卷積可以擴(kuò)大視野的范圍
▲ 圖1.1.9 空洞卷積尺寸放大兩倍的情況
6、卷積深度
卷積層的深度(卷積核個數(shù)):一個卷積層通常包含多個尺寸一致的卷積核。如果在CNN網(wǎng)絡(luò)結(jié)構(gòu)中,一層的卷積核的個數(shù)決定了后面結(jié)果的層數(shù),也是結(jié)果的厚度。
▲ 圖1.1.10 多個卷積核形成輸出結(jié)果的深度(厚度)
7、卷積核尺寸
卷積核的大小一般為奇數(shù)奇數(shù) 1×1,3×3,5×5,7×7都是最常見的。這是為什么呢?為什么沒有偶數(shù)偶數(shù)?
(1)更容易padding
在卷積時,我們有時候需要卷積前后的尺寸不變。這時候我們就需要用到padding。
(2)更容易找到卷積錨點(diǎn)
在CNN中,進(jìn)行卷積操作時一般會以卷積核模塊的一個位置為基準(zhǔn)進(jìn)行滑動,這個基準(zhǔn)通常就是卷積核模塊的中心。若卷積核為奇數(shù),卷積錨點(diǎn)很好找,自然就是卷積模塊中心,但如果卷積核是偶數(shù),這時候就沒有辦法確定了,讓誰是錨點(diǎn)似乎都不怎么好。
▲ , LeNET CNN的結(jié)構(gòu)示意圖
二、激活函數(shù)
激活函數(shù)是用來加入非線性因素,提高網(wǎng)絡(luò)表達(dá)能力,卷積神經(jīng)網(wǎng)絡(luò)中最常用的是ReLU,Sigmoid使用較少。
▲ 圖1.2.1 常見到的激活函數(shù)
▲ 圖1.2.2 激活函數(shù)表達(dá)式以及對應(yīng)的微分函數(shù)
1、ReLU函數(shù)
ReLU函數(shù)的優(yōu)點(diǎn):
- 計算速度快,ReLU函數(shù)只有線性關(guān)系,比Sigmoid和Tanh要快很多輸入為正數(shù)的時候,不存在梯度消失問題
ReLU函數(shù)的缺點(diǎn):
- 強(qiáng)制性把負(fù)值置為0,可能丟掉一些特征當(dāng)輸入為負(fù)數(shù)時,權(quán)重?zé)o法更新,導(dǎo)致“神經(jīng)元死亡”(學(xué)習(xí)率不 要太大)
2、Parametric ReLU
- 當(dāng)?shù)臅r候,稱為 Leaky ReLU;當(dāng)從高斯分布隨機(jī)產(chǎn)生的時候,稱為 Randomized ReLU(RReLU)
PReLU函數(shù)的優(yōu)點(diǎn):
- 比sigmoid/tanh收斂快;解決了ReLU的“神經(jīng)元死亡”問題;
PReLU函數(shù)的缺點(diǎn):
- 需要再學(xué)習(xí)一個參數(shù),工作量變大
3、ELU函數(shù)
ELU函數(shù)的優(yōu)點(diǎn):
- 處理含有噪聲的數(shù)據(jù)有優(yōu)勢更容易收斂
ELU函數(shù)的缺點(diǎn):
- 計算量較大,收斂速度較慢
CNN在卷積層盡量不要使用Sigmoid和Tanh,將導(dǎo)致梯度消失。首先選用ReLU,使用較小的學(xué)習(xí)率,以免造成神經(jīng)元死亡的情況。
如果ReLU失效,考慮使用Leaky ReLU、PReLU、ELU或者M(jìn)axout,此時一般情況都可以解決
4、特征圖
- 淺層卷積層:提取的是圖像基本特征,如邊緣、方向和紋理等特征深層卷積層:提取的是圖像高階特征,出現(xiàn)了高層語義模式,如“車輪”、“人臉”等特征
三、池化層
池化操作使用某位置相鄰輸出的總體統(tǒng)計特征作為該位置 的輸出,常用最大池化 (max-pooling)和均值池化(average- pooling) 。
池化層不包含需要訓(xùn)練學(xué)習(xí)的參數(shù),僅需指定池化操作的核大小、操作步幅以及池化類型。
▲ 圖1.3.1 最大值池化一是均值池化示意圖
池化的作用:
- 減少網(wǎng)絡(luò)中的參數(shù)計算量,從而遏制過擬合;
- 增強(qiáng)網(wǎng)絡(luò)對輸入圖像中的小變形、扭曲、平移的魯棒性(輸入里的微 小扭曲不會改變池化輸出——因?yàn)槲覀冊诰植苦徲蛞呀?jīng)取了最大值/ 平均值)幫助我們獲得不因尺寸而改變的等效圖片表征。這非常有用,因?yàn)?這樣我們就可以探測到圖片里的物體,不管它在哪個位置
四、全連接與輸出層
- 對卷積層和池化層輸出的特征圖(二維)進(jìn)行降維將學(xué)到的特征表示映射到樣本標(biāo)記空間的作用
輸出層:
- 對于分類問題采用Softmax函數(shù):
- 對于回歸問題,使用線性函數(shù):
五、CNN的訓(xùn)練
1、網(wǎng)絡(luò)訓(xùn)練基本步驟
CNN的訓(xùn)練,也稱神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)算法與經(jīng)典BP網(wǎng)絡(luò)是一樣的,都屬于隨機(jī)梯度下降(SGD:Stochastic Gradient Descent),也稱增量梯度下降,實(shí)驗(yàn)中用于優(yōu)化可微分目標(biāo)函數(shù)的迭代算法。
Step 1:用隨機(jī)數(shù)初始化所有的卷積核和參數(shù)/權(quán)重
Step 2:將訓(xùn)練圖片作為輸入,執(zhí)行前向步驟(卷積, ReLU,池化以及全連接層的前向傳播)并計算每個類別的對應(yīng)輸出概率。
Step 3:計算輸出層的總誤差
Step 4:反向傳播算法計算誤差相對于所有權(quán)重的梯度,并用梯度下降法更新所有的卷積核和參數(shù)/權(quán)重的值,以使輸出誤差最小化
注:卷積核個數(shù)、卷積核尺寸、網(wǎng)絡(luò)架構(gòu)這些參數(shù),是在 Step 1 之前就已經(jīng)固定的,且不會在訓(xùn)練過程中改變——只有卷 積核矩陣和神經(jīng)元權(quán)重會更新。
2、網(wǎng)絡(luò)等效為BP網(wǎng)絡(luò)
和多層神經(jīng)網(wǎng)絡(luò)一樣,卷積神經(jīng)網(wǎng)絡(luò)中的參數(shù)訓(xùn)練也是使用誤差反向傳播算法,關(guān)于池化層的訓(xùn)練,需要再提一下,是將池化層改為多層神經(jīng)網(wǎng)絡(luò)的形式:
▲ 圖1.5.1 神經(jīng)網(wǎng)絡(luò)中池化層對應(yīng)著多層神經(jīng)網(wǎng)絡(luò)
▲ 圖1.5.2 卷積層對應(yīng)的多層神經(jīng)網(wǎng)絡(luò)的形式
▲ 圖1.5.3 卷積層對應(yīng)的多層神經(jīng)網(wǎng)絡(luò)形式
3、每層特征圖尺寸
輸入圖片的尺寸:一般用n×n表示輸入的image大小。
卷積核的大?。阂话阌?f*f 表示卷積核的大小。
填充(Padding):一般用 p 來表示填充大小。
步長(Stride):一般用 s 來表示步長大小。
輸出圖片的尺寸:一般用 o來表示。
如果已知n 、 f 、 p、 s 可以求得 o ,計算公式如下:
● 其中:
[]
:是向下取整符號,用于結(jié)果不是整數(shù)時向下取整
02 經(jīng)典CNN
▲ 圖2.1 CNN發(fā)展脈絡(luò)
一、LeNet-5
1、簡介
LeNet-5由LeCun等人提出于1998年提出,主要進(jìn)行手寫數(shù)字識別和英文字母識別。經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò),LeNet雖小,各模塊齊全,是學(xué)習(xí) CNN的基礎(chǔ)。
參考:http://yann.lecun.com/exdb/lenet/
Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. Gradient-based learning applied to document recognition. Proceedings of the IEEE, November 1998.
2、網(wǎng)絡(luò)結(jié)構(gòu)
▲ 圖2.1.1 LeNet-5網(wǎng)絡(luò)結(jié)構(gòu)
輸入層:32 × 32 的圖片,也就是相當(dāng)于1024個神經(jīng)元;
C1層(卷積層):選擇6個 5 × 5 的卷積核,得到6個大小為32-5+1=28的特征圖,也就是神經(jīng)元的個數(shù)為 6 × 28 × 28 = 4704;
S2層(下采樣層):每個下抽樣節(jié)點(diǎn)的4個輸入節(jié)點(diǎn)求和后取平均(平均池化),均值 乘上一個權(quán)重參數(shù)加上一個偏置參數(shù)作為激活函數(shù)的輸入,激活函數(shù)的輸出即是下一層節(jié)點(diǎn)的值。池化核大小選擇 2 ∗ 2 得到6個 14 ×14大小特征圖
C3層(卷積層):用 5 × 5 的卷積核對S2層輸出的特征圖進(jìn)行卷積后,得到6張10 × 10新 圖片,然后將這6張圖片相加在一起,然后加一個偏置項(xiàng)b,然后用 激活函數(shù)進(jìn)行映射,就可以得到1張 10 × 10 的特征圖。我們希望得到 16 張 10 × 10 的 特 征 圖 , 因 此 我 們 就 需 要 參 數(shù) 個 數(shù) 為 16 × ( 6 × ( 5 × 5 ) ) 個參數(shù)
S4層(下采樣層):對C3的16張 10 × 10 特征圖進(jìn)行最大池化,池化核大小為2 × 2,得到16張大小為 5 × 5的特征圖。神經(jīng)元個數(shù)已經(jīng)減少為:16 × 5 × 5 =400
C5層(卷積層):用 5 × 5 的卷積核進(jìn)行卷積,然后我們希望得到120個特征圖,特征圖 大小為5-5+1=1。神經(jīng)元個數(shù)為120(這里實(shí)際上是全連接,但是原文還是稱之為了卷積層)
F6層(全連接層):有84個節(jié)點(diǎn),該層的訓(xùn)練參數(shù)和連接數(shù)都( 120 + 1 ) × 84 = 10164
Output層:共有10個節(jié)點(diǎn),分別代表數(shù)字0到9,如果節(jié)點(diǎn)i的輸出值為0,則網(wǎng)絡(luò)識別的結(jié)果是數(shù)字i。采用的是徑向基函數(shù)(RBF)的網(wǎng)絡(luò)連接方式:
$$y_i = sumlimits_j{} {left( {x - j - w_{ij} } right)2 } $$
總結(jié):卷積核大小、卷積核個數(shù)(特征圖需要多少個)、池化核大小(采樣率多少)這些參數(shù)都是變化的,這就是所謂的CNN調(diào)參,需要學(xué)會根據(jù)需要進(jìn)行不同的選擇。
二、AlexNet
1、簡介
AlexNet由Hinton的學(xué)生Alex Krizhevsky于2012年提出,獲得ImageNet LSVRC-2012(物體識別挑戰(zhàn)賽)的冠軍,1000個類別120萬幅高清圖像(Error: 26.2%(2011) →15.3%(2012)),通過AlexNet確定了CNN在計算機(jī)視覺領(lǐng)域的王者地位。
參考:A. Krizhevsky, I. Sutskever, and G. Hinton. Imagenet classification with deep convolutional neural networks. In NIPS, 2012.
首次成功應(yīng)用ReLU作為CNN的激活函數(shù)使用Dropout丟棄部分神元,避免了過擬合使用重疊MaxPooling(讓池化層的步長小于池化核的大小), 一定程度上提升了特征的豐富性使用CUDA加速訓(xùn)練過程進(jìn)行數(shù)據(jù)增強(qiáng),原始圖像大小為256×256的原始圖像中重 復(fù)截取224×224大小的區(qū)域,大幅增加了數(shù)據(jù)量,大大減 輕了過擬合,提升了模型的泛化能力
2、網(wǎng)絡(luò)結(jié)構(gòu)
AlexNet可分為8層(池化層未單獨(dú)算作一層),包括5個卷 積層以及3個全連接層:
▲ 圖2.2.1 AlexNet網(wǎng)絡(luò)結(jié)構(gòu)
輸入層:AlexNet首先使用大小為224×224×3圖像作為輸入(后改為227×227×3) (227-11+2*0)/4+1=55
第一層(卷積層):包含96個大小為11×11的卷積核,卷積步長為4,因此第一層輸出大小為55×55×96;然后構(gòu)建一個核大小為3×3、步長為2的最大池化層進(jìn)行數(shù)據(jù)降采樣,進(jìn)而輸出大小為27×27×96
第二層(卷積層):包含256個大小為5×5卷積核,卷積步長為1,同時利用padding保證 輸出尺寸不變,因此該層輸出大小為27×27×256;然后再次通過 核大小為3×3、步長為2的最大池化層進(jìn)行數(shù)據(jù)降采樣,進(jìn)而輸出大小為13×13×256
第三層與第四層(卷積層):均為卷積核大小為3×3、步長為1的same卷積,共包含384個卷積核,因此兩層的輸出大小為13×13×384
第五層(卷積層):同樣為卷積核大小為3×3、步長為1的same卷積,但包含256個卷積 核,進(jìn)而輸出大小為13×13×256;在數(shù)據(jù)進(jìn)入全連接層之前再次 通過一個核大小為3×3、步長為2的最大池化層進(jìn)行數(shù)據(jù)降采樣, 數(shù)據(jù)大小降為6×6×256,并將數(shù)據(jù)扁平化處理展開為9216個單元
第六層、第七層和第八層(全連接層):全連接加上Softmax分類器輸出1000類的分類結(jié)果,有將近6千萬個參數(shù)
三、VGGNet
1、簡介
VGGNet由牛津大學(xué)和DeepMind公司提出:
- Visual Geometry Group:https://www.robots.ox.ac.uk/~vgg/DeepMind:https://deepmind.com/
參考:K. Simonyan and A. Zisserman. Very deep convolutional networks for large-scale image recognition. In ICLR, 2015.
比較常用的是VGG-16,結(jié)構(gòu)規(guī)整,具有很強(qiáng)的拓展性。相較于AlexNet,VGG-16網(wǎng)絡(luò)模型中的卷積層均使用 3 ∗ 3 的 卷積核,且均為步長為1的same卷積,池化層均使用 2 ∗ 2的 池化核,步長為2。
2、網(wǎng)絡(luò)結(jié)構(gòu)
▲ 圖2.3.1 VGGNet網(wǎng)絡(luò)結(jié)構(gòu)
兩個卷積核大小為 3 ∗ 3 .55∗5, 相當(dāng)于單個卷積核大小為 5 ∗ 5 的卷積層兩者參數(shù)數(shù)量比值為( 2 ∗ 3 ∗ 3 ) / ( 5 ∗ 5 ) = 72 ,前者參數(shù)量更少此外,兩個的卷積層串聯(lián)可使用兩次ReLU激活函數(shù),而一個卷積層只使用一次
四、Inception Net
1、簡介
Inception Net 是Google公司2014年提出,獲得ImageNet LSVRC-2014冠軍。文章提出獲得高質(zhì)量模型最保險的做法就是增加模型的深度(層數(shù))或者是其寬度(層核或者神經(jīng)元數(shù)),采用了22層網(wǎng)絡(luò)。
Inception四個版本所對應(yīng)的論文及ILSVRC中的Top-5錯誤率:
Going Deeper with Convolutions: 6.67%
Batch Normalization: Accelerating Deep Network Training by
Reducing Internal Covariate Shift: 4.8%
RethinkingtheInceptionArchitectureforComputerVision:3.5%
Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning: 3.08%
2、網(wǎng)絡(luò)結(jié)構(gòu)
Inception Module
- 深度:層數(shù)更深,采用了22層,在不同深度處增加了兩個 loss來避免上述提到的梯度消失問題
- 寬度:Inception Module包含4個分支,在卷積核3x3、5x5 之前、max pooling之后分別加上了1x1的卷積核,起到了降低特征圖厚度的作用
1×1的卷積的作用:可以跨通道組織信息,來提高網(wǎng)絡(luò)的表達(dá)能力;可以對輸出通道進(jìn)行升維和降維。
▲ 圖2.4.1 Inception Net網(wǎng)絡(luò)結(jié)構(gòu)
五、ResNet
1、簡介
ResNet(Residual Neural Network),又叫做殘差神經(jīng)網(wǎng) 絡(luò),是由微軟研究院的何凱明等人2015年提出,獲得ImageNet ILSVRC 2015比賽冠軍,獲得CVPR2016最佳論文獎。
隨著卷積網(wǎng)絡(luò)層數(shù)的增加,誤差的逆?zhèn)鞑ミ^程中存在的梯 度消失和梯度爆炸問題同樣也會導(dǎo)致模型的訓(xùn)練難以進(jìn)行,甚至?xí)霈F(xiàn)隨著網(wǎng)絡(luò)深度的加深,模型在訓(xùn)練集上的訓(xùn)練誤差會出現(xiàn)先降低再升高的現(xiàn)象。殘差網(wǎng)絡(luò)的引入則有助于解決梯度消失和梯度爆炸問題。
殘差塊:
ResNet的核心是叫做殘差塊(Residual block)的小單元, 殘差塊可以視作在標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)基礎(chǔ)上加入了跳躍連接(Skip connection)。
- 原連接:
▲ 圖2.5.1 原鏈接結(jié)構(gòu)示意圖
- 跳躍連接:
▲ 圖2.5.2 跳躍結(jié)構(gòu)示意圖
- Skip connection作用:
記:
我們有:
六、Densenet
1、簡介
DenseNet中,兩個層之間都有直接的連接,因此該網(wǎng)絡(luò)的直接連接個數(shù)為L(L+1)/2。
對于每一層,使用前面所有層的特征映射作為輸入,并且使用其自身的特征映射作為所有后續(xù)層的輸入:
▲ 圖2.6.1 DenseNet示意圖
參考:Huang, G., Liu, Z., Van Der Maaten, L., & Weinberger, K. Q. (2017). Densely connected convolutional networks. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4700- 4708).
2、網(wǎng)絡(luò)結(jié)構(gòu)
5層的稠密塊示意圖:
▲ 圖2.6.2 5層DenseNet的結(jié)構(gòu)
DenseNets可以自然地擴(kuò)展到數(shù)百個層,而沒有表現(xiàn)出優(yōu)化困難。在實(shí)驗(yàn)中,DenseNets隨著參數(shù)數(shù)量的增加,在精度上產(chǎn)生一致的提高,而沒有任何性能下降或過擬合的跡象。
優(yōu)點(diǎn):
- 緩解了消失梯度問題加強(qiáng)了特征傳播,鼓勵特征重用一定程度上減少了參數(shù)的數(shù)量
※ 總 結(jié) ※
這是love1005lin在CSDN上2021-11-19發(fā)布的一篇深度學(xué)習(xí)的卷積神經(jīng)網(wǎng),內(nèi)容整理的精簡,移動,現(xiàn)在將其進(jìn)行轉(zhuǎn)載,并發(fā)布在公眾號“TSINGHUAZHUOQING”中。
深度學(xué)習(xí)-卷積神經(jīng)網(wǎng)絡(luò)(CNN)[2] : https://blog.csdn.net/love1005lin/article/details/121418206?utm_source=app&app_version=4.20.0
參考資料
[1]深度學(xué)習(xí)-卷積神經(jīng)網(wǎng)絡(luò)(CNN): https://blog.csdn.net/love1005lin/article/details/121418206?utm_source=app&app_version=4.20.0