深度學習系統學習系列【7】之卷積神經網絡(CNN)

文章目錄

  • 說明
  • 卷積神經網絡概述(Convolutional Neural Network,CNN)
    • 卷積神經網絡的應用
      • 圖像分類與識別
      • 圖像著色
      • 自然語言處理NLP
      • 卷積神經網絡的結構
      • 卷積神經網絡中的數據流動
    • CNN與ANN的關系
  • 卷積操作
    • Padding 操作
    • 滑動窗口卷積操作
    • 網絡卷積層操作
    • 矩陣快速卷積
      • Im2col算法
      • GEMM算法
  • CNN三大核心思想
    • 核心思想概述
    • 局部感知
    • 權值共享
    • 下采樣 Pooling

說明

  • 文章屬于個人學習筆記內容,僅供學習和交流。
  • 內容參考《深度學習原理與實踐》陳仲銘版和個人學習經歷和收獲而來。

卷積神經網絡概述(Convolutional Neural Network,CNN)

  • 卷積神經網絡是計算機視覺天梯的基石。
  • 卷積神經網絡可以利用多層網絡結構自動學習輸入數據的深層特征,不同層次的網絡可以學習到不同層次的特征。淺層網絡層感知區域較小,可以學習到輸入數據的局部域特征(如圖像物體的顏色、集合形狀);深層網絡層具有較大的感知域,能夠學習輸入數據的抽象特征(如圖像物體屬性、輪廓特點、位置信息)。深層次抽象特征對圖像中物體的大小位置和方向等局部域特征敏感度較低,提高了物體的識別率。所以,卷積神經網絡常用于圖像處理領域。

卷積神經網絡的應用

  • 在圖像處理任務上,卷積神經網絡可以用來識別位移、縮放及物體形態扭曲的二維圖形。CNN的網絡模型中的特征是通過訓練數據集進行圖像特征學習,無需顯式抽取特征;因為圖像上同一特征面上的神經元權值相同,CNN模型可以并行訓練,提高神經網絡的訓練效率。

圖像分類與識別

  • 卷積神經網絡在圖像分類上一枝獨秀,其中手寫字體(HandWritten) 的識別率達到99.9%。 國外眾多快遞公司已經開始應用卷積神經網絡模型識別快遞單上的手寫字體,盡最大可能地節約企業成本、提高自身的系統運作效率。
  • 使用神經網絡可以對整體圖像進行目標識別。 例如一張圖片中的多個類別: 一只狗、 一棟房子、 一棵樹等。

圖像著色

  • 圖像著色就是將灰度圖像回復彩色的過程。
  • 使用改進的卷積神經網絡模型提取輸入圖像的特征及其上下文信息來對圖像進行著色。年代久遠的紀錄片可以真實還原當年的色彩,父母的老照片也終于可以還原出當年色彩艷麗的場景。

自然語言處理NLP

  • 卷積神經網絡為圖像而生,但應用不限于圖像。
  • 使用卷積神經網絡進行自然語言處理主要是針對語義分析和話題分類兩大任務。網絡模型共分為 4層,輸入層是一個表示句子的矩陣,每一行代表一個單詞向量,輸入層后接一個卷積層和Pooling 層,最后是 Softmax 分類器作為輸出層。該卷積神經網絡模型在各個自然語言處理的公共數據集上的表現都出色。
    在這里插入圖片描述

卷積神經網絡的結構

  • 卷積神經網絡主要由輸入層、卷積層、下來樣層、全連接層、輸出層構成。
    在這里插入圖片描述
  • 卷積神經網絡的簡單示例模型,該卷積神經網絡的網絡層從左到右分別為:輸入層、第一個卷積層、第一個下采樣層、第二個卷積層、第二個下采樣層、全連接層、輸出層。

  1. 假設上圖中的輸入圖像為灰度圖A,對應圖像矩陣表示為 ( 1 , w , h ) (1,w,h) (1,w,h),1 為單通道,w和h對應輸入圖像的長和高。首先把灰度圖A作為輸入層,然后接一個卷積層。第一個卷積層對輸入的圖像進行卷積操作后,得到3個特征圖(Feature Map),每個特征圖對應一個卷積核,此時網絡模型中的數據存儲結構變成(3,w,h)。因此3個特征圖組成的矩陣也被稱為“特征矩陣”,3代表特征矩陣的深度。
  • 卷積層操作產生多少個特征圖是自由設定的,也被稱為超參數(Hyper-Parameters)。
  1. 第一個卷積層后接的是下采樣層(Pooling層),Pooling 層對輸入的 3 個特征圖(特征矩陣〉進行下來樣操作, 得到3個更小的特征矩陣 ( 3 , w / 2 , h / 2 ) (3,w/2, h/2) (3,w/2,h/2)。接下來到第二個卷積層,卷積操作之后產生5個特征圖 ( 5 , w / 2 , h / 2 ) (5,w/2, h/2) (5,w/2,h/2)。然后再接一個Pooling 層,對 5 個特征圖進行下采樣操作,得到5個更小的特征圖 ( 5 , w / 4 , h / 4 ) (5, w/4,h/4) (5,w/4,h/4)
  • 一般對圖像進行下來樣操作得到的特征圖為輸入Pooling層特征圖的一半。
  1. 在第二個Pooling 層后面接的是兩個全連接層。第一個全連接層的每個神經元與上一層的 5 個特征圖中每個神經元(每個像素)進行全連接。 下一個全連接層同樣與上一層的每個神經元進行全連接。
  2. 在整個網絡的最后一層是輸出層(Softmax 層〉,對全連接后的特征向量進行計算, 得到分類評分值。與普通神經網絡類似,卷積神經網絡模型中的卷積核都是通過對輸入數據集經過梯度下降算法訓練得到的。

卷積神經網絡中的數據流動

  • 該圖為上圖卷積神經網絡的數據流動圖。
    在這里插入圖片描述
  1. 輸入層(Input Layer):假設輸入圖像為 [ 1 , 32 , 32 ] [1,32,32] [1,32,32]的彩色圖。
  2. 卷積層(Convolutinon Layer):對輸入卷積層的圖像或者特征圖進行卷積操作, 輸出卷積后的特征圖。第一個卷積層有3 個卷積核,因此卷積操作后得到的特征矩陣為 [ 3 , 32 , 32 ] [3, 32, 32] [3,32,32],第二個卷積層有5個卷積核, 同理卷積操作后得到的特征矩陣為 [ 5 , 32 , 32 ] [5, 32, 32] [5,32,32]
  3. 下采樣層(Polling Layer):Pooling 層對傳入的圖像在空間維度上進行下采樣操作(使輸入的特征圖長和寬均變為原來的一半),第一次卷積層后得到 [ 3 , 32 , 32 ] [3, 32, 32] [3,32,32]大小的特征矩陣作為Pooling 層的輸入,輸出 口 [ 3 , 16 , 16 ] [3,16,16] [3,16,16]大小的特征矩陣, 再經過第二個 Pooling 層后輸出
    則變成 [ 5 , 8 , 8 ] [5,8,8] [5,8,8]大小的特征矩陣。
  4. 全連接層(Fully Connected Layer):全連接層與普通神經網絡一樣,每個神經元都與輸入的所有神經元相互連接,然后經過激活函數進行計算。最后 Pooling 層得到 [ 5 , 8 , 8 ] [5,8,8] [5,8,8]的特征向量,即一共有 5 × 8 × 8 = 320 5×8×8=320 5×8×8=320個神經元,假設全連接層的神經元為 100 100 100,那么全連接產生 320 × 100 = 32000 320 × 100=32000 320×100=32000條連接線,后面的全連接層與ANN 類似。
  5. 輸出層(Output Layer):輸出層(分類層)會輸出每個類別的預測概率。例如,對于分類選項(雞扒、雞腿、雞翅),輸出可能是概率矩陣 [0.9, 0.1, 0],系統會選擇概率最高的“雞扒”作為最終預測結果。

  • 總結:卷積神經網絡模型逐層對圖像的每一個像素值進行計算, 到最后經過卷積神經網絡模型后,輸出分類評分值。

CNN與ANN的關系

  • CNN與ANN內部實現原理都是由神經元模型組成的神經網絡。
  • 人工神經網絡使用全排列的方式,神經元按照一維進行排列。卷積神經網絡每層神經元都是按照三維排列,每層有長、寬、高。長和寬表示輸入圖像矩陣的長度和寬度,高代表該層網絡的高度。

  • 卷積神經網絡的網絡結構中,卷積層后接 P o o l i n g Pooling Pooling層。輸入為 4 × 4 4×4 4×4大小的圖像矩陣,卷積層參數為 ( p a d d i n g = s a m e , k e r n e l = 2 ) (padding=same,kernel=2) (padding=same,kernel=2),卷積層后輸出特征矩陣大小為 [ 2 , 4 , 4 ] [2,4,4] [2,4,4]。(卷積層有n個卷積核對應輸出有n個特征圖)
    在這里插入圖片描述
  • 假設卷積層輸入為一張4×4大小的圖像矩陣(對應輸入神經元有 16 (4×4)個〉,設定卷積核為2,經過卷積操作后產生2個4×4大小的特征圖(對應輸出特征神經元有32(2×4×4)個)。其中,卷積核大小為3×3(一個卷積核由9個神經元組合而成),即對應的權重參數連接線有18(2×3×3)條,輸入神經元與特征神經元連接線均帶有權值參數 w i w_i wi?和偏置 b i b_i bi?,而該權值參數則由卷積核組成。

  • 卷積神經網絡的網絡模型的卷積層和全連接層中的權重參數經過梯度下降算法(SGD)進行訓練得到,最終使得卷積神經網絡計算出的分類概率能和訓練集中的圖像標簽吻合。

卷積操作

  • 卷積操作就是圖像處理技術中的過濾操作,卷積核(ConvolutionKerne)又稱濾波器。卷積神經網絡的卷積核內容則是通過梯度下降算法 SGD)訓練得到。

Padding 操作

  • 卷積操作時會造成在圖像邊界卷積造成圖像信息丟失的問題,Padding操作有助于解決邊界卷積問題。
  • Padding操作可以分為Same Padding、Valid Padding和自定義Padding 3種方法。
    • Same Padding是根據卷積核大小,對輸入圖像矩陣進行邊界補充(一般填充零值),使得卷積后得到的特征矩陣與輸入矩陣大小一致。避免邊界信息被忽略,把邊界信息納入神經網絡的計算范圍內,否則隨著神經網絡層的深入,圖像邊緣信息的損失也會逐漸增大。
    • Valid Padding實際上不需要進行Padding操作
    • 自定義Padding生成的特征圖大小根據下式計算而來。
      o u t p u t h = ( i n p u t h + 2 × p a d d i n g h ? k e r n e l h ) / s t r i d e + 1 o u t p u t w = ( i n t p u t w + 2 × p a d d i n g w ? k e r n e l w ) / s t r i d e + 1 o u t p u t 為輸出矩陣, i n p u t 為輸入矩陣, p a d d i n g 為邊界填充數量 k e r n e l 為卷積核大小, s t r i d e 為步長大小, w 為操作矩陣的寬, h 為操作矩陣的長 output_h=(input_h+2\times padding_h - kernel_h)/stride+1 \\ output_w=(intput_w+2\times padding_w - kernel_w)/stride+1 \\ output為輸出矩陣,input為輸入矩陣,padding為邊界填充數量 \\ kernel為卷積核大小,stride為步長大小,w為操作矩陣的寬,h為操作矩陣的長 outputh?=(inputh?+2×paddingh??kernelh?)/stride+1outputw?=(intputw?+2×paddingw??kernelw?)/stride+1output為輸出矩陣,input為輸入矩陣,padding為邊界填充數量kernel為卷積核大小,stride為步長大小,w為操作矩陣的寬,h為操作矩陣的長

  • Padding操作的兩種主要方式,如圖(a)輸入 5 × 5 5\times 5 5×5的圖像矩陣。卷積核大小為 3 × 3 3\times 3 3×3。Same Padding方法設置padding參數為 1 1 1,使卷積的輸出與輸入矩陣大小一致。圖(b) V a l i d P a d d i n g Valid Padding ValidPadding方法設置 p a d d i n g padding padding參數為 0 0 0,使得輸出特征矩陣比輸入矩陣要小。

在這里插入圖片描述

  • 一般默認卷積操作中使用 Same Padding 方法。通過對輸入圖像矩陣的邊緣填充零像素值,使得輸入的圖像經過卷積后得到的特征矩
    陣大小與輸入的原圖大小一致。

滑動窗口卷積操作

  • 卷積操作:原始輸入為一張圖像,通過一個卷積核在輸入圖像上進行滑動,對滑動窗口與卷積核進行數值運算后,卷積后輸出的為特征圖。
  • 假設一個卷積核窗口在輸入圖像上滑動,滑動窗口每次移動的步長為 stride,那么每次滑動窗口后,把求得的值按照空間順序組成一個特征圖。該特征圖的邊長分別為:
    f e a t u r e m a p w = ( i m g w ? k e r n e l w ) / s t r i d e + 1 f e a t u r e m a p w = ( i m g w ? k e r n e l h ) / s t r i d e + 1 f e a t u r e m a p 為特征圖矩陣的大小, i m g 為輸入圖像大小 k e r n e l 為卷積核大小, s t r i d e 為步長大小, w 為矩陣的寬, h 為矩陣的長。 feature map_w = (img_w - kernel_w) / stride +1 \\ feature map_w =(img_w - kernel_h) / stride+1 \\ feature map為特征圖矩陣的大小,img為輸入圖像大小 \\ kernel為卷積核大小,stride為步長大小,w為矩陣的寬,h為矩陣的長。 featuremapw?=(imgw??kernelw?)/stride+1featuremapw?=(imgw??kernelh?)/stride+1featuremap為特征圖矩陣的大小,img為輸入圖像大小kernel為卷積核大小,stride為步長大小,w為矩陣的寬,h為矩陣的長。
    在這里插入圖片描述
    在這里插入圖片描述

網絡卷積層操作

  • 在第 l l l層網絡有 C C C個特征圖作為輸入,該卷積層有 k k k個卷積核,如何進行卷積操作產生 k k k個輸出特征矩陣?
  • 假設在第 l l l層卷積層輸入為C個特征圖,即該層輸入C個矩陣,C個矩陣的大小均為 W × H W \times H W×H,可以得到一個 C × ( W × H ) C \times (W \times H) C×(W×H)的特征張量, C C C又稱為輸入矩陣的深度。該層設定有 C o u t Cout Cout K × K K \times K K×K大小卷積核,在使用 S a m e P a d d i n g Same Padding SamePadding的情況下將會產生 C o u t Cout Cout個大小為 W × H W \times H W×H的特征圖作為輸出,即可得到 C o u t × ( W × H ) Cout \times (W \times H) Cout×(W×H)的特征張量作為輸出。

在這里插入圖片描述

  • 多層卷積操作類似于神經元的基本求和公式 z = ∑ w x + b z=\sum wx+b z=wx+b,卷積神經網絡中 w w w對應單個卷積核, x x x為對應輸入矩陣的不同數據窗口, b b b為該卷積核的偏置。這相當于卷積核與一個個數據窗口相乘求和后(矩陣內積計算),加上偏置b得到輸出結果。
    z = x 11 ⊙ w 1 + w 21 ⊙ w 1 + b = ( x 11 + x 21 ) ⊙ w 1 + b \begin{align*} z &=x_{11} \odot w_1+w_{21} \odot w_1+b \\ &=(x_{11}+x_{21}) \odot w_1+b \end{align*} z?=x11?w1?+w21?w1?+b=(x11?+x21?)w1?+b?

矩陣快速卷積

  • 卷積操作是在圖像中通過滑動窗口,逐像素進行矩陣計算,會耗費大量的計算資源去尋址和修改內存數據。可以轉化為矩陣后進行快速計算。矩陣操作能在計算機中快速運算并且方便移植到 GPU 中,在實際生產環境中可以通過兩步來完成卷積操作:
  1. 使用Image to column ( Im2col)算法把輸入圖像和卷積核轉換成為規定的矩陣排列方式。
  2. 使用GEMM算法對轉換后的兩個矩陣進行相乘,得到卷積結果。

Im2col算法

  1. 圖像的Im2col操作:假設輸入的圖像大小為 C × H × W C \times H \times W C×H×W(其中H為圖像的長, W W W為圖像的寬, C C C為圖像的深度)。卷積核的大小為 K × K K \times K K×K,那么對應輸入圖像中一個卷積窗口可以表示為 C × ( K × K ) C \times (K \times K) C×(K×K)的向量,即對輸入圖像中的某位置的數據按照卷積窗口進行從新排列,得到 C × ( K × K ) C\times (K \times K) C×(K×K)的特征向量。以步長為 1 ( s t r i d e = 1 ) 1 (stride=1) 1(stride=1 從輸入圖像的左上角開始對原圖進行特征轉換,最終得到特征圖大小為 ( H × W ) × ( C × K × K ) (H \times W)\times (C \times K \times K) (H×W)×(C×K×K)
    在這里插入圖片描述
  2. 卷積核的Im2col操作:假設有 C o u t Cout Cout個卷積核,每個卷積核大小為 C × ( K × K ) C\times (K \times K) C×(K×K) ,把卷積核進行矩陣變換,得到單個卷積核的尺寸為 C × ( K × K ) C \times (K\times K) C×(K×K)。依此類推,最終得到 C o u t × ( C × K × K ) Cout \times (C \times K \times K) Cout×(C×K×K) 大小的過濾矩陣(Filter Matrix)。
    在這里插入圖片描述

  • 代碼實現
import numpy as npdef get_im2col_indices(x_shape, field_height, field_width, padding=1, stride=1):# 解析輸入張量的形狀 (batch_size: 批次大小, channel: 通道數, height: 高度, width: 寬度)batch_size, channel, height, width = x_shape# 確保經過填充后的圖像尺寸可以被卷積核滑動整除,否則拋出異常assert (height + 2 * padding - field_height) % stride == 0assert (width + 2 * padding - field_width) % stride == 0# 計算輸出特征圖的高度和寬度out_height = int((height + 2 * padding - field_height) / stride + 1)  # 輸出高度out_width = int((width + 2 * padding - field_width) / stride + 1)    # 輸出寬度# 構建卷積核在垂直方向上的起始索引 i0i0 = np.repeat(np.arange(field_height), field_width)  # 每個高度索引重復 field_width 次i0 = np.tile(i0, channel)  # 在通道維度上復制 channel 次# 構建卷積核在垂直方向上的滑動步長索引 i1i1 = stride * np.repeat(np.arange(out_height), out_width)  # 每個 out_height 索引重復 out_width 次,并乘以步長# 構建卷積核在水平方向上的起始索引 j0j0 = np.tile(np.arange(field_width), field_height)  # 每個寬度索引循環 field_height 次# 構建卷積核在水平方向上的滑動步長索引 j1j1 = stride * np.tile(np.arange(out_width), out_height)  # 每個 out_width 索引循環 out_height 次,并乘以步長# 將 i0 和 i1 結合,生成所有可能的垂直索引位置i = i0.reshape(-1, 1) + i1.reshape(1, -1)# 將 j0 和 j1 結合,生成所有可能的水平索引位置j = j0.reshape(-1, 1) + j1.reshape(1, -1)# 構建通道索引 k,每個通道對應 field_height * field_width 個位置k = np.repeat(np.arange(channel), field_height * field_width).reshape(-1, 1)# 返回通道、垂直、水平索引三元組,用于后續提取圖像塊return k, i, jdef im2col_indices(x, field_height, field_width, padding=1, stride=1):# 獲取輸入張量的通道數 CC = x.shape[1]# 對輸入張量進行零填充,擴展其邊界,以便處理邊緣區域x_padded = np.pad(x, ((0, 0), (0, 0), (padding, padding), (padding, padding)), mode='constant')# 調用 get_im2col_indices 函數獲取所有需要提取的圖像塊的索引k, i, j = get_im2col_indices(x.shape, field_height, field_width, padding, stride)# 根據索引從填充后的輸入張量中提取圖像塊,并將其展平成二維矩陣cols = x_padded[:, k, i, j]# 調整矩陣形狀,使其適合后續的矩陣運算(如卷積轉換為矩陣乘法)cols = cols.transpose(1, 2, 0).reshape(C * field_height * field_width, -1)# 返回最終的圖像塊矩陣return cols

GEMM算法

  • 一般矩陣乘法(General Matrix Matrix Multiply, GEMM)將由卷積核產生的過濾矩陣乘以原圖產生的特征圖矩陣(Feature Matrix)的轉置,得到大小為 C o u t × ( H × W ) Cout \times (H \times W) Cout×(H×W)的輸出特征圖矩陣。
    f e a t u r e m a p = F i l t e r M a t r i x ? F e a t u r e M a t r i x T = [ ( C o u t × ( C × H × W ) ) ] ? [ ( ( C × H × W ) × ( H × W ) ) ] = C o u t × H × W \begin{align*} feature map &=Filter Matrix \cdot Feature Matrix^T \\ &=[(Cout\times (C \times H \times W))]^\ast [((C \times H \times W)\times(H \times W))] \\ &=Cout\times H \times W \end{align*} featuremap?=FilterMatrix?FeatureMatrixT=[(Cout×(C×H×W))]?[((C×H×W)×(H×W))]=Cout×H×W?
  • 假設卷積核為 2 × 2 2×2 2×2的矩陣,輸入原圖像Image為 3 × 3 3×3 3×3的單通道矩陣。邊界擴展為0,滑動步長為1( p a d d i n g = 0 , s t i d e = 1 , c = 1 , w = 3 , h = 3 , k = 2 padding=0,stide=1,c=1,w=3,h=3,k=2 padding=0,stide=1,c=1,w=3,h=3,k=2)。因此過濾矩陣的長寬w、 h均減少了1,經過Im2col變換后特征圖矩陣的大小為 ( 2 × 2 ) × ( 1 × 2 × 2 ) (2 \times 2) \times (1 \times 2 \times 2) (2×2)×(1×2×2)
    Image = [ 3 2 1 0 1 2 3 1 1 ] ? Feature?Matrix = [ 3 2 0 1 2 1 1 2 0 1 1 3 1 2 1 1 ] \text{Image} = \begin{bmatrix}3 & 2 & 1 \\ 0 & 1 & 2 \\ 3 & 1 & 1\end{bmatrix} \Rightarrow \text{Feature Matrix} = \begin{bmatrix}3 & 2 & 0 & 1 \\ 2 & 1 & 1 & 2 \\ 0 & 1 & 1 & 3 \\ 1 & 2 & 1 & 1\end{bmatrix} Image= ?303?211?121? ??Feature?Matrix= ?3201?2112?0111?1231? ?
  • 假設有2個大小均為2×2 的卷積核A、 B ( c o u t = 2 , c = 1 , k = 2 ) (cout=2, c=1, k=2) (cout=2,c=1,k=2),因此過濾矩陣大小為 2 × ( 1 × 2 × 2 ) 2 \times (1\times 2 \times 2) 2×(1×2×2)
    A = [ 0 1 1 2 ] , B = [ 2 1 1 3 ] ? Filter?Matrix = [ 0 1 1 2 2 1 1 3 ] A = \begin{bmatrix}0 & 1 \\ 1 & 2\end{bmatrix}, \quad B = \begin{bmatrix}2 & 1 \\ 1 & 3\end{bmatrix} \Rightarrow \text{Filter Matrix} = \begin{bmatrix}0 & 1 & 1 & 2 \\ 2 & 1 & 1 & 3\end{bmatrix} A=[01?12?],B=[21?13?]?Filter?Matrix=[02?11?11?23?]
  • 輸出的特征矩陣C為 C = Filter?Matrix ? Feature?Matrix T C = \text{Filter Matrix} \cdot \text{Feature Matrix}^T C=Filter?Matrix?Feature?MatrixT
    C = [ 0 1 1 2 2 1 1 3 ] × [ 3 2 0 1 2 1 1 2 0 1 1 3 1 2 1 1 ] ? [ [ 0 1 1 2 ] [ 2 1 1 3 ] ] \begin{aligned} C&= \begin{bmatrix}0 & 1 & 1 & 2 \\ 2 & 1 & 1 & 3\end{bmatrix} \times \begin{bmatrix}3 & 2 & 0 & 1 \\ 2 & 1 & 1 & 2 \\ 0 & 1 & 1 & 3 \\ 1 & 2 & 1 & 1\end{bmatrix} \\ &\Rightarrow \begin{bmatrix}\begin{bmatrix}0 & 1 \\ 1 & 2\end{bmatrix} & \begin{bmatrix}2 & 1 \\ 1 & 3\end{bmatrix}\end{bmatrix} \end{aligned} C?=[02?11?11?23?]× ?3201?2112?0111?1231? ??[[01?12?]?[21?13?]?]?
  • 特征矩陣C中的 [ 0 1 1 2 ] \begin{bmatrix}0 & 1 \\ 1 & 2\end{bmatrix} [01?12?] [ 2 1 1 3 ] \begin{bmatrix}2 & 1 \\ 1 & 3\end{bmatrix} [21?13?]分別為輸出的兩個特征圖。

CNN三大核心思想

核心思想概述

  • 卷積神經網絡的三個核心思想是局部感知、權值共享、下采樣技術。卷積神經網絡的三大核心思想使得卷積神經網絡能夠提取圖像物體的高維特征,感知圖像中更豐富的信息。同時,經過權值共享和下來樣操作,進一步減少網絡的參數, 讓卷積神經網絡模型能夠在規定時間內和有限的內存硬件下完成計算。
  • 卷積神經網絡能夠用自身獨特的方式避免傳統神經網絡所引起的問題,其優點如下:

  1. 局部感知:每一個神經元節點不再與下一層的所有神經元節點相連接(全連接的方式),只與下一層的部分神經元進行連接。
  2. 權值共享: 一組連接可以共享同一個權重參數,或者多組連接共享同一個卷積核,不再是每條連接都有自己的權重。
  3. 下采樣 Pooling :通過 Pooling 技術對輸入的數據進行下來樣壓縮操作,減少輸出節點。

  • 卷積神經網絡通過局部感知和權值共享,保留像素間關聯信息,并且大大減少所需參數的數量。通過Pooling 技術,進一步縮減網絡參數數量,提高模型的魯棒性,讓模型可以持續地擴展深度,繼續增加隱層。因此“局部感知、權值共享、下來樣”被譽為卷積神經網絡的三大核心思想。

局部感知

  • 圖像中的空間關系通常表現為局部像素聯系緊密,而遠距離像素相關性較弱。因此,無需全局感知,只需逐層提取局部信息。隨著網絡加深,圖像尺寸逐漸縮小,特征提取從局部到全局,最終綜合得到圖像的全局表征。
  • 圖(a)展示了傳統全連接神經網絡,所有像素(每個像素對應一個神經元)與下一層的每個神經元相連,導致參數量巨大。而圖(b)展示了卷積神經網絡(CNN)的局部連接方式:每個隱層神經元僅與輸入圖像的局部區域(即感受野,對應卷積核大小)相連,顯著減少了網絡參數。這種稀疏連接方式既保留了空間局部性,又提升了計算效率。
    在這里插入圖片描述
  • 由于每一層的輸入圖像和卷積核大小都不一樣,因此會產生不同的感知區域,向下擴展網絡的深度。另外,不同的感知區域能夠感知圖像中不同的紋理特征,從而隨著卷積網絡層的增加而獲得更高維的圖像特征。

權值共享

  • 權值共享是 CNN 的核心機制之一,它通過復用卷積核參數,實現:
    • ? 參數高效(減少冗余權重):如果一個卷積核(如 C)在圖像的某個區域(如窗口 A)能檢測到某種紋理或邊緣特征,那么它在其他具有相似特征的區域(如窗口 B)同樣適用。因此,無需為每個位置訓練不同的卷積核,而是共享同一個卷積核,在整個圖像上滑動檢測相同模式的特征。
    • ? 特征復用(同一模式在不同位置檢測):使得一個卷積核的權重矩陣(如 3×3 或 5×5)在整個圖像上復用,極大減少參數量(例如,一個 3×3 卷積核僅需 9 個參數,而不是數百萬個)。
    • ? 平移不變性(適應目標位置變化):由于同一個卷積核檢測相同特征,無論目標出現在圖像的哪個位置(如邊緣、紋理、物體部分),網絡都能識別,從而增強模型對平移變化的魯棒性。
      在這里插入圖片描述

下采樣 Pooling

  • 在卷積神經網絡中,輸入給卷積層的圖像可能很大,實際上并沒有必要對原圖進行操作,可以采用下采樣(Pooling)技術,對輸入的圖像進行壓縮,減少輸出的總像素。
  • Pooling技術的優勢:
  1. 減少過度擬合的可能性, 當網絡中權重參數過多時,很容易在訓練階段造成過度擬合。
  2. 縮減圖像尺寸,減少計算量,提升計算速度。
  3. 進一步提取圖像高維的統計特征。

  • 常用的Pooling方法有如下兩種:
  1. 最大池化(Max Pooling):取Pooling 窗口的最大值作為Pooling 特征。
  2. 均值池化(Mean Pooling):取Pooling 窗口的均值作為Pooling 特征。
    在這里插入圖片描述
  • Max Pooling代碼示例
import numpy as npdef max_pool_forward(x, pool_param):(N, C, H, W) = x.shape  # 獲取輸入矩陣的大小height = pool_param['height']  # Pooling 窗口高度width = pool_param['width']  # Pooling 窗口寬度stride = pool_param['stride']  # Pooling窗口滑動步長H_prime = 1 + (H - height) // stride  # 向下滑動的次數,也為 pooling 輸出的高度W_prime = 1 + (W - width) // stride  # 向右滑動的次數,也為 pooling 輸出的寬度out = np.zeros((N, C, H_prime, W_prime))  # 定義輸出矩陣# 遍歷 batchfor n in range(N):for h in range(H_prime):for w in range(W_prime):h1 = h * stride  # (h1, w1) 為 pooling 窗口左上角第一個點w1 = w * strideh2 = h * stride + heightw2 = w * stride + width  # (h2, w2) 為 pooling 窗口最后一個點window = x[n, :, h1:h2, w1:w2]  # 獲得當前 pooling 窗口win_l = window.reshape((C, height * width))out[n, :, h, w] = np.max(win_l, axis=1)return out# 測試
np.random.seed(8)
x = np.random.randint(5, size=(1, 1, 4, 4))  # 隨機產生一個 [1, 1, 4, 4] 的矩陣
pool_param = {'height': 2, 'width': 2, 'stride': 2}out = max_pool_forward(x, pool_param)
print("Input:\n", x)
print("Output:\n", out)
Input:[[[[3 4 1 1][2 0 3 0][0 4 1 3][2 3 4 1]]]]
Output:[[[[4. 3.][4. 4.]]]]

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

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

相關文章

事務隔離(MySQL)

事務隔離 —— 為什么你改了我還看不見? 在數據庫中,事務(Transaction) 用于保證一組數據庫操作要么全部成功,要么全部失敗,這是一種原子性的操作機制。在 MySQL 中,事務的支持由存儲引擎層實現…

華為昇騰910B通過vllm部署InternVL3-8B教程

前言 本文主要借鑒:VLLM部署deepseek,結合自身進行整理 下載模型 from modelscope import snapshot_download model_dir snapshot_download(OpenGVLab/InternVL3-8B, local_dir"xxx/OpenGVLab/InternVL2_5-1B")環境配置 auto-dl上選擇單卡…

Spring Boot 3 + Undertow 服務器優化配置

優化背景 當你的application需要支持瞬時高并發的時候,tomcat已經不在是最優的選擇,我們可以改為Undertow,并對其進行優化。 Undertow 是一個輕量級的、高性能的Java Web 服務器,由JBoss 開發并開源。它是基于非阻塞(…

利用 Python pyttsx3實現文字轉語音(TTS)

今天,我想跟大家分享如何利用 Python 編程語言,來實現文字轉換為語音的功能,也就是我們常說的 Text-to-Speech (TTS) 技術。 你可能會好奇,為什么學習這個?想象一下,如果你想把書本、文章、雜志的內容轉換…

vue修改了node_modules中的包,打補丁

1、安裝patch npm i patch-package 安裝完成后,會在package.json中顯示版本號 2、在package.json的scripts中增加配置 "postinstall": "patch-package" 3、執行命令 npx patch-package 修改的node_modules中的包的名稱 像這樣 npx patch-packag…

Vue3快速入門/Vue3基礎速通

Vue3 漸進式的javascript框架&#xff0c;我們可以逐步引入vue的功能 官方文檔 Vue.js中文手冊 你可以借助 script 標簽直接通過 CDN 來使用 Vue&#xff1a; <script src"https://unpkg.com/vue3/dist/vue.global.js"></script>通過 CDN 使用 Vue 時…

[人機交互]理解界面對用戶的影響

零.重點 – 什么是情感因素 – 富有表現力的界面 – 用戶的挫敗感 – 擬人化在交互設計中的應用 – 虛擬人物&#xff1a;代理 一.什么是情感方面 情感是指某事物對心理造成的一種狀態 二.計算機科學中存在的兩個相關的研究領域 2.1情感計算 機器如何能感知其他代理的情感&…

Ubuntu22.04及以上版本buildroot SIGSTKSZ 報錯問題

本文提供一種解決 Buildroot SIGSTKSZ 報錯途徑 解決途徑來源參考&#xff1a;Buildroot error when building with Ubuntu 21.10 其出現原因在于 GNU C Library 2.34 release announcement&#xff1a; Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _DYNAMIC_STACK_SIZE_SOU…

Spark處理過程-案例數據清洗

&#xff08;一&#xff09;需求說明 準備十條符合包含用戶信息的文本文件&#xff0c;每行格式為 姓名,年齡,性別&#xff0c;需要清洗掉年齡為空或者非數字的行。 例如&#xff1a; 張三,25,男 李四,,女 王五,30,男 趙六,a,女 孫七,35,男 周八,40,女 吳九,abc,男 鄭十,45,女…

多模態大語言模型arxiv論文略讀(六十五)

VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ?? 論文標題&#xff1a;VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ?? 論文作者&#xff1a;Zhen Chen, Xingjian Luo, Jinlin Wu, Danny T. M. Chan, Zhen Lei, Jinqi…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戲</title> <style>bo…

算法訓練營第十一天|150. 逆波蘭表達式求值、239. 滑動窗口最大值、347.前 K 個高頻元素

150. 逆波蘭表達式求值 題目 思路與解法 第一思路&#xff1a; 比較簡單 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …

原生 IP(Native IP)

目錄 一、核心特點 二、原生 IP 的常見應用 三、原生 IP vs. 數據中心 IP 四、如何獲取原生 IP&#xff1f; 五、原生 IP 的優缺點 六、實際案例 原生 IP&#xff08;Native IP&#xff09; 是指由互聯網服務提供商&#xff08;ISP&#xff09;直接分配給用戶的 IP 地址&…

k8s的pod掛載共享內存

k8s的pod掛載共享內存&#xff0c;限制不生效問題&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系統中用于共享內存的特殊路徑。通過將 emptyDir 的 medium 設置為 Memory&#xff0c;可以確保 /dev/shm 正確地掛載到一個基于內存的文件系統&#xff0c;從而實現高效的共享內…

DOCX轉PDF怎么操作最簡單?快速將DOCX轉換為專業PDF文檔

在日常辦公或學習中&#xff0c;我們經常需要將 Word 文檔&#xff08;.docx格式&#xff09;轉換為 PDF 文件。這不僅有助于保持文檔格式的一致性&#xff0c;還能確保接收者無需特定軟件即可查看文件內容。本文將詳細介紹幾種常見的方法來實現從 DOCX 到 PDF 的轉換&#xff…

VUE+ElementUI 使用el-input類型type=“number” 時,取消右邊的上下箭頭

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 在項目中有時候需要輸入框的type“number”&#xff0c;這個時候&#xff0c;輸入框的右邊就會出現兩個按鈕&#xff0c;這兩個按鈕可以遞增/遞減&#xff0c;但是這樣輸入框看上去就不太美觀&#x…

深入淺出理解常見的分布式ID解決方案

目錄 UUID 自增ID 數據庫多主模式 號段模式 Redis 雪花算法 百度 UIDgenerator 美團Leaf 滴滴TinyID 實戰中的分布式ID生成器&#xff01;保障數據唯一性的核心組件 怎么編寫Lua腳本是關鍵 怎么執行&#xff1f; 總結 分布式ID在構建大規模分布式系統時扮演著至關…

技術視界 | 青龍機器人訓練地形詳解(一):如何創建一個地形

機器人強化學習中的地形訓練是利用強化學習算法讓機器人在不同地形環境中通過試錯學習最優行為策略的過程&#xff0c;通過環境建模、策略學習與優化等環節&#xff0c;使機器人能夠自主適應復雜多變的地形&#xff0c;提高其移動效率、穩定性和自主性&#xff0c;減少人為干預…

【SGL】Scatter-Gather List內存傳輸技術

文章目錄 1. What is SGL&#xff1f;2. sgl內存傳輸的原理2.1 核心思想2.2 sgl數據結構2.3 摘鏈和掛鏈 3. 零拷貝技術3.1 問題背景3.2 零拷貝的核心思想及實現方式 4. sgl在存儲行業的應用 1. What is SGL&#xff1f; sgl&#xff08;Scatter-Gather List&#xff09;內存傳…

10.idea中創建springboot項目_jdk17

10.idea中創建springboot項目_jdk17 一、前期準備 安裝與配置&#xff1a; 確保已安裝 IntelliJ IDEA配置好 JDK17 二、創建 Maven 項目 新建項目&#xff1a; 點擊 File → New → Project&#xff0c;選擇左側的 Maven。填寫項目名稱&#xff08;如 demo&#xff09;、存…