2022年最新深度學(xué)習(xí)入門指南
概述
1. 深度學(xué)習(xí)是用于處理視覺相關(guān)任務(wù)的強大的方法。
2. 卷積神經(jīng)網(wǎng)絡(luò)是一種深度學(xué)習(xí)模型,我們用它來處理與計算機視覺相關(guān)的應(yīng)用程序。
3. 在本指南中,我們將探索 CNN 的工作原理以及它們?nèi)绾螒?yīng)用于圖像分類任務(wù)。我們還將構(gòu)建一個 CNN 模型,并使用 Keras 從頭開始在訓(xùn)練數(shù)據(jù)集上對其進行訓(xùn)練。
介紹
我一直著迷于深度學(xué)習(xí)模型的潛力和力量,以及它們?nèi)绾卫斫鈭?zhí)行圖像分類、圖像分割、對象檢測等任務(wù)。我們還遇到了一些分割算法,例如來自 X-的腫瘤/異常檢測,他們在這方面的表現(xiàn)甚至優(yōu)于醫(yī)生。
在本指南中,我們將全面介紹 CNN 及其在圖像分類任務(wù)中的應(yīng)用。我們將首先介紹卷積神經(jīng)網(wǎng)絡(luò) (CNN) 背后的基本理論、它們的工作原理以及它們?nèi)绾纬蔀橛糜谌魏斡嬎銠C視覺任務(wù)的最流行的模型之一。
現(xiàn)在讓我們開始吧……
卷積神經(jīng)網(wǎng)絡(luò)
CNN 或卷積神經(jīng)網(wǎng)絡(luò)是將圖像作為輸入并通過使用卷積運算學(xué)習(xí)圖像中的局部模式的算法。而密集層/全連接層則從輸入中學(xué)習(xí)全局模式。
CNN 的學(xué)習(xí)局部模式具有兩個特性:
1. CNN 學(xué)習(xí)的模式是不變的,即在學(xué)習(xí)識別圖像左下角的特定模式后,CNN 可以識別圖像中的任何位置。但是,如果密集連接的網(wǎng)絡(luò)出現(xiàn)在新位置的任何位置,則必須重新學(xué)習(xí)該模式。這使得 CNN 在處理和理解圖像時具有數(shù)據(jù)效率。
2. CNN 可以學(xué)習(xí)模式的空間層次,即第一個卷積層學(xué)習(xí)一個小的局部模式,如邊緣或線,第二個卷積層學(xué)習(xí)由第一個卷積層學(xué)習(xí)的特征組成的更大的模式,依此類推。通過這種方式,CNN 學(xué)習(xí)和理解了越來越復(fù)雜和抽象的視覺概念。
讓我們看看下面的貓圖,在這里我們可以看到,在第一個卷積層中,學(xué)習(xí)了邊緣、曲線等模式。但在第二層 CNN 中,眼睛、鼻子或耳朵等特征是通過使用第一層的模式來檢測的。通過這種方式,CNN了解圖像并了解圖像中的對象。
參考特征提取
現(xiàn)在讓我們探索并了解它是如何工作的。
卷積運算
卷積是應(yīng)用于 3D 張量的操作,稱為特征圖。這些特征圖由兩個空間軸(高度和寬度)和一個深度軸(或通道軸)組成。
如果我們考慮 RGB 圖像的示例,高度和寬度構(gòu)成空間軸,3 個顏色通道表示深度軸。類似地,對于黑白圖像,深度為 1。但在其他層的輸出中,深度不是由顏色通道表示,而是代表過濾器。
過濾器對輸入數(shù)據(jù)的特定方面進行編碼,即過濾器可以對“面部存在”或“汽車結(jié)構(gòu)”等概念進行編碼。
卷積運算由兩個關(guān)鍵參數(shù)組成,
1. 內(nèi)核大。簯(yīng)用于圖像的過濾器的大小。這些是典型的 3×3 或 5×5。
2. 輸出特征圖的深度:這是卷積計算的輸出濾波器的數(shù)量。
卷積操作只是在輸入特征圖上乘加加權(quán)濾波器,以生成另一個具有不同寬度、高度和深度的 3D 張量。卷積操作通過在 3D 輸入特征圖上滑動這些大小為 3×3 或 5×5 過濾器的窗口,在每個可能的位置停止,然后計算特征。
我們可以在下面的 gif 中看到操作,3×3 內(nèi)核在 5×5 輸入特征圖上運行以生成 3×3 輸出。
參考卷積
重要的是要注意網(wǎng)絡(luò)從給定數(shù)據(jù)中學(xué)習(xí)所需的最佳過濾器。CNN 模型的權(quán)重是過濾器。
現(xiàn)在讓我們看看邊框效果、填充和步幅。
了解邊框效果和填充
現(xiàn)在再次讓我們考慮 5×5 特征圖(參考上面的 gif)。過濾器的大小為 3×3,因此有 9 個圖塊。
現(xiàn)在在卷積操作期間,3×3 濾波器只能通過 5×5 特征圖 9 次,因此我們的輸出大小為 3×3。所以輸出在這里從 5×5 縮小到 3×3,也就是說,在每個維度旁邊縮小了兩個圖塊。這里沒有對輸入特征圖應(yīng)用填充,因此稱為有效填充。
如果我們希望輸出特征圖與輸入特征圖的大小相同,我們需要使用填充。填充包括在輸入特征圖的每一側(cè)添加適當(dāng)數(shù)量的行和列,以使每個輸入圖塊周圍的中心卷積窗口成為可能。這種類型的填充稱為相同的填充。以下 GIF 表示相同的填充。
源邊框效果和填充現(xiàn)在我們可以看到,當(dāng)我們向 5×5 特征圖添加額外的填充并應(yīng)用 3×3 過濾器時,我們將能夠獲得與輸入特征圖大小相同的輸出特征圖。
如何找到要添加到給定過濾器大小和特征圖的填充?
當(dāng)我們遇到不同大小的特征圖和過濾器以及我們?nèi)绾未_定對于有效和相同的情況應(yīng)該使用多少填充時,自然會出現(xiàn)這個問題。所以要回答這個問題,我們有確定填充的公式,即
1. 有效填充:因為有效填充意味著沒有填充,所以padding的數(shù)量將為0。
2. 相同填充:我們使用相同的填充來保留輸入特征圖的大小。但是卷積的輸出主要取決于過濾器的大小,與輸入大小無關(guān)。因此,可以根據(jù)過濾器大小確定填充,如下所示:
相同填充 =(過濾器大小 - 1)/ 2
現(xiàn)在讓我們看看另一個可以影響輸出大小的因素,即步幅。
了解步幅
步幅是影響輸出特征圖大小的因素之一。步幅是應(yīng)用過濾器的兩個連續(xù)窗口之間的距離。
在上面的例子中,我們已經(jīng)看到過濾器作為窗口被應(yīng)用于輸入特征圖,并被移動一個單位或步幅。當(dāng)這種轉(zhuǎn)變大于1時,我們將其定義為跨步的CNN。下面的GIF是一個大步為2的CNN的例子。
我們還可以觀察到,當(dāng)我們使用步幅的值為 2(或大于 1)時,與常規(guī)卷積(當(dāng) stride 的值 = 1 時)相比,輸出特征圖的大小減。ㄏ虏蓸右蜃訛 2) .
因此我們可以說使用步幅是對輸入特征圖進行下采樣的方法之一。但它們在實踐中很少使用,但它仍然是 CNN 的重要概念之一,了解它是很好的。
現(xiàn)在在開始 CNN 的實現(xiàn)之前,讓我們看一下用于對輸入特征進行下采樣的另一個重要概念,即池化。
理解池化
池化操作可以定義為一種通過使用不同的策略(例如取平均值、最大值、總和等)來積極減小/下采樣輸入特征圖的大小的方法,F(xiàn)在讓我們看看不同類型的池化
1.最大池化:最大池化是一種廣泛使用的池化策略,用于對輸入特征圖進行下采樣。在這一層中,確定大小的窗口通過輸入特征圖,然后獲得最大值并計算為下一層或輸出特征圖。
我們可以在下面的 GIF 中看到,當(dāng)我們使用過濾器大小 2 執(zhí)行最大池化時,輸入特征被下采樣因子 2 或減半。
我們可以通過以下公式確定使用最大池化后輸出的大。
輸出大。捷斎氪笮。ǔ鼗^濾器大。
還有其他類型的池化策略,例如考慮窗口平均值的平均池化和考慮窗口權(quán)重總和的求和池化。
但最大池化一直是最流行和最廣泛使用的池化策略。這是因為當(dāng)我們考慮過濾器窗口的最大值時,我們將能夠?qū)⒂嘘P(guān)輸入特征/當(dāng)前特征圖的大部分可用信息轉(zhuǎn)移到下一個特征圖。因此,當(dāng)我們通過神經(jīng)網(wǎng)絡(luò)的層進行傳播時,減少了數(shù)據(jù)的丟失。
既然我們對 CNN 的工作原理有了一些了解,那么現(xiàn)在讓我們從頭開始實現(xiàn)一個 CNN。
從頭開始訓(xùn)練基于 CNN 的圖像分類器
現(xiàn)在讓我們在 MNIST 數(shù)據(jù)集上訓(xùn)練一個 CNN 模型。MNIST 數(shù)據(jù)集由 0 到 9 的手寫數(shù)字圖像組成,即 10 個類。訓(xùn)練集由 60000 張圖像組成,測試集由 10000 張圖像組成。讓我們使用 CNN 從頭開始訓(xùn)練圖像分類器。我們將在Keras框架中實現(xiàn)代碼。
Keras 是最受歡迎和使用最廣泛的深度學(xué)習(xí)庫之一。它是作為高級 API 構(gòu)建的,可以輕松使用 TensorFlow。
要完成以下代碼實現(xiàn),建議使用帶有 GPU 的 Jupyter Notebook?梢酝ㄟ^Google Colaboratory訪問相同的內(nèi)容,該實驗室提供基于云的 Jupyter Notebook環(huán)境和免費的 Nvidia GPU。
現(xiàn)在讓我們開始吧
獲取 MNIST 數(shù)據(jù)集
在下載數(shù)據(jù)集之前,讓我們進行必要的導(dǎo)入,
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import layers
from tensorflow.keras import models
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
現(xiàn)在讓我們下載數(shù)據(jù),
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
上面的代碼下載數(shù)據(jù)并緩存。由于我們正在加載預(yù)定義的數(shù)據(jù)集,因此該數(shù)據(jù)集已經(jīng)被預(yù)處理并以元組的形式打包。
現(xiàn)在讓我們探索我們解壓出來的這些張量的形狀,
int("Shape of training dataset: ",train_images.shape)
print("Shape of test dataset: ",test_images.shape)
print("Shape of training dataset labels: ",train_labels.shape)
print("Shape of test dataset labels: ",test_labels.shape)
輸出:
從上面的輸出我們可以看到,訓(xùn)練數(shù)據(jù)集有 60000 張圖片,每張圖片的大小為 28×28。同樣,測試數(shù)據(jù)集有 10000 張圖像,圖像大小為 28×28。
我們還可以看到標(biāo)簽沒有任何形狀,即它是一個標(biāo)量值。讓我們看看一些標(biāo)簽,
print(train_labels)
print(type(train_labels))
輸出:
我們可以看到標(biāo)簽都在一個 NumPy 數(shù)組中。
現(xiàn)在讓我們看看我們的一些訓(xùn)練圖像,
# plot first few images
for i in range(9):
# define subplot
pyplot.subplot(330 + 1 + i)
# plot raw pixel data
pyplot.imshow(train_images[i], cmap=pyplot.get_cmap('gray'))
# show the figure
pyplot.show()
輸出:
我們可以通過繪制它們來可視化訓(xùn)練樣本。
在我們繼續(xù)模型訓(xùn)練之前,讓我們對我們的數(shù)據(jù)進行一些預(yù)處理。
基本預(yù)處理
現(xiàn)在讓我們將圖像從 (60000, 28, 28) 重塑為 (60000, 28, 28, 1) 大小,其中最后一個維度表示圖像的深度。我們之前已經(jīng)看到,每個圖像的特征圖都有三個維度,即寬度、高度和深度。由于 MNIST 訓(xùn)練集由黑白圖像組成,我們可以將深度定義為 1。
接下來,我們應(yīng)該對數(shù)據(jù)集進行歸一化,即將輸入的所有值都在 0 和 1 之間。由于圖像層的最大值是 255,我們將整個數(shù)據(jù)集除以 255。
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.a(chǎn)stype('float32') / 255
現(xiàn)在讓我們也對測試集應(yīng)用相同的預(yù)處理。
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.a(chǎn)stype('float32') / 255
最后,讓我們將標(biāo)簽轉(zhuǎn)換為分類格式,即它們目前作為標(biāo)量,但我們正在執(zhí)行 One-Hot 編碼以將每個標(biāo)量唯一地映射到向量。
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
train_labels[:10]
輸出:
我們可以看到訓(xùn)練標(biāo)簽是獨熱編碼。
現(xiàn)在讓我們使用 Keras 創(chuàng)建一個基本的 CNN 模型。
使用 Tensorflow-Keras 創(chuàng)建 CNN 模型
現(xiàn)在讓我們使用 Keras 庫創(chuàng)建一個基本模型,
model = models.Sequential()
model.a(chǎn)dd(layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)))
model.a(chǎn)dd(layers.MaxPool2D((2,2)))
model.a(chǎn)dd(layers.Conv2D(64, (3,3), activation='relu'))
model.a(chǎn)dd(layers.MaxPool2D((2,2)))
model.a(chǎn)dd(layers.Conv2D(64, (3,3), activation='relu'))
現(xiàn)在我們來分析一下上面的代碼,
· 首先,我們正在創(chuàng)建一個Sequential類型類的對象。Sequential 模型是一種模型,我們可以在其中添加和堆疊層以形成端到端模型。
· 使用**.a(chǎn)dd**我們通過根據(jù)層指定各種參數(shù)來將層添加到我們的模型中。
· 在上面的模型中,我們添加了一個卷積層(即 Keras 中的 Conv2D),它接受許多過濾器、內(nèi)核大小和激活函數(shù)作為參數(shù)。
· 接下來,添加最大池化層(即 Keras 中的 MaxPool2D)以啟用池化操作。
· Keras 中提供了不同類型的層。
模型的上述部分負責(zé)識別和檢測輸入數(shù)據(jù)中存在的模式。(我們上面討論過的工作)現(xiàn)在最后讓我們通過定義模型的輸出數(shù)量來初始化頭部。
model.a(chǎn)dd(layers.Flatten())
model.a(chǎn)dd(layers.Dense(64, activation='relu'))
model.a(chǎn)dd(layers.Dense(10, activation='softmax'))
現(xiàn)在我們的模型已經(jīng)準(zhǔn)備好了。我們可以使用**.summary()**方法查看模型中所有層的列表 。
model.summary()
輸出:
現(xiàn)在讓我們通過分配優(yōu)化器、損失函數(shù)和模型訓(xùn)練時使用的指標(biāo)來編譯模型。
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
現(xiàn)在讓我們用訓(xùn)練數(shù)據(jù)和標(biāo)簽擬合模型并訓(xùn)練 5 個 epochs
model.fit(train_images, train_labels, epochs=5, batch_size=64)
結(jié)果:
從訓(xùn)練結(jié)果中我們可以看出,該模型能夠達到高達 99% 的準(zhǔn)確率,這真是令人印象深刻!
結(jié)論
我們已經(jīng)看到了卷積神經(jīng)網(wǎng)絡(luò)的底層功能以及它如何從圖像中提取特征。因此,我們可以得出結(jié)論,卷積神經(jīng)網(wǎng)絡(luò)是在計算機視覺應(yīng)用中產(chǎn)生最先進結(jié)果的技術(shù)之一。
原文標(biāo)題 : 2022年最新深度學(xué)習(xí)入門指南
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
-
5 夾縫中的文遠知行
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市