卷積神經網絡(Convolutional Neural Network,CNN)是深度學習中最重要的模型結構之一,尤其適合處理圖像、視頻等具有空間結構的數據。與普通(MLP)直接把輸入展開為一維向量不同,卷積神經網絡會盡量保留圖像中的局部鄰域關系,通過卷積核在圖像上滑動,自動學習邊緣、紋理、形狀等層級特征。
MLP 可以通過多層“線性變換 + 非線性激活”學習復雜非線性關系。但是,如果直接用 MLP 處理圖像,通常需要把二維圖像展開成一維向量,這會削弱圖像原有的空間結構信息。
![]()
圖 1:從 MLP 到卷積神經網絡
卷積神經網絡正是為了解決這類問題而發展起來的。它通過局部連接、權重共享、特征圖、池化等機制,使模型能夠更有效地從圖像中提取空間特征,并逐層形成從低級視覺特征到高級語義特征的表示。
一、為什么需要卷積神經網絡
圖像數據與普通表格數據不同。
在表格數據中,每一列通常表示一個明確特征,例如面積、樓齡、收入、消費次數等。而在圖像中,每個像素本身并不總是具有獨立語義。一個像素是否重要,往往取決于它周圍像素的排列關系。
例如,在一張手寫數字圖片中:
? 相鄰像素共同形成筆畫
? 筆畫組合形成局部結構
? 局部結構進一步組合成數字整體
? 數字類別取決于這些空間結構的整體模式
如果把圖像直接展平成一維向量,再交給 MLP 處理,模型雖然仍然可以訓練,但會遇到幾個問題。
第一,空間結構被削弱。
原本相鄰的像素在展平后可能相距很遠,模型不容易直接利用局部鄰域關系。
第二,參數數量可能過大。
如果一張圖像大小為 224 × 224 × 3,展平后就是 150528 個輸入值。若直接連接到一個有 1000 個神經元的隱藏層,僅第一層就會產生大量參數。
第三,模型難以自動利用平移不變性。
圖像中的同一個邊緣、紋理或局部形狀,可能出現在不同位置。普通全連接網絡需要在不同位置重復學習類似特征。
卷積神經網絡的基本思想是:用較小的卷積核在圖像上滑動,在不同位置重復檢測相同局部模式。
這樣做帶來兩個重要好處:
? 局部連接:每個神經元只關注局部區域
? 權重共享:同一個卷積核在整張圖像上重復使用
因此,CNN 比普通 MLP 更適合處理圖像這類具有空間結構的數據。
二、卷積運算的基本思想
卷積神經網絡的核心操作是(Convolution)。在圖像處理中,可以把卷積理解為:用一個小矩陣在圖像上滑動,并對局部區域進行加權求和。
這個小矩陣通常稱為卷積核(Kernel)或濾波器(Filter)。
![]()
圖 2:卷積核在圖像上滑動并生成特征圖
假設輸入圖像是一個二維矩陣,卷積核也是一個較小的二維矩陣。卷積核每次覆蓋圖像中的一個局部區域,然后把對應位置相乘并求和,得到輸出特征圖中的一個數值。
對于二維輸入,簡化的卷積計算可以寫為:
其中:
? X 表示輸入圖像或輸入特征圖
? K 表示卷積核
? S(i,j) 表示輸出特征圖在位置 (i,j) 的值
? m、n 表示卷積核內部的位置索引
? ∑ 表示對局部區域內的元素求和
從直觀角度看,卷積核像一個“局部模式檢測器”。
不同卷積核可以學習不同視覺模式:
? 有的卷積核可能檢測水平邊緣
? 有的卷積核可能檢測垂直邊緣
? 有的卷積核可能檢測斜線紋理
? 更深層的卷積核可能檢測局部形狀或物體部件
在 PyTorch 中,torch.nn.Conv2d 用于對由多個輸入平面組成的輸入信號執行二維卷積,常用于圖像特征提取。
三、卷積層的關鍵概念
理解 CNN,需要掌握幾個核心概念:卷積核、步幅、填充、通道和特征圖。
![]()
圖 3:卷積層中的卷積核、通道與特征圖
1、卷積核:局部特征檢測器
是一個可學習的小矩陣。訓練開始時,卷積核中的數值通常是隨機初始化的;訓練過程中,模型會通過反向傳播不斷調整這些數值,使卷積核逐漸學會對任務有用的局部模式。
例如,一個 3 × 3 卷積核可以寫成:
其中:
? K 表示卷積核
? k??、k??、…、k?? 表示卷積核中的可學習參數
? 3 × 3 表示卷積核覆蓋的局部區域大小
卷積核越大,每次看到的局部區域越大;卷積核越小,計算更輕量,也更容易堆疊成深層結構。
在現代 CNN 中,3 × 3 卷積非常常見,因為它既能捕捉局部結構,又具有較好的計算效率。
2、步幅:卷積核每次移動的距離
步幅(Stride)表示卷積核每次滑動的距離。
如果 stride = 1,卷積核每次移動 1 個像素;如果 stride = 2,卷積核每次移動 2 個像素。
步幅越大,輸出特征圖的尺寸通常越小。
可以簡單理解為:
? 小步幅:保留更多空間細節
? 大步幅:更快降低特征圖尺寸
3、填充:控制邊緣信息與輸出尺寸
填充(Padding)是在輸入圖像邊緣補充額外像素,常見做法是在邊緣補 0。
填充的作用主要有兩個:
? 讓卷積核能夠覆蓋圖像邊緣區域
? 控制輸出特征圖的空間尺寸
如果沒有填充,卷積核在滑動時無法完全覆蓋邊緣像素,輸出尺寸會逐層變小。適當填充可以緩解這一問題。
4、通道:從灰度圖到彩色圖
圖像通常具有通道(Channel)。
例如:
? 灰度圖通常有 1 個通道
? 彩色 RGB 圖像通常有 3 個通道
? 卷積層輸出的特征圖也可以有多個通道
在 CNN 中,每個輸出通道通常對應一個卷積核學習到的一類特征。多個卷積核會生成多個輸出通道,也就是多張特征圖。
例如,一個卷積層可以把輸入從 3 個通道變成 32 個通道:
nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3)其中:
? in_channels=3 表示輸入有 3 個通道
? out_channels=32 表示輸出 32 個特征通道
? kernel_size=3 表示使用 3 × 3 卷積核
在 PyTorch 中,二維卷積層的輸入通常具有形狀 N、C、H、W,分別表示批量大小、通道數、高度和寬度;Conv2d 的 in_channels 和 out_channels 用來指定輸入與輸出通道數量。
5、特征圖:卷積層的輸出
卷積層的輸出稱為特征圖(Feature Map)。一張特征圖可以理解為某個卷積核在圖像不同位置上的響應強度。
如果某個位置與卷積核學習到的模式相似,響應值通常較高;如果不相似,響應值可能較低。
從直觀角度看,特征圖回答的是:某種局部模式在圖像的哪些位置出現得比較明顯?
隨著網絡層數加深,特征圖表達的內容也會逐漸抽象:
→ 類別相關語義四、池化層與空間尺寸壓縮
卷積層負責提取局部特征,但如果一直保留完整空間尺寸,計算量會很大,而且模型可能過度關注細節位置。
(Pooling Layer)用于降低特征圖的空間尺寸,同時保留主要響應信息。
最常見的是最大池化(Max Pooling)。它在局部區域中取最大值,例如在 2 × 2 區域中選出最大響應。
![]()
圖 4:最大池化如何壓縮特征圖尺寸
最大池化可以寫為:
其中:
? X 表示輸入特征圖
? Y(i,j) 表示池化后在位置 (i,j) 的值
? R(i,j) 表示當前位置對應的局部區域
? max 表示取最大值
從直觀角度看,最大池化保留的是局部區域中最明顯的特征響應。
池化層的作用包括:
? 降低特征圖尺寸
? 減少計算量
? 增強一定程度的位置魯棒性
? 保留局部區域中最顯著的特征
例如,一個 2 × 2 最大池化層通常會把特征圖的高和寬約縮小一半。
在 PyTorch 中,torch.nn.MaxPool2d 用于對由多個輸入平面組成的輸入信號執行二維最大池化,輸入形狀通常也按 N、C、H、W 組織。
需要注意的是,池化并不是 CNN 中唯一的下采樣方式。現代網絡中,也常用步幅卷積(Strided Convolution)來替代部分池化操作。
五、CNN 的典型結構
一個基礎 CNN 通常由三類模塊組成:
卷積層 → 激活函數 → 池化層 → 全連接層 → 輸出層
更具體地說,常見圖像分類 CNN 可以寫成:
→ 輸出類別得分其中:
? 卷積層負責提取局部特征
? ReLU 負責引入非線性
? 池化層負責壓縮空間尺寸
? 展平操作把多維特征圖轉換成一維向量
? 全連接層負責綜合特征并輸出類別得分
![]()
圖 5:卷積神經網絡的典型結構
在圖像分類任務中,CNN 的前半部分通常稱為特征提取器,后半部分通常稱為分類器。
可以簡單理解為:
? 特征提取器:從圖像中提取有用視覺特征
? 分類器:根據這些特征判斷類別
例如,對于手寫數字識別任務,前面的卷積層可能學習筆畫、彎曲結構、局部紋理等特征,后面的全連接層則根據這些特征判斷數字類別。
六、CNN 為什么適合圖像任務
CNN 適合圖像任務,主要來自三個結構優勢:局部感受野、權重共享和層級特征學習。
1、局部感受野
局部感受野(Local Receptive Field)表示一個神經元只關注輸入中的局部區域。
在圖像中,局部像素往往具有強相關性。例如,一個邊緣通常由相鄰像素共同形成。卷積層利用局部感受野,可以優先學習這些局部結構,而不必一開始就連接整張圖像。
這比普通全連接層更符合圖像數據的空間規律。
2、權重共享
權重共享(Weight Sharing)表示同一個卷積核在圖像不同位置重復使用。
如果一個卷積核學會檢測某種邊緣模式,那么它可以在整張圖像的不同位置檢測同樣的模式。
這帶來兩個好處:
? 大幅減少參數數量
? 提高對位置變化的適應能力
例如,同一個豎直邊緣可能出現在圖像左側、右側或中間。通過權重共享,CNN 不需要為每個位置單獨學習一套參數。
3、層級特征學習
CNN 的淺層通常學習低級特征,深層逐漸學習更抽象的高級特征。
可以粗略理解為:
? 淺層:邊緣、角點、紋理
? 中層:局部形狀、部件
? 深層:物體結構、類別語義
這種層級特征學習能力,是 CNN 在圖像識別任務中表現優異的重要原因。
4、與 MLP 的對比
如果用 MLP 直接處理圖像,通常需要展平輸入。這樣會削弱空間結構,同時帶來大量參數。
而 CNN 在卷積階段保留了圖像的二維結構,通過局部連接和權重共享更高效地提取空間特征。
![]()
圖 6:MLP 與 CNN 處理圖像方式的對比
可以簡單對比為:
? MLP:把圖像展平成向量,再進行全連接計算
? CNN:保留圖像空間結構,用卷積核逐層提取局部特征
七、PyTorch 實現:手寫數字分類 CNN
下面使用 PyTorch 構建一個簡單 CNN,完成 MNIST 手寫數字分類任務。
![]()
圖 7:CNN 在 MNIST 上的訓練與預測流程
MNIST 是經典手寫數字圖像數據集,圖像為 0 到 9 的數字類別。Torchvision 提供了 torchvision.datasets.MNIST 數據集接口,可以通過 root、train、transform、target_transform、download 等參數加載數據。
1、導入庫并設置環境
這里使用:
? torch.nn 定義神經網絡層
? torch.optim 定義優化器
? DataLoader 按小批量加載數據
? torchvision.datasets 加載 MNIST 數據集
? torchvision.transforms 進行圖像預處理
2、準備 MNIST 數據集
其中:
? ToTensor() 將圖像轉換為張量
? Normalize() 對圖像進行標準化
? train=True 表示加載訓練集
? train=False 表示加載測試集
? download=True 表示如果本地沒有數據則自動下載
? DataLoader 用于按批量讀取數據
MNIST 是灰度圖像,因此輸入通道數為 1。每張圖片大小為 28 × 28。
3、定義 CNN 模型
這個 CNN 可以分為兩部分。
第一部分是特征提取器:
Conv2d → ReLU → MaxPool2d → Conv2d → ReLU → MaxPool2d
第二部分是分類器:
Flatten → Linear → ReLU → Linear
輸入圖像尺寸變化過程為:
輸出:10 個類別得分其中:
? 第一個卷積層把 1 個輸入通道變成 16 個特征通道
? 第二個卷積層把 16 個通道變成 32 個通道
? 兩次最大池化分別把空間尺寸減半
? 最后一層輸出 10 個類別得分,對應數字 0 到 9
4、定義損失函數和優化器
其中:
? CrossEntropyLoss 用于多分類任務
? Adam 是常用優化器,lr=0.001 表示學習率,model.parameters() 表示把模型所有可訓練參數交給優化器
需要注意,CrossEntropyLoss() 直接接收模型輸出的 logits,不需要在模型最后手動添加 Softmax。PyTorch 文檔說明,CrossEntropyLoss 可用于 C 類分類任務,并計算輸入 logits 與目標類別之間的交叉熵損失。
5、訓練模型
這段訓練代碼體現了 PyTorch 中最常見的訓練閉環:
前向傳播 → 計算損失 → 清空舊梯度 → 反向傳播 → 更新參數
其中:
? model.train() 表示進入訓練模式
? outputs = model(images) 表示前向傳播
? loss = criterion(outputs, labels) 表示計算損失
? optimizer.zero_grad() 用于清空舊梯度
? loss.backward() 用于自動計算梯度
? optimizer.step() 用于更新參數
6、評估模型
其中:
? model.eval() 表示進入評估模式
? torch.no_grad() 表示不計算梯度
? outputs.argmax(dim=1) 取最大得分對應的類別
? accuracy 表示測試集準確率
對于多分類任務,模型輸出的是 10 個類別得分。哪個類別得分最高,模型就預測為哪個數字。
7、查看單個批次的形狀變化
為了幫助理解 CNN 中張量形狀的變化,可以打印一個批次的輸入和輸出形狀:
可能看到類似結果:
輸出結果形狀: torch.Size([64, 10])其中:
? 64 表示 batch_size
? 1 表示灰度圖像通道數
? 28 × 28 表示圖像高和寬
? 10 表示 10 個類別得分
這說明模型把一批 28 × 28 的手寫數字圖像,轉換成了對應 10 個類別的預測得分。
八、CNN 的適用場景、局限與擴展方向
卷積神經網絡是計算機視覺中的基礎模型之一。它非常適合處理具有空間結構的數據,但也并不是所有任務中的唯一選擇。
![]()
圖 8:CNN 的適用場景、局限與擴展方向
1、適用場景
CNN 常用于圖像和視覺相關任務,例如:
? 圖像分類
? 目標檢測
? 圖像分割
? 人臉識別
? 醫學影像分析
? 遙感圖像分析
? 視頻理解中的局部空間特征提取
在這些任務中,局部結構和空間模式通常很重要,因此 CNN 具有天然優勢。
2、主要優勢
CNN 的主要優勢包括:
? 能保留圖像空間結構
? 參數量相對全連接網絡更少
? 能自動學習局部特征
? 對局部平移具有一定魯棒性
? 能逐層形成從低級到高級的視覺表示
? 適合作為復雜視覺模型的基礎模塊
其中,局部連接和權重共享是 CNN 高效處理圖像的重要原因。
3、主要局限
CNN 也有一些局限:
? 對大規模數據和算力有一定需求
? 深層 CNN 訓練時需要合理初始化、歸一化和優化策略
? 對長距離依賴關系的建模能力有限
? 對圖像外的結構化表格數據未必優于傳統方法
? 對旋轉、尺度變化等復雜變換仍可能需要數據增強或特殊結構
在一些現代視覺任務中,CNN 常與注意力機制、Transformer 或多尺度結構結合,以提升特征表達能力。
4、擴展方向
從基礎 CNN 出發,可以繼續學習以下模型和技術:
? LeNet:早期經典 CNN
? AlexNet:推動深度 CNN 發展的代表模型
? VGG:使用小卷積核堆疊深層網絡
? ResNet:通過殘差連接緩解深層網絡訓練困難
? U-Net:常用于醫學圖像分割
? YOLO:常用于目標檢測
? Vision Transformer:將 Transformer 引入視覺任務
這些模型雖然結構更復雜,但都可以從卷積、特征圖、下采樣、非線性激活和端到端訓練等基礎思想出發理解。
小結
卷積神經網絡通過卷積核、局部連接、權重共享和池化等機制,更有效地處理圖像中的空間結構。它能夠逐層學習從邊緣、紋理到形狀和類別語義的視覺特征,是計算機視覺中的基礎模型。理解 CNN,有助于繼續學習 ResNet、U-Net、YOLO 和 Vision Transformer 等更復雜的視覺模型。
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.