第五章 深度學習用于計算機視覺
5.1 卷積神經網路簡介
5.1.1 卷積神經網路對 MNIST 分類
使用卷積神經網路對 MNIST 數字進行分類,在第 2 章用密集連接網路做過(當時的測驗精度為 97.8%),它是 Conv2D 層和 MaxPooling2D 層的堆疊,
-
實體化一個小型的卷積神經網路
from keras import layers from keras import models model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu'))卷積神經網路接收形狀為
(image_height, image_width, image_channels)的輸入張量(不包括批量維度),第一層傳入引數input_shape=(28, 28, 1)來完成此設定,>>> model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________ max_pooling2d_1 (MaxPooling2D) (None, 13, 13, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 11, 11, 64) 18496 _________________________________________________________________ max_pooling2d_2 (MaxPooling2D) (None, 5, 5, 64) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 3, 3, 64) 36928 ================================================================= Total params: 55,744 Trainable params: 55,744 Non-trainable params: 0每個
Conv2D層和MaxPooling2D層的輸出都是一個形狀為(height, width,channels)的 3D 張量,通道數量由傳入Conv2D層的第一個引數所控制(32 或 64), -
在卷積神經網路上添加分類器
model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax'))在進入兩個 Dense 層之前,形狀 (3, 3, 64) 的輸出被展平為形狀 (576,) 的向量,
>>> model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________ max_pooling2d_1 (MaxPooling2D) (None, 13, 13, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 11, 11, 64) 18496 _________________________________________________________________ max_pooling2d_2 (MaxPooling2D) (None, 5, 5, 64) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 3, 3, 64) 36928 _________________________________________________________________ flatten_1 (Flatten) (None, 576) 0 _________________________________________________________________ dense_1 (Dense) (None, 64) 36928 _________________________________________________________________ dense_2 (Dense) (None, 10) 650 ================================================================= Total params: 93,322 Trainable params: 93,322 Non-trainable params: 0 -
在 MNIST 影像上訓練卷積神經網路
from keras.datasets import mnist from keras.utils import to_categorical (train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images = train_images.reshape((60000, 28, 28, 1)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images.astype('float32') / 255 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_images, train_labels, epochs=5, batch_size=64)在測驗資料上對模型進行評估,
>>> test_loss, test_acc = model.evaluate(test_images, test_labels) >>> test_acc 0.9912999868392944 -
整體代碼
from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical from tensorflow.keras import layers from tensorflow.keras import models (train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images = train_images.reshape((60000, 28, 28, 1)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images.astype('float32') / 255 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels) model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax')) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_images, train_labels, epochs=5, batch_size=64) test_loss, test_acc = model.evaluate(test_images, test_labels)結果是:
>>> test_acc 0.99080000000000001
5.1.2 卷積運算
-
D e n s e 層 \color{red}Dense 層 Dense層從輸入特征空間中學到的是 全 局 模 式 \color{red}全域模式 全局模式,而 卷 積 層 \color{red}卷積層 卷積層學到的是 局 部 模 式 \color{red}區域模式 局部模式,
-
卷積神經網路具有以下兩個性質:
- 卷積神經網路學到的模式具有
平
移
不
變
性
(
t
r
a
n
s
l
a
t
i
o
n
??
i
n
v
a
r
i
a
n
t
)
\color{red}平移不變性(translation\;invariant)
平移不變性(translationinvariant),這使得卷積神經網
絡在處理影像時可以高效利用資料(因為 視 覺 世 界 從 根 本 上 具 有 平 移 不 變 性 \color{red}視覺世界從根本上具有平移不變性 視覺世界從根本上具有平移不變性),它只需要更少的訓練樣本就可以學到具有泛化能力的資料表示, - 卷積神經網路可以學到
模
式
的
空
間
層
次
結
構
(
s
p
a
t
i
a
l
??
h
i
e
r
a
r
c
h
i
e
s
??
o
f
??
p
a
t
t
e
r
n
s
)
\color{red}模式的空間層次結構(spatial\;hierarchies\;of\;patterns)
模式的空間層次結構(spatialhierarchiesofpatterns),卷積神經網路可以有效地學習越來越復雜、越來越抽象的視覺概念(因為
視
覺
世
界
從
根
本
上
具
有
空
間
層
次
結
構
\color{red}視覺世界從根本上具有空間層次結構
視覺世界從根本上具有空間層次結構),

- 卷積神經網路學到的模式具有
平
移
不
變
性
(
t
r
a
n
s
l
a
t
i
o
n
??
i
n
v
a
r
i
a
n
t
)
\color{red}平移不變性(translation\;invariant)
平移不變性(translationinvariant),這使得卷積神經網
-
特 征 圖 ( f e a t u r e ?? m a p ) \color{red}特征圖(feature\;map) 特征圖(featuremap)
- 定義: 深度軸的每個維度都是一個
特
征
\color{red}特征
特征(或
過
濾
器
\color{red}過濾器
過濾器),而 2D 張量
output[:, :, n]是這個過濾器在輸入上的回應的二維空間 圖 ( m a p ) \color{red}圖(map) 圖(map), - 應用:
- 輸入卷積中的: 包含兩個空間軸(高度和寬度)和一個深度軸(也叫通道軸)的 3D 張量,其卷積也叫 特 征 圖 ( f e a t u r e ?? m a p ) \color{red}特征圖(feature\;map) 特征圖(featuremap),
- 從卷積中輸出的: 卷積運算從輸入特征圖中提取圖塊,并對所有這些圖塊應用相同的變換,生成 輸 出 特 征 圖 ( o u t p u t ?? f e a t u r e ?? m a p ) \color{red}輸出特征圖(output\;feature\;map) 輸出特征圖(outputfeaturemap),該輸出特征圖仍是一個 3D 張量,具有寬度和高度,其深度是輸出深度是層的引數,每層代表代表 過 濾 器 ( f i l t e r ) \color{red}過濾器(filter) 過濾器(filter),
- 定義: 深度軸的每個維度都是一個
特
征
\color{red}特征
特征(或
過
濾
器
\color{red}過濾器
過濾器),而 2D 張量
-
卷積關鍵引數:
- 從 輸 入 中 提 取 的 圖 塊 尺 寸 \color{red}從輸入中提取的圖塊尺寸 從輸入中提取的圖塊尺寸:這些圖塊的大小通常是 3 × 3 3×3 3×3 或 5 × 5 5×5 5×5,本例中為 3 × 3 3×3 3×3,
- 輸 出 特 征 圖 的 深 度 \color{red}輸出特征圖的深度 輸出特征圖的深度:卷積所計算的過濾器的數量,本例第一層的深度為 32 32 32,最后一層的深度是 64 64 64,
-
卷積的作業原理
- 開始:在 3D 輸入特征圖上
滑
動
(
s
l
i
d
e
)
\color{red}滑動(slide)
滑動(slide)這些
3
×
3
3×3
3×3或
5
×
5
5×5
5×5的視窗,在每個可能的位置停止并提取周圍特征的 3D 圖塊[
形狀為 (window_height, window_width, input_depth)], - 然后,每個 3D 圖塊與學到的同一個權重矩陣[叫作
卷
積
核
(
c
o
n
v
o
l
u
t
i
o
n
k
e
r
n
e
l
)
\color{red}卷積核(convolution kernel)
卷積核(convolutionkernel)]做
張
量
積
\color{red}張量積
張量積,轉換成形狀為
(output_depth,)的 1D 向量, - 最后,對所有這些向量進行空間重組,使其轉換為形狀為
(height, width, output_depth)的 3D 輸出特征圖,輸出特征圖中的每個空間位置都對應于輸入特征圖中的相同位置,
如圖所示:

輸 出 的 寬 度 和 高 度 可 能 與 輸 入 的 寬 度 和 高 度 不 同 \color{red}輸出的寬度和高度可能與輸入的寬度和高度不同 輸出的寬度和高度可能與輸入的寬度和高度不同,不同的原因可能有兩點:
- 邊 界 效 應 \color{red}邊界效應 邊界效應,可以通過對輸入特征圖進行填充來抵消,
- 使 用 了 步 幅 ( s t r i d e ) \color{red}使用了步幅(stride) 使用了步幅(stride),稍后會給出其定義,
- 開始:在 3D 輸入特征圖上
滑
動
(
s
l
i
d
e
)
\color{red}滑動(slide)
滑動(slide)這些
3
×
3
3×3
3×3或
5
×
5
5×5
5×5的視窗,在每個可能的位置停止并提取周圍特征的 3D 圖塊[
5.1.3 邊界效應與填充
- 邊界效應定義:
假設用 3 × 3 3×3 3×3的特征圖 進行卷積Con2,開始的輸入尺寸為 28 × 28 28×28 28×28,經過第一個卷積層之后尺寸變為 26 × 26 26×26 26×26, - 填充的定義:
填充是在輸入特征圖的每一邊 添 加 適 當 數 目 的 行 和 列 \color{red}添加適當數目的行和列 添加適當數目的行和列,使得每個輸入方塊都能作為 卷 積 窗 口 的 中 心 \color{red}卷積視窗的中心 卷積窗口的中心, - 對于 Conv2D 層,可以通過
padding引數來設定填充,這個引數有兩個取值:- “
valid” 表示 不 使 用 填 充 \color{red}不使用填充 不使用填充(只使用有效的視窗位置); - “
same” 表示“ 填 充 后 輸 出 的 寬 度 和 高 度 與 輸 入 相 同 \color{red}填充后輸出的寬度和高度與輸入相同 填充后輸出的寬度和高度與輸入相同”, - padding 引數的默認值為 “
valid” ,
- “
5.1.4 卷積步幅
- 卷積步幅定義:
兩個連續視窗的距離是卷積的一個引數,叫作 步 幅 \color{red}步幅 步幅,默認值為 1 \color{red}1 1, - 步幅為n的意義:
- 步幅為 n n n意味著特征圖的寬度和高度都被做了 n n n倍 下 采 樣 \color{red}下采樣 下采樣(除了邊界效應引起的變化),
- 為了 對 特 征 圖 進 行 下 采 樣 \color{red}對特征圖進行下采樣 對特征圖進行下采樣, 我 們 不 用 步 幅 \color{red}我們不用步幅 我們不用步幅,而是通常使用 最 大 池 化 ( m a x ? p o o l i n g ) 運 算 \color{red}最大池化(max-pooling)運算 最大池化(max?pooling)運算,
5.1.5 最大池化運算
-
最大池化的定義:
- 最大池化是 從 輸 入 特 征 圖 中 提 取 窗 口 , 并 輸 出 每 個 通 道 的 最 大 值 \color{red}從輸入特征圖中提取視窗,并輸出每個通道的最大值 從輸入特征圖中提取窗口,并輸出每個通道的最大值,
- 使 用 硬 編 碼 的 m a x 張 量 運 算 對 局 部 圖 塊 進 行 變 換 , 而 不 是 使 用 學 到 的 線 性 變 換 ( 卷 積 核 ) \color{red}使用硬編碼的 max 張量運算對區域圖塊進行變換,而不是使用學到的線性變換(卷積核) 使用硬編碼的max張量運算對局部圖塊進行變換,而不是使用學到的線性變換(卷積核),
-
最大池化的作用:
- 減 少 需 要 處 理 的 特 征 圖 的 元 素 個 數 \color{red}減少需要處理的特征圖的元素個數 減少需要處理的特征圖的元素個數.
- 通過讓連續卷積層的觀察視窗越來越大, 從 而 引 入 空 間 過 濾 器 的 層 級 結 構 \color{red}從而引入空間過濾器的層級結構 從而引入空間過濾器的層級結構,
因為如果只使用卷積核會造成:
- 不 利 于 學 習 特 征 的 空 間 層 級 結 構 , \color{red}不利于學習特征的空間層級結構, 不利于學習特征的空間層級結構,
- 最 后 一 層 的 特 征 圖 對 每 個 樣 本 所 有 的 元 素 太 多 , 造 成 難 以 計 算 , \color{red}最后一層的特征圖對每個樣本所有的元素太多,造成難以計算, 最后一層的特征圖對每個樣本所有的元素太多,造成難以計算,
-
實作下采樣可以用:
- 步幅
padding; - 平均池,
但最大池化的效果往往比這些替代方法更好,觀察不同特征的最大值(而不是平均值)能夠給出更多的資訊,類似SIFT演算法的下采樣步驟,
- 步幅
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290211.html
標籤:AI
