本文目錄:
- 一、CNN概述
- 二、CNN日常應用
- 三、CNN的卷積層
- (一 )基本介紹
- (二)卷積層計算
- 1.對輸入數據的要求
- 2.卷積核核心參數
- 3.計算過程
- 4.特征圖尺寸計算
- 5.1、多通道卷積計算
- 5.2、多卷積核計算
- 6.PyTorch卷積層API
前言:上篇文章講解了圖像,這篇文章正式進入卷積神經網絡講解。
一、CNN概述
卷積神經網絡(Convolutional Neural Network, CNN)是一種專門用于處理網格狀數據(如圖像、視頻、語音信號等)的深度學習模型。其核心思想是通過局部感受野、權值共享和空間下采樣來高效提取特征,廣泛應用于計算機視覺、自然語言處理(如文本分類)等領域。
CNN網絡主要由三部分構成:卷積層、池化層和全連接層構成:
(1)卷積層負責提取圖像中的局部特征;
(2)池化層用來大幅降低參數量級(降維);
(3)全連接層類似人工神經網絡的部分,用來輸出想要的結果。
CNN實踐案例:
上圖中CNN要做的事情就是:給定一張圖片,是車還是馬未知,是什么車也未知,現在需要模型判斷這張圖片里具體是一個什么東西,總之輸出一個結果:如果是車,那是什么車?
二、CNN日常應用
圖像分類:最常見的應用,例如識別圖片中的物體類別;
目標檢測:檢測圖像中物體的位置和類別;
圖像分割:將圖像分成多個區域,用于語義分割;
人臉識別:識別圖像中的人臉;
醫學圖像分析:用于檢測醫學圖像中的異常(如癌癥檢測、骨折檢測等);
自動駕駛:用于識別交通標志、車輛、行人等。
三、CNN的卷積層
(一 )基本介紹
卷積層是CNN的核心組件,用于提取輸入數據(如圖像、語音、文本)的局部特征。它的核心思想是通過局部連接、權值共享和平移不變性高效處理網格狀數據(如像素矩陣)。
卷積層利用卷積核(濾波器)對輸入進行處理(卷積操作),從而生成特征圖(feature map),并且每個卷積層能夠提取不同層次的特征,從低級特征(如邊緣)到高級特征(如物體的形狀)。
卷積層的主要作用如下:
-
特征提取:卷積層的主要作用是從輸入圖像中提取低級特征(如邊緣、角點、紋理等)。通過多個卷積層的堆疊,網絡能夠逐漸從低級特征到高級特征(如物體的形狀、區域等)進行學習;
-
權重共享:在卷積層中,同一個卷積核在整個輸入圖像上共享權重,這使得卷積層的參數數量大大減少,減少了計算量并提高了訓練效率;
-
局部連接:卷積層中的每個神經元僅與輸入圖像的一個小局部區域相連,這稱為局部感受野,這種局部連接方式更符合圖像的空間結構,有助于捕捉圖像中的局部特征;
-
空間不變性:由于卷積操作是局部的并且采用權重共享,卷積層在處理圖像時具有平移不變性。也就是說,不論物體出現在圖像的哪個位置,卷積層都能有效地檢測到這些物體的特征。
(二)卷積層計算
1.對輸入數據的要求
2.卷積核核心參數
3.計算過程
1. input 表示輸入的圖像;
2. filter 表示卷積核, 也叫做濾波器(濾波矩陣)
- 一組固定的權重,因為每個神經元的多個權重固定,所以又可以看做一個恒定的濾波器filter;
- 非嚴格意義上來講,下圖中紅框框起來的部分便可以理解為一個濾波器,即帶著一組固定權重的神經元,多個濾波器疊加便成了卷積層;
- 一個卷積核就是一個神經元。
卷積運算本質上就是在濾波器和輸入數據的局部區域間做點積。
如上圖左上角的點計算:
按照上面的計算方法可以得到最終的特征圖為:
實圖-特征圖對比:
注意:如果想要提取更多特征(比如花朵的顏色深淺、輪廓、紋理),可以用多個卷積核(分別提取花朵的顏色深淺、輪廓、紋理,生成不同的特征圖)。
4.特征圖尺寸計算
注意:
5.1、多通道卷積計算
如上圖,計算方法如下:
- 當輸入有多個通道(Channel), 例如 RGB 三個通道, 此時要求卷積核需要擁有相同的通道數(圖像有多少通道,每個卷積核就有多少通道);
- 每個卷積核通道與對應的輸入圖像的各個通道進行卷積;
- 將每個通道的卷積結果按位相加得到最終的特征圖。
如下圖所示:
5.2、多卷積核計算
在卷積神經網絡(CNN)中,多個卷積核(Filters/Kernels) 的計算是核心操作之一,它使網絡能夠同時提取多種特征(如邊緣、紋理、顏色等)。
特點:
(1)每個卷積核學習不同的特征:
例如:第一個核可能檢測水平邊緣,第二個核檢測垂直邊緣,第三個核檢測紅色通道的特定模式等。
(2)輸出多通道特征圖:
若有 C_out 個卷積核,輸出特征圖會有 C_out 個通道。
如上圖,可以看到:
- 兩個神經元,意味著有兩個濾波器;
- 數據窗口每次移動2個步長取3*3的局部數據,即stride=2;
- zero-padding=1。輸入數據由
5*5*3
變為7*7*3
; - 左邊是輸入(7*7*3中,7*7代表圖像的像素/長寬,3代表R、G、B 三個顏色通道);
- 中間部分是兩個不同的濾波器Filter w0、Filter w1;
- 最右邊則是兩個不同的輸出。
6.PyTorch卷積層API
# 導包
import numpy as np
import matplotlib.pyplot as plt
import torch# 加載數據
n1_img = plt.imread('data/img.jpg')
print(n1_img.shape)
# 把numpy轉換為tensor
t1_img = torch.from_numpy(n1_img)
print(t1_img.shape)
# 交換維度 (H,W,C)->(C,H,W)
t2_img = t1_img.permute(2, 0, 1)
print(t2_img.shape)
# 升維
t3_img = t2_img.unsqueeze(0)
print(t3_img.shape)
# TODO 創建卷積層對象 設置輸出通道數4,意味著輸出的特征圖4個
conv = torch.nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, stride=1, padding=0)
# TODO 調用卷積層對象,提取特征,注意類型轉換
output = conv(t3_img.to(torch.float32))
print(output.shape)
# 降維
output = output.squeeze(0)
print(output.shape)
# 交換維度
output = output.permute(1, 2, 0)
print(output.shape)
# 轉換為numpy TODO 索引0,1,2,3分別可以獲取第0,1,2,3個特征圖
output = output[:, :, 2].detach().numpy() #2:第三個圖
print(output.shape)
# 畫圖
plt.imshow(output)
plt.show()
運行結果:
可依次修改output = output[:, :, 2].detach().numpy() 將其它三個圖顯示出來(將2依次換成0、1、3)。
今日分享到此結束。