零基礎學習之——深度學習算法介紹01

第一節.基礎骨干網絡

物體分類是計算機視覺(computer vision,CV)中最經典的、也是目前研究得最為透徹的一
個領域,該領域的開創者也是深度學習領域的“名人”級別的人物,例如 Geoffrey Hinton、Yoshua
Bengio 等。物體分類常用的數據集有手寫數字識別數據集 MNIST、物體識別數據集 CIFAR-10
(10 類)和類別更多的 CIFAR-100(100 類),以及超大數據集 ImageNet。ImageNet 是由李飛飛教 授主導的 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)中使用的數據集,每年的 ILSVRC(此處指 ILSVRC 的物體分類任務)中產生的網絡也指引了分類網絡的發展方向。 2012 年,第三屆 ILSVRC 的冠軍作品 Hinton 團隊的 AlexNet,將 2011 年的 top-5 錯誤率從
25.8% 降低到 16.4%。他們的最大貢獻在于驗證了卷積操作在大數據集上的有效性,從此物體分類 進入了深度學習時代。 2013 年,ILSVRC 已被深度學習算法“霸榜”,冠軍作品 ZFNet 使用了更深的深度,并且其論 文給出了卷積神經網絡(CNN)的有效性的初步解釋。
2014 年是深度學習領域分類算法“井噴式”發展的一年,在物體檢測方向也是如此。這一屆
ILSVRC 物體分類任務的冠軍作品是 Google 團隊提出的 GoogLeNet(top-5 錯誤率:7.3%),亞軍作 品則是牛津大學的 VGG(top-5 錯誤率:8.0%),但是在物體檢測任務中 VGG 擊敗了 GoogLeNet。 VGG 利用的搭建 CNN 的思想現在來看依舊具有指導性,例如按照降采樣的分布對網絡進行分塊, 使用小卷積核,每次降采樣之后特征圖(feature map)的數量加倍,等等。另外 VGG 使用了當初 賈揚清提出的 Caffe 作為深度學習框架并開源了其模型,憑借比 GoogLeNet 更快的特性,VGG 很 快占有了大量的市場,尤其是在物體檢測領域。VGG 也憑借增加深度來提升精度的思想將 CNN 推 上了“最高峰”。GoogLeNet 則從特征多樣性的角度研究了 CNN 結構,GoogLeNet 的特征多樣性是 基于一種并行的、使用了多個不同尺寸的卷積核的 Inception 單元來實現的。GoogLeNet 的最大貢 獻在于指出 CNN 精度的增加不僅僅可以依靠深度實現,增加網絡的復雜性也是一種有效的策略。
2015 年的 ILSVRC 的冠軍作品是何愷明等人提出的殘差網絡(top-5 錯誤率:3.57%)。他們指
出 CNN 的精度并不會隨著深度的增加而增加,導致此問題的原因是網絡的退化問題。殘差網絡
的核心思想是通過向網絡中添加直接映射(跳躍連接)的方式解決退化問題,進而使構建更深的
CNN 成為可能。殘差網絡的簡單易用的特征使其成為目前使用最為廣泛的網絡結構之一。
2016 年 ILSVRC 的前幾名作品都是通過模型集成實現的,CNN 的結構創新陷入了短暫的停滯。
當年的冠軍作品是商湯公司和香港中文大學聯合推出的 CUImage,它是 6 個模型的集成,并無創
新性,此處不贅述。2017 年是 ILSVRC 的最后一屆,這一屆的冠軍是 Momenta 團隊,他們提出了 基于注意力機制的 SENet(top-5 錯誤率:2.21%),其通過自注意力(self-attention)機制為每個特 征圖計算出一個權重。另外一個非常重要的網絡是黃高團隊于 CVPR 2017 提出DenseNet.。
由于 Transformer 在自然語言處理( natural language processing NLP )任務上取得的突破性進
展,將 Transformer 應用到分類網絡成為近年來非常火熱的研究方向,比較有代表性的包括 iGPT 、 ViT、 Swin Transformer ,以及混合使用 CNN Transformer CSWin Transformer

1.1起源:LeNet-5 和 AlexNet

1.1.1 從 LeNet-5 開始

使用 CNN 解決圖像分類問題可以往前追溯到 1998 LeCun 發表的論文 1 ,其中提出了用于解
決手寫數字識別問題的 LeNet LeNet 又名 LeNet-5 ,是因為在 LeNet 中使用的均是 5 × 5 的卷積核。 LeNet-5 的網絡結構如圖 1.1 所示。
? ? ? ?LeNet-5 中使用的結構直接影響了其后的幾乎所有 CNN ,卷積層 + 降采樣層 + 全連接層至今仍 然是最主流的結構。卷積操作使網絡可以響應和卷積核形狀類似的特征,而降采樣操作則使網絡擁 有了一定程度的不變性。下面我們簡單分析一下 LeNet-5 的網絡結構。
? ? ? ? 輸入: 32 × 32 的手寫數字(數據集中共 10 類)的黑白圖片。
? ? ? ? ?C1 C1 層使用了 6 個卷積核,每個卷積核的大小均是 5 × 5 pad = 0 stride = 1 (有效卷積,與 有效卷積對應的是 same 卷積),激活函數使用的是 tanh(雙曲正切),表達式為式(1.1) tanh 激 活函數的值域是 (???1,1) 。所以在第一次卷積之后,特征圖的大小變為 28 × 28 (32???5 + 1)/1 = 28 ), 該層共有 28 × 28 × 1 × 6 = 4 704 個神經元。加上偏置,該層共有 (5 × 5 + 1) × 6 = 156 個參數。

S2 S2 層是 CNN 常使用的降采樣層。在 LeNet-5 中,降采樣的過程是將窗口內的 3 個輸入相
加,乘一個可訓練參數再加上一個偏置。經過 S2 層,特征圖的大小縮小,變成 14 × 14 。該層共有 14 × 14 × 6 = 1 176 個神經元,參數數量是 (1 + 1) × 6 = 12
C3 C3 層跟 S2 層并不是密集連接的,具體連接方式是, C3 層的前 6 個特征圖以 S2 層中 3 個相鄰的特征圖子集為輸入,接下來 6 個特征圖以 S2 層中 4 個相鄰特征圖子集為輸入,然后的 3 個特征圖以不相鄰的 4 個特征圖子集為輸入,最后一個特征圖以 S2 層中所有特征圖為輸入,如
1.2 所示。這兩個層采用的稀疏連接的方式已被拋棄,目前普遍使用的是密集連接,或輕量級網
絡中使用的深度可分離卷積、分組卷積。

1.2 LeNet-5 C3 層和 S2 層的連接方式
  • C3 層包括 16 個大小為 5 × 5、通道數為 6 same 卷積,pad = 0stride = 1,激活函數同樣為 tanh。一次卷積后,特征圖的大小是 10 × 10(14???5 + 1)/1 = 10),神經元數量為 10 × 10 × 16 = 1 600,可訓練參數數量為 (3 × 25 + 1) × 6 + (4 × 25 + 1) × 6 + (4 × 25 + 1) × 3 + (6 × 25 + 1) × 1 = 1 516。 S4:與 S2 層的計算方法類似,該層使特征圖的大小變成 5 × 5,共有 5 × 5 × 16 = 400 個神經元, 可訓練參數數量是 (1 + 1) × 16 = 32
  • C5:節點數為 120 的全連接層,激活函數是 tanh,參數數量是 (400 + 1) × 120 = 48 120
  • F6:節點數為 84 的全連接層,激活函數是 tanh,參數數量是 (120 + 1) × 84 = 10 164
  • 輸出:10個分類的輸出層,使用的是softmax激活函數,如式(1.2)所示,參數數量是(84 + 1) × 10 = 850softmax 用于分類有如下優點:

使用 Keras 搭建 LeNet-5 網絡的核心代碼如下,其是基于 LeNet-5 網絡,在 MNIST 手寫數字識
別數據集上的實現。完整的 LeNet-5 MNIST 上的訓練過程見隨書資料。
注意,這里使用的都是密集連接,沒有復現 C3 層和 S2 層之間的稀疏連接。
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpointdef build_lenet5(input_shape=(28, 28, 1), num_classes=10):"""構建優化的LeNet-5模型Args:input_shape: 輸入圖像尺寸num_classes: 分類類別數Returns:Keras模型實例"""model = models.Sequential()# 第一層卷積model.add(layers.Conv2D(6, kernel_size=(5,5), padding='valid',activation='relu', input_shape=input_shape))model.add(layers.MaxPooling2D(pool_size=(2,2), strides=2))# 第二層卷積model.add(layers.Conv2D(16, kernel_size=(5,5), padding='valid',activation='relu'))model.add(layers.MaxPooling2D(pool_size=(2,2), strides=2))# 全連接層model.add(layers.Flatten())model.add(layers.Dense(120, activation='relu'))model.add(layers.Dense(84, activation='relu'))model.add(layers.Dense(num_classes, activation='softmax'))return model# 數據預處理配置
train_datagen = ImageDataGenerator(rescale=1./255,validation_split=0.2
)# 加載MNIST數據集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32')
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32')# 創建數據生成器
train_generator = train_datagen.flow(x_train, y_train, batch_size=128)
validation_generator = train_datagen.flow_from_directory('path_to_validation_data',  # 需要根據實際情況修改target_size=(28,28),color_mode='grayscale',batch_size=128
)# 構建模型
model = build_lenet5()# 編譯模型
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 設置早停和模型檢查點
early_stop = EarlyStopping(monitor='val_loss', patience=5)
checkpoint = ModelCheckpoint('best_model.h5', save_best_only=True)# 訓練模型
history = model.fit(train_generator,steps_per_epoch=len(x_train)//128,epochs=50,validation_data=validation_generator,callbacks=[early_stop, checkpoint]
)# 評估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'\nTest accuracy: {test_acc:.4f}')
如圖 1.3 所示,經過 10 epoch 后, LeNet-5 基本收斂。

1.3 LeNet-5 MNIST 數據集上的收斂情況

?1.1.2 覺醒:AlexNet

LeNet-5 之后, CNN 沉寂了約 14 年。直到 2012 年, AlexNet ILSVRC 中一舉奪魁,直接把
ImageNet 數據集上的精度提升了約 10 個百分點,它將 CNN 的深度和寬度都提升到了傳統算法無法企及的新高度。從此,深度學習開始在 CV 的各個領域“披荊斬棘”,至今深度學習仍是人工
智能最熱門的話題。 AlexNet 作為教科書式的網絡,值得每個學習深度學習的人深入研究。 AlexNet 的名字取自該模型的第一作者 Alex Krizhevsky AlexNet ImageNet 中的 120 萬張
圖片的 1 000 類分類任務上的 top-1 錯誤率是 37.5% top-5 錯誤率則是 15.3% (直接比第二名的
26.2% 低了約 10 個百分點)。 AlexNet 如此成功的原因是其使網絡的寬度和深度達到了前所未有的 高度,而該模型也使網絡的可學習參數達到了 58 322 314 個。為了學習這些參數, AlexNet 并行使 用了兩塊 GTX 580 ,大幅提升了訓練速度。
? ? ? ? 筆記:? ?
? ? ? ? AlexNet 當初使用分組卷積是因為硬件資源有限 不得不將模型分到兩塊 GPU
運行。相關研究者并沒有給出分組卷積的概念 而且沒有對分組卷積的性能進行深入探
討。 ResNeXt 的相關研究者則明確給出了分組卷積的定義 并證明和驗證了分組卷積有
接近普通卷積的精度。
當想要使用機器學習解決非常復雜的問題時,我們必須使用容量足夠大的模型。在深度學習
中,增加網絡的寬度和深度會提升網絡的容量,但是提升容量的同時也會帶來兩個問題:
  1. 計算資源的消耗;
  2. 模型容易過擬合。
計算資源是當時限制深度學習發展的瓶頸, 2011 Ciresan 等人提出了使用 GPU 部署 CNN
技術框架 1 ,由此深度學習得到了可以解決其計算瓶頸問題的硬件支持。
下面來詳細分析一下 AlexNet AlexNet 的網絡結構如圖 1.4 所示。

1.4 AlexNet 的網絡結構
AlexNet 基于 Keras 的實現代碼如下。
# 構建 AlexNet 網絡
model = Sequential ()
model . add ( Conv2D ( input_shape = ( 227 , 227 , 3 ), strides = 4 , filters = 96 , kernel_size = ( 11 , 11 ),
padding = 'valid' , activation = 'relu' ))
model . add ( BatchNormalization ())
model . add ( MaxPool2D ( pool_size = ( 3 , 3 ), strides = 2 ))
model . add ( Conv2D ( filters = 256 , kernel_size = ( 5 , 5 ), padding = 'same' , activation = 'relu' ))
model . add ( BatchNormalization ())
model . add ( MaxPool2D ( pool_size = ( 3 , 3 ), strides = 2 ))
model . add ( Conv2D ( filters = 384 , kernel_size = ( 3 , 3 ), padding = 'same' , activation = 'relu' ))
model . add ( BatchNormalization ())
model . add ( Conv2D ( filters = 384 , kernel_size = ( 3 , 3 ), padding = 'same' , activation = 'relu' ))
model . add ( BatchNormalization ())
model . add ( Conv2D ( filters = 256 , kernel_size = ( 3 , 3 ), padding = 'same' , activation = 'relu' ))
model . add ( BatchNormalization ())
model . add ( MaxPool2D ( pool_size = ( 2 , 2 ), strides = 2 ))
model . add ( Flatten ())
model . add ( Dense ( 4096 , activation = 'tanh' ))
model . add ( Dropout ( 0.5 ))
model . add ( Dense ( 4096 , activation = 'tanh' ))
model . add ( Dropout ( 0.5 ))
model . add ( Dense ( 10 , activation = 'softmax' ))
model . summary ()
根據 Keras 提供的 summary() 函數,可以得到圖 1.5 所示的 AlexNet 的參數數量的統計結果 1
計算方法參照 LeNet-5 ,不贅述。
1.多 GPU 訓練
首先對比圖 1.1 和圖 1.4 ,我們發現 AlexNet 將網絡分成了兩個部分。由于當時顯卡的顯存大小 有限,因此作者使用了兩塊 GPU 并行訓練模型,例如第二個卷積(圖 1.4 中通道數為 128 的卷積)只使用一個 GPU 自身顯存中的特征圖,而第三個卷積需要使用另外一個 GPU 顯存中的特征圖。不過 得益于 TensorFlow 等開源框架對多機多卡的支持和顯卡顯存的提升, AlexNet 部署在單塊 GPU 上已 毫無壓力,所以這一部分就不贅述。
2ReLU
LeNet-5 中,使用了 tanh 作為激活函數, tanh 的函數曲線如圖 1.6 所示。 tanh 是一個以原點為中心點、值域為 (???1,1) 的激活函數。在反向傳播過程中,局部梯度會與整個損失函數關于該
局部輸出的梯度相乘。當 tanh( x ) 中的 x 的絕對值比較大的時候,該局部的梯度會非常接近于 0
在深度學習中,該現象叫作“飽和”。同樣,另一個常用的 sigmoid 激活函數也存在飽和的現象。
sigmoid 的函數如式( 1.3 )所示,函數曲線如圖 1.7 所示。

Model: "sequential"
_________________________________________________________________
Layer (type) ? ? ? ? ? ? ? ? Output Shape ? ? ? ? ? ? ?Param # ??
=================================================================
conv2d (Conv2D) ? ? ? ? ? ? ?(None, 224, 224, 32) ? ? ?896 ? ? ??
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 112, 112, 32) ? ? ?0 ? ? ? ??
_________________________________________________________________
conv2d_1 (Conv2D) ? ? ? ? ? ?(None, 112, 112, 64) ? ? ?18496 ? ??
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 56, 56, 64) ? ? ? ?0 ? ? ? ??
_________________________________________________________________
conv2d_2 (Conv2D) ? ? ? ? ? ?(None, 56, 56, 128) ? ? ? 73856 ? ??
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 28, 28, 128) ? ? ? 0 ? ? ? ??
_________________________________________________________________
conv2d_3 (Conv2D) ? ? ? ? ? ?(None, 28, 28, 256) ? ? ? 295168 ? ?
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 14, 14, 256) ? ? ? 0 ? ? ? ??
_________________________________________________________________
flatten (Flatten) ? ? ? ? ? ?(None, 50176) ? ? ? ? ? ? 0 ? ? ? ??
_________________________________________________________________
dense (Dense) ? ? ? ? ? ? ? ?(None, 4096) ? ? ? ? ? ? ?205524992?
_________________________________________________________________
dropout (Dropout) ? ? ? ? ? ?(None, 4096) ? ? ? ? ? ? ?0 ? ? ? ??
_________________________________________________________________
dense_1 (Dense) ? ? ? ? ? ? ?(None, 4096) ? ? ? ? ? ? ?16781312 ?
_________________________________________________________________
dropout_1 (Dropout) ? ? ? ? ?(None, 4096) ? ? ? ? ? ? ?0 ? ? ? ??
_________________________________________________________________
dense_2 (Dense) ? ? ? ? ? ? ?(None, 1000) ? ? ? ? ? ? ?4097000 ??
=================================================================
Total params: 226,791,720
Trainable params: 226,791,720
Non-trainable params: 0
_________________________________________________________________
?
表1.5  通過 Keras summary() 函數得到的 AlexNet 參數數量
#!/usr/bin/env python
#-*- coding: utf-8 -*-import tensorflow as tf
from tensorflow.keras import layers, modelsdef build_alexnet(input_shape=(224, 224, 3), num_classes=1000):"""構建AlexNet模型"""model = models.Sequential()# 第1層:卷積 + 池化model.add(layers.Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu',input_shape=input_shape))model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))# 第2層:卷積 + 池化model.add(layers.Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu'))model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))# 第3層:卷積 + 池化model.add(layers.Conv2D(128, kernel_size=(3, 3), padding='same', activation='relu'))model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))# 第4層:卷積 + 池化model.add(layers.Conv2D(256, kernel_size=(3, 3), padding='same', activation='relu'))model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=2))# 全連接層model.add(layers.Flatten())model.add(layers.Dense(4096, activation='relu'))model.add(layers.Dropout(0.5))model.add(layers.Dense(4096, activation='relu'))model.add(layers.Dropout(0.5))model.add(layers.Dense(num_classes, activation='softmax'))return model# 構建模型并打印參數統計
alexnet = build_alexnet(input_shape=(224, 224, 3))
alexnet.summary()

1.6 tanh 的函數曲線
1.7 sigmoid 的函數曲線
飽和現象帶來了一個深度學習中非常嚴重的問題,那便是 梯度消失 。梯度消失是由反向傳播中
鏈式法則的乘法特性導致的,反映在深度學習的訓練過程中便是越接近損失函數的參數梯度越大,
從而使得這一部分參數成為主要學習的參數,而遠離損失函數的參數的梯度則非常接近 0 ,導致幾
乎沒有梯度傳到這一部分參數,從而使得這一部分參數很難學習到。
為了解決這個問題, AlexNet 引入了 ReLU 激活函數,如式( 1.4 )所示。

ReLU 的函數曲線如圖 1.8 所示。
ReLU 中,無論 x 的取值有多大, f ( x ) 的導數都是 1 ,也就不存在導數小于 1 導致的 梯度消失 的現象了。圖 1.9 所示的是我們在 MNIST 數據集上,根據 LeNet-5 使用 tanh ReLU 兩個激活函數得到的不同模型的收斂情況,旨在對比兩個不同的激活函數的模型效果。
1.8 ReLU 的函數曲線
1.9 LeNet-5 使用不同激活函數的收斂情況
此外,由于 ReLU 將小于 0 的部分全部置 0 ,因此 ReLU 的另外一個特點就是具有稀疏性,不
僅可以優化網絡的性能, 還可以緩解過擬合現象。
雖然使用 ReLU 的節點不會有飽和問題,但是會“死掉”,即大部分甚至所有的值為負值,從
而導致該層的梯度都為 0 。“死神經元”是由進入網絡的負值引起的(例如在大規模的梯度更新之
后可能出現),減小學習率能緩解該現象。
3LRN
局部響應歸一化( local response normalization LRN )模擬的是動物神經中的橫向抑制效應,是
一個已經被淘汰的算法。在 VGG 1 的相關論文中已經指出, LRN 并沒有什么效果。在現在的網絡中, LRN 已經被其他歸一化方法所替代,例如在上面代碼中使用的批歸一( batchnormalization BN 2 。 LRN 是使用同一位置臨近的特征圖來歸一化當前特征圖的值的一種方法,其表達式如式( 1.5 )所示:

其中, N 表示特征圖的數量, a 是輸入特征圖, b 是輸出特征圖, ( x, y ) 是特征圖上的坐標, n = 5 k = 2 α = 0.5 β = 0.75 ,這些值均由驗證集得出。
另外, AlexNet LRN 放在池化層之前,這在計算上是非常不經濟的,一種更好的做法是把
LRN 放在池化層之后。

4. 覆蓋池化(Overlap Pooling)

定義?
當池化窗口的步長(stride)小于池化核尺寸時,相鄰池化核會在輸入特征圖上產生重疊區域,這種池化方式稱為覆蓋池化(Overlap Pooling)。

原理與優勢?

  1. ?緩解過擬合:通過允許特征圖不同區域的重復采樣,增加模型對局部特征位置的魯棒性
  2. ?信息保留:相比非重疊池化,能減少特征信息的丟失(如圖1.10所示)
  3. ?計算效率:與全連接層相比,仍保持較低的計算復雜度

文獻依據?
AlexNet[1]提出該技術可有效提升模型泛化能力,實驗表明其對模型性能的提升具有顯著作用。


5. Dropout正則化

技術原理?
在訓練階段隨機將神經網絡層的部分神經元權重置零(通常設置比例為30%-50%),測試階段保留所有神經元。其核心思想是通過強制網絡學習冗余特征,增強模型的抗干擾能力。

在AlexNet中的應用?

  1. ?實施位置:全連接層的第1和第2層之間(即D1和D2層)
  2. ?超參數配置

    python

    model.add(layers.Dropout(0.5))  # 50%神經元隨機屏蔽

有效性分析?

  1. ?訓練代價:增加約15%-20%的訓練時間(因每次迭代需計算不同子網絡)

  2. ?泛化提升

    正則化方法訓練集損失測試集準確率
    0.01550.9826
    Dropout0.0735?0.9841?
  3. ?生物學解釋:模擬人腦神經元的隨機失活機制,增強特征選擇的魯棒性

實施要點?

  • 應用在全連接層而非卷積層
  • 需要配合訓練/測試模式切換(Keras自動處理)
  • 推薦與Early Stopping結合使用

圖表引用說明?

圖1.10展示了添加Dropout后的損失曲線變化趨勢,具體數值可參見附錄A的MNIST實驗結果表格。

1.10  有 Dropout 與沒有 Dropout 對比

1.2更深:VGG

1. VGG網絡概述

2014年牛津大學Visual Geometry Group提出的VGG網絡[1],通過系統性探索CNN深度與性能關系,在ImageNet ILSVRC競賽中取得突破性成果(物體分類第二名,物體檢測第一名)。其核心創新在于采用小尺寸卷積核構建深層網絡,并通過模塊化設計實現參數數量的漸進式增長。


2. 網絡架構設計原則

2.1 模塊化分層結構
  • ?池化層設計:采用2×2最大池化層,網絡按池化層自然劃分為多個特征塊
  • ?塊內特性
    • 每個塊包含連續的相同尺寸卷積層(均為3×3)
    • 特征圖通道數逐塊倍增(64→128→256→512→512)
  • ?尺寸控制機制:每增加一個塊,特征圖尺寸縮小一半(通過池化層實現),確保參數規模可控
2.2 參數擴展策略
參數維度擴展規則典型配置
深度塊數可變(推薦≥16層)VGG-16(5塊)
寬度特征圖通道數按指數增長(2^N)64,128,256,512
卷積層數塊內卷積層數可調(不影響特征圖尺寸)常規配置3-4層/塊

3. 核心技術創新

3.1 小卷積核優勢

理論依據:通過多層3×3卷積替代單層大卷積核(如7×7),在保持相同感受野(rfsize = (out-1)*s + k)的同時獲得:

  1. ?深度增強:三層級3×3卷積提供更復雜的特征表達
  2. ?參數效率:3×3卷積參數量為7×7卷積的121?(不考慮填充)
  3. ?計算加速:小卷積核更適合GPU并行計算
3.2 特征金字塔結構
  • ?層級特征提取:通過逐層池化構建多尺度特征金字塔
  • ?決策融合:全連接層整合多層級特征提升分類精度

4. 典型網絡變體

網絡型號總層數塊數特征圖尺寸演變全連接層維度
VGG-1111層4塊224×224 →7×74096×4096×1000
VGG-1616層5塊224×224 →7×74096×4096×1000
VGG-1919層6塊224×224 →7×74096×4096×1000

5. 實踐價值分析

5.1 遷移學習能力
  • 輸入自適應:通過調整池化次數適配不同分辨率數據(如MNIST:28×28)
  • 特征復用:預訓練模型參數可快速遷移到目標檢測、語義分割等任務
5.2 商業應用影響
  • 開源生態:官方提供Caffe/TensorFlow等框架實現,GitHub星標超50k+
  • 行業部署:被廣泛應用于安防監控、醫療影像分析等領域

6. 性能對比(ILSVRC 2014)

方法準確率排名參數量(M)
GoogLeNet274.8%1st22M
VGG-1671.5%2nd138M
AlexNet57.1%11th8.5M

7. 技術啟示

  1. ?深度優先設計:證明增加網絡深度比單純擴大寬度更能提升特征表征能力
  2. ?模塊化工程:通過標準化塊結構降低網絡設計復雜度
  3. ?小核優勢:奠定了后續ResNet等網絡采用小卷積核的基礎

1.11 VGG 家族
假設特征圖的數量都是 C 3 3 × 3 卷積核的參數數量是 3 × (3 × 3+1) × C 2 =30 C 2 1
7 × 7 卷積核的參數數量是 1 × (7 × 7+1) × C 2 =50 C 2 3 3 × 3 卷積核具有更少的參數。
由于神經元數量和層數的增多,訓練速度會變得更慢。
1.12 反映了 VGG 家族的各個模型的性能。
1.12 VGG 家族的各個模型的性能對比
1.13 展示了把 LeNet-5 的單層 5 × 5 卷積換成兩層 3 × 3 卷積在 MNIST 上的收斂表現。論文中
的實驗表明兩層 3 × 3 卷積的網絡確實比單層 5 × 5 卷積的網絡表現好,但是訓練速度慢了二分之一。
另外,作者在前兩層的全連接處使用丟失率為 0.5 Dropout ,然而并沒有在圖 1.11 中反映
出來。
2 VGG-A vs VGG-A-LRN
VGG-A-LRN VGG-A 多了一個 AlexNet 介紹的 LRN 層,但是實驗數據表明加入了 LRN
VGG-A-LRN 的錯誤率反而更高了,而且 LRN 的加入會更加占用內存,增加訓練時間。

1.13  單層 5 × 5 卷積的 LeNet 與兩層 3 × 3 卷積的 LeNet 對比

3. VGG系列網絡變體對比分析

3.1 深度-性能關系研究

通過對VGG-A(11層)、VGG-B(13層)、VGG-D(16層)、VGG-E(19層)的實驗對比,觀察到以下規律:

模型總層數訓練誤差率測試誤差率訓練時間(相對VGG-A)
VGG-A11-7.12%
VGG-B13-6.81%1.2×
VGG-D16-6.47%2.5×
VGG-E19-6.35%4.8×

關鍵現象

  1. 深度增加初期錯誤率顯著下降(VGG-A→VGG-D誤差率降低0.65%)
  2. 深度超過臨界點(VGG-D之后)出現收益遞減
  3. 最深層模型(VGG-E)訓練時間呈指數級增長

退化問題
當網絡深度達到19層時,出現以下異常現象:

  • 訓練誤差波動加劇(標準差較VGG-D增加18%)
  • 某些測試集上錯誤率反超較淺層模型(如CIFAR-10數據集)

3.2 結構改進方案對比
3.2.1 VGG-B與VGG-C

改進要點

  • 在VGG-B全連接層前添加3個1×1卷積層
  • 實現通道維度從512→512→512→512的擴展

性能提升

模型測試誤差率參數增量訓練時間
VGG-B6.81%-1.2×
VGG-C6.59%+1.2M1.3×

技術優勢

  1. 1×1卷積在不改變感受野的條件下:
    • 增強特征空間維度
    • 實現跨通道特征加權
    • 提升非線性表達能力
3.2.2 VGG-C與VGG-D

改進方案
將VGG-C的1×1卷積替換為3×3卷積層

效果對比

模型測試誤差率參數增量訓練速度
VGG-C6.59%+1.2M1.3×
VGG-D6.47%+2.4M1.5×

改進結論

  • 3×3卷積在參數效率(參數增量/錯誤率下降)上優于1×1卷積
  • 更適合捕捉局部特征相關性

3.3 模型選擇準則

基于實驗數據建立網絡選擇決策樹:

mermaid

graph TD
A[目標數據集] -->|ImageNet全尺寸| B(VGG-D)
A -->|中小尺寸圖像| C(VGG-B/C)
B -->|精度優先| D(VGG-E)
B -->|訓練效率優先| E(VGG-D)
C -->|實時性要求| F(VGG-B)
C -->|特征表達需求| G(VGG-C)

4. 訓練方法優化

4.1 尺度歸一化策略

單尺度訓練

  • 固定短邊長度S∈{256,384}
  • 等比例縮放后裁剪224×224區域

多尺度訓練

  • S∈[256,512]隨機采樣
  • 引入圖像尺度多樣性提升魯棒性

效果對比

方法推理速度訓練誤差率
Single-scale6.67%
Multi-scale0.8×6.21%

5. 實際應用建議

  1. ?工業部署推薦

    • VGG-D(16層)在精度/計算效率間取得最佳平衡
    • 移動端場景建議使用VGG-B(13層)壓縮版本
  2. ?研究場景建議

    • 對比實驗優先選用VGG-B/VGG-C作為基準模型
    • 極端深度場景可嘗試VGG-E配合殘差連接

6. 技術演進啟示

  1. ?深度瓶頸:VGG系列揭示了簡單堆疊卷積層的局限性
  2. ?連接革命:為后續ResNet等殘差網絡奠定基礎
  3. ?核尺寸選擇:證明3×3卷積在參數效率和表征能力間的最優性

5.關注文章后續更新

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

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

相關文章

弧度與角度之間的轉換公式

Radian 弧度的英語 簡稱 Rad Degree 角度的英語 簡稱 Deg 角度轉弧度 RadDeg*180/π CogMuisc.DegToRad(double degress) DegRad/180*π CogMuisc.RadToDeg(double radians) 總結: 角度大 弧度小 弧度轉角度 肯定要乘以一個大于1的數 那就是…

css之英文換行樣式

在 CSS 中,要實現英文文本自動換行但不從單詞中間斷開的效果,可以使用 word-wrap 或 overflow-wrap 屬性。以下是相關的 CSS 屬性和它們的配置: 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…

40歲開始學Java:Java中單例模式(Singleton Pattern),適用場景有哪些?

在Java中,單例模式(Singleton Pattern)用于確保一個類只有一個實例,并提供全局訪問點。以下是詳細的實現方式、適用場景及注意事項: 一、單例模式的實現方式 1. 餓漢式(Eager Initialization) …

【前端基礎】3、HTML的常用元素(h、p、img、a、iframe、div、span)、不常用元素(strong、i、code、br)

HTML結構 一個HTML包含以下部分&#xff1a; 文檔類型聲明html元素 head元素body元素 例&#xff08;CSDN&#xff09;&#xff1a; 一、文檔類型聲明 HTML最一方的文檔稱為&#xff1a;文檔類型聲明&#xff0c;用于聲明文檔類型。即&#xff1a;<!DOCTYPE html>…

文本挖掘+情感分析+主題建模+K-Meas聚類+詞頻統計+詞云(景區游客評論情感分析)

本文通過情感分析技術對景區游客評論進行深入挖掘,結合數據預處理、情感分類和文本挖掘,分析游客評價與情感傾向。利用樸素貝葉斯和SVM等模型進行情感預測,探討滿意度與情感的關系。通過KMeans聚類和LDA主題分析,提取游客關心的話題,提供優化建議,為未來研究提供方向。 …

【實戰 ES】實戰 Elasticsearch:快速上手與深度實踐-2.2.2線程池配置與寫入限流

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 Elasticsearch批量寫入性能調優&#xff1a;2.2.2 線程池配置與寫入限流深度實踐1. 線程池核心機制解析1.1 Elasticsearch線程池架構1.2 Bulk線程池工作模型 2. 寫入場景線程…

VSCode 與 Vim 插件 的 復制粘貼等快捷鍵沖突,優先使用 VSCode 的快捷鍵

VSCode 與 Vim 插件 的 復制粘貼等快捷鍵沖突&#xff0c;優先使用 VSCode 的快捷鍵 在 VSCode 中&#xff0c;如果你發現 Vim 插件&#xff08;如 VSCodeVim 擴展&#xff09;與 VSCode 的默認復制粘貼快捷鍵&#xff08;CtrlC / CtrlV&#xff09;沖突&#xff0c;并且你想優…

tsconfig.json 配置清單

tsconfig.json 配置清單 基礎結構 {"compilerOptions": {// 編譯選項},"include": [// 指定需要編譯的文件或目錄],"exclude": [// 指定不需要編譯的文件或目錄],"extends": "./base-tsconfig.json","files": […

springboot可以同時處理多少個請求

源碼 ServerProperties Tomcat 配置 參數解析 必須要先建立連接&#xff0c;再用線程處理。 比如max-connection最大連接數&#xff0c;accept-count相當于隊列容量。總連接數二者和 min-spare-treads 核心線程數默認10&#xff0c;max-threads最大線程數默認200。 正常…

Spring 三級緩存 vs 二級緩存:深度解析循環依賴的終極解決方案

目錄 一. 循環依賴的本質矛盾 1. 什么是循環依賴&#xff1f; 2. 矛盾的核心 二. 三級緩存架構解析 三級緩存工作流程圖?編輯 三、為什么必須三級緩存&#xff1f; 1. 二級緩存的致命缺陷 2. 三級緩存的精妙設計 四、場景推演&#xff1a;三級緩存如何解決代理問題 …

視頻流暢播放相關因素

視頻播放的流暢度是一個綜合性問題&#xff0c;涉及從視頻文件本身到硬件性能、網絡環境、軟件優化等多個環節。以下是影響流暢度的關鍵因素及優化建議&#xff1a; 一、視頻文件本身 1. 分辨率與幀率 1.問題&#xff1a;高分辨率&#xff08;如4K&#xff09;或高幀率&#…

金融項目實戰

測試流程 測試流程 功能測試流程 功能測試流程 需求評審制定測試計劃編寫測試用例和評審用例執行缺陷管理測試報告 接口測試流程 接口測試流程 需求評審制定測試計劃分析api文檔編寫測試用例搭建測試環境編寫腳本執行腳本缺陷管理測試報告 測試步驟 測試步驟 需求評審 需求評…

LeetCode 25 - K 個一組翻轉鏈表

LeetCode 25 - K 個一組翻轉鏈表 這道題是一個典型的鏈表操作題&#xff0c;考察我們對鏈表的精確操作&#xff0c;包括反轉鏈表、分組處理、遞歸和迭代的結合應用等。還可以通過變體問題延伸到優先隊列操作、歸并、分塊等&#xff0c;這使得它成為面試中的高頻考題之一。 題目…

Leetcode 54: 螺旋矩陣

Leetcode 54: 螺旋矩陣 是一道經典的矩陣遍歷模擬題目&#xff0c;要求我們以螺旋順序遍歷一個二維數組。這個問題在面試中非常經典&#xff0c;考察模擬、數組操作以及邏輯清晰度。掌握本題的高效解法可以迅速給面試官留下好印象。 適合面試的解法&#xff1a;邊界法&#xff…

abseil-cpp:環境搭建

參考: https://abseil.io/docs/cpp/quickstart-cmake abseil-cpp.git/dd4c89b abseil-cpp.git/20240722.1 1. clone代碼倉庫、編譯 git clone https://github.com/abseil/abseil-cpp.git /app/abseil-cpp/ #/app/abseil-cpp/.git/config git checkout 20240722.1git rev-pa…

Storm實時流式計算系統(全解)——下

storm編程案例-網站訪問來源實時統計-需求 storm編程-網站訪問來源實時統計-代碼實現 根據以上條件可以只寫一個類&#xff0c;我們只需要寫2個方法和一個main&#xff08;&#xff09;&#xff0c;一個讀取/發射&#xff08;spout&#xff09;。 一個拿到數據統計后發到redis…

什么是SYN洪范攻擊?

文章目錄 一、什么是SYN洪范攻擊&#xff1f;二、SYN泛洪攻擊原理2.1 TCP 三次握手過程2.2 SYN攻擊過程 三、防御措施 一、什么是SYN洪范攻擊&#xff1f; SYN洪泛攻擊&#xff08;SYN Flood&#xff09;發生在OSI第四層&#xff0c;是一種基于?TCP協議三次握手漏洞?的DoS&a…

【嵌入式】MQTT

MQTT 文章目錄 MQTT安裝簡介MQTT客戶端代碼 安裝 安裝Paho MQTT C庫: sudo apt-get install libpaho-mqtt3-dev頭文件包含&#xff1a; #include "MQTTClient.h"編譯選項&#xff1a; gcc -o $ $^ -lpaho-mqtt3c簡介 MQTT協議全稱是&#xff08;Message Queuing…

ubuntu離線安裝nvidia-container-runtime

參考文章 ubuntu系統docker20.4版本安裝nvidia-container-runtime3.11.0-1版本(離線安裝nvidia-docker) - jokerMM - 博客園 https://zhuanlan.zhihu.com/p/15194336245 一、軟件地址 Index of /nvidia-docker/libnvidia-container/stable/ 從上述地地址——進入對應系統—…

用Python+Flask打造可視化武俠人物關系圖生成器:從零到一的實戰全記錄

用PythonFlask打造可視化武俠人物關系圖生成器&#xff1a;從零到一的實戰全記錄 一、緣起&#xff1a;一個程序小白的奇妙探索之旅 作為一個接觸Python僅13天的編程萌新&#xff0c;我曾以為開發一個完整的應用是遙不可及的事情。但在DeepSeek的幫助下&#xff0c;我竟用短短…