2022年最新深度學習入門指南
概述
1. 深度學習是用于處理視覺相關任務的強大的方法。
2. 卷積神經網絡是一種深度學習模型,我們用它來處理與計算機視覺相關的應用程序。
3. 在本指南中,我們將探索 CNN 的工作原理以及它們如何應用于圖像分類任務。我們還將構建一個 CNN 模型,并使用 Keras 從頭開始在訓練數(shù)據(jù)集上對其進行訓練。
介紹
我一直著迷于深度學習模型的潛力和力量,以及它們如何理解執(zhí)行圖像分類、圖像分割、對象檢測等任務。我們還遇到了一些分割算法,例如來自 X-的腫瘤/異常檢測,他們在這方面的表現(xiàn)甚至優(yōu)于醫(yī)生。
在本指南中,我們將全面介紹 CNN 及其在圖像分類任務中的應用。我們將首先介紹卷積神經網絡 (CNN) 背后的基本理論、它們的工作原理以及它們如何成為用于任何計算機視覺任務的最流行的模型之一。
現(xiàn)在讓我們開始吧……
卷積神經網絡
CNN 或卷積神經網絡是將圖像作為輸入并通過使用卷積運算學習圖像中的局部模式的算法。而密集層/全連接層則從輸入中學習全局模式。
CNN 的學習局部模式具有兩個特性:
1. CNN 學習的模式是不變的,即在學習識別圖像左下角的特定模式后,CNN 可以識別圖像中的任何位置。但是,如果密集連接的網絡出現(xiàn)在新位置的任何位置,則必須重新學習該模式。這使得 CNN 在處理和理解圖像時具有數(shù)據(jù)效率。
2. CNN 可以學習模式的空間層次,即第一個卷積層學習一個小的局部模式,如邊緣或線,第二個卷積層學習由第一個卷積層學習的特征組成的更大的模式,依此類推。通過這種方式,CNN 學習和理解了越來越復雜和抽象的視覺概念。
讓我們看看下面的貓圖,在這里我們可以看到,在第一個卷積層中,學習了邊緣、曲線等模式。但在第二層 CNN 中,眼睛、鼻子或耳朵等特征是通過使用第一層的模式來檢測的。通過這種方式,CNN了解圖像并了解圖像中的對象。
參考特征提取
現(xiàn)在讓我們探索并了解它是如何工作的。
卷積運算
卷積是應用于 3D 張量的操作,稱為特征圖。這些特征圖由兩個空間軸(高度和寬度)和一個深度軸(或通道軸)組成。
如果我們考慮 RGB 圖像的示例,高度和寬度構成空間軸,3 個顏色通道表示深度軸。類似地,對于黑白圖像,深度為 1。但在其他層的輸出中,深度不是由顏色通道表示,而是代表過濾器。
過濾器對輸入數(shù)據(jù)的特定方面進行編碼,即過濾器可以對“面部存在”或“汽車結構”等概念進行編碼。
卷積運算由兩個關鍵參數(shù)組成,
1. 內核大。簯糜趫D像的過濾器的大小。這些是典型的 3×3 或 5×5。
2. 輸出特征圖的深度:這是卷積計算的輸出濾波器的數(shù)量。
卷積操作只是在輸入特征圖上乘加加權濾波器,以生成另一個具有不同寬度、高度和深度的 3D 張量。卷積操作通過在 3D 輸入特征圖上滑動這些大小為 3×3 或 5×5 過濾器的窗口,在每個可能的位置停止,然后計算特征。
我們可以在下面的 gif 中看到操作,3×3 內核在 5×5 輸入特征圖上運行以生成 3×3 輸出。
參考卷積
重要的是要注意網絡從給定數(shù)據(jù)中學習所需的最佳過濾器。CNN 模型的權重是過濾器。
現(xiàn)在讓我們看看邊框效果、填充和步幅。
了解邊框效果和填充
現(xiàn)在再次讓我們考慮 5×5 特征圖(參考上面的 gif)。過濾器的大小為 3×3,因此有 9 個圖塊。
現(xiàn)在在卷積操作期間,3×3 濾波器只能通過 5×5 特征圖 9 次,因此我們的輸出大小為 3×3。所以輸出在這里從 5×5 縮小到 3×3,也就是說,在每個維度旁邊縮小了兩個圖塊。這里沒有對輸入特征圖應用填充,因此稱為有效填充。
如果我們希望輸出特征圖與輸入特征圖的大小相同,我們需要使用填充。填充包括在輸入特征圖的每一側添加適當數(shù)量的行和列,以使每個輸入圖塊周圍的中心卷積窗口成為可能。這種類型的填充稱為相同的填充。以下 GIF 表示相同的填充。
源邊框效果和填充現(xiàn)在我們可以看到,當我們向 5×5 特征圖添加額外的填充并應用 3×3 過濾器時,我們將能夠獲得與輸入特征圖大小相同的輸出特征圖。
如何找到要添加到給定過濾器大小和特征圖的填充?
當我們遇到不同大小的特征圖和過濾器以及我們如何確定對于有效和相同的情況應該使用多少填充時,自然會出現(xiàn)這個問題。所以要回答這個問題,我們有確定填充的公式,即
1. 有效填充:因為有效填充意味著沒有填充,所以padding的數(shù)量將為0。
2. 相同填充:我們使用相同的填充來保留輸入特征圖的大小。但是卷積的輸出主要取決于過濾器的大小,與輸入大小無關。因此,可以根據(jù)過濾器大小確定填充,如下所示:
相同填充 =(過濾器大小 - 1)/ 2
現(xiàn)在讓我們看看另一個可以影響輸出大小的因素,即步幅。
了解步幅
步幅是影響輸出特征圖大小的因素之一。步幅是應用過濾器的兩個連續(xù)窗口之間的距離。
在上面的例子中,我們已經看到過濾器作為窗口被應用于輸入特征圖,并被移動一個單位或步幅。當這種轉變大于1時,我們將其定義為跨步的CNN。下面的GIF是一個大步為2的CNN的例子。
我們還可以觀察到,當我們使用步幅的值為 2(或大于 1)時,與常規(guī)卷積(當 stride 的值 = 1 時)相比,輸出特征圖的大小減。ㄏ虏蓸右蜃訛 2) .
因此我們可以說使用步幅是對輸入特征圖進行下采樣的方法之一。但它們在實踐中很少使用,但它仍然是 CNN 的重要概念之一,了解它是很好的。
現(xiàn)在在開始 CNN 的實現(xiàn)之前,讓我們看一下用于對輸入特征進行下采樣的另一個重要概念,即池化。
理解池化
池化操作可以定義為一種通過使用不同的策略(例如取平均值、最大值、總和等)來積極減小/下采樣輸入特征圖的大小的方法,F(xiàn)在讓我們看看不同類型的池化
1.最大池化:最大池化是一種廣泛使用的池化策略,用于對輸入特征圖進行下采樣。在這一層中,確定大小的窗口通過輸入特征圖,然后獲得最大值并計算為下一層或輸出特征圖。
我們可以在下面的 GIF 中看到,當我們使用過濾器大小 2 執(zhí)行最大池化時,輸入特征被下采樣因子 2 或減半。
我們可以通過以下公式確定使用最大池化后輸出的大。
輸出大小=輸入大。ǔ鼗^濾器大小)
還有其他類型的池化策略,例如考慮窗口平均值的平均池化和考慮窗口權重總和的求和池化。
但最大池化一直是最流行和最廣泛使用的池化策略。這是因為當我們考慮過濾器窗口的最大值時,我們將能夠將有關輸入特征/當前特征圖的大部分可用信息轉移到下一個特征圖。因此,當我們通過神經網絡的層進行傳播時,減少了數(shù)據(jù)的丟失。
既然我們對 CNN 的工作原理有了一些了解,那么現(xiàn)在讓我們從頭開始實現(xiàn)一個 CNN。
從頭開始訓練基于 CNN 的圖像分類器
現(xiàn)在讓我們在 MNIST 數(shù)據(jù)集上訓練一個 CNN 模型。MNIST 數(shù)據(jù)集由 0 到 9 的手寫數(shù)字圖像組成,即 10 個類。訓練集由 60000 張圖像組成,測試集由 10000 張圖像組成。讓我們使用 CNN 從頭開始訓練圖像分類器。我們將在Keras框架中實現(xiàn)代碼。
Keras 是最受歡迎和使用最廣泛的深度學習庫之一。它是作為高級 API 構建的,可以輕松使用 TensorFlow。
要完成以下代碼實現(xiàn),建議使用帶有 GPU 的 Jupyter Notebook?梢酝ㄟ^Google Colaboratory訪問相同的內容,該實驗室提供基于云的 Jupyter Notebook環(huán)境和免費的 Nvidia GPU。
現(xiàn)在讓我們開始吧
獲取 MNIST 數(shù)據(jù)集
在下載數(shù)據(jù)集之前,讓我們進行必要的導入,
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ù)并緩存。由于我們正在加載預定義的數(shù)據(jù)集,因此該數(shù)據(jù)集已經被預處理并以元組的形式打包。
現(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)
輸出:
從上面的輸出我們可以看到,訓練數(shù)據(jù)集有 60000 張圖片,每張圖片的大小為 28×28。同樣,測試數(shù)據(jù)集有 10000 張圖像,圖像大小為 28×28。
我們還可以看到標簽沒有任何形狀,即它是一個標量值。讓我們看看一些標簽,
print(train_labels)
print(type(train_labels))
輸出:
我們可以看到標簽都在一個 NumPy 數(shù)組中。
現(xià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ù)模型訓練之前,讓我們對我們的數(shù)據(jù)進行一些預處理。
基本預處理
現(xiàn)在讓我們將圖像從 (60000, 28, 28) 重塑為 (60000, 28, 28, 1) 大小,其中最后一個維度表示圖像的深度。我們之前已經看到,每個圖像的特征圖都有三個維度,即寬度、高度和深度。由于 MNIST 訓練集由黑白圖像組成,我們可以將深度定義為 1。
接下來,我們應該對數(shù)據(jù)集進行歸一化,即將輸入的所有值都在 0 和 1 之間。由于圖像層的最大值是 255,我們將整個數(shù)據(jù)集除以 255。
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
現(xiàn)在讓我們也對測試集應用相同的預處理。
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
最后,讓我們將標簽轉換為分類格式,即它們目前作為標量,但我們正在執(zhí)行 One-Hot 編碼以將每個標量唯一地映射到向量。
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
train_labels[:10]
輸出:
我們可以看到訓練標簽是獨熱編碼。
現(xiàn)在讓我們使用 Keras 創(chuàng)建一個基本的 CNN 模型。
使用 Tensorflow-Keras 創(chuàng)建 CNN 模型
現(xiàn)在讓我們使用 Keras 庫創(chuàng)建一個基本模型,
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
現(xiàn)在我們來分析一下上面的代碼,
· 首先,我們正在創(chuàng)建一個Sequential類型類的對象。Sequential 模型是一種模型,我們可以在其中添加和堆疊層以形成端到端模型。
· 使用**.add**我們通過根據(jù)層指定各種參數(shù)來將層添加到我們的模型中。
· 在上面的模型中,我們添加了一個卷積層(即 Keras 中的 Conv2D),它接受許多過濾器、內核大小和激活函數(shù)作為參數(shù)。
· 接下來,添加最大池化層(即 Keras 中的 MaxPool2D)以啟用池化操作。
· Keras 中提供了不同類型的層。
模型的上述部分負責識別和檢測輸入數(shù)據(jù)中存在的模式。(我們上面討論過的工作)現(xiàn)在最后讓我們通過定義模型的輸出數(shù)量來初始化頭部。
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
現(xiàn)在我們的模型已經準備好了。我們可以使用**.summary()**方法查看模型中所有層的列表 。
model.summary()
輸出:
現(xiàn)在讓我們通過分配優(yōu)化器、損失函數(shù)和模型訓練時使用的指標來編譯模型。
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
現(xiàn)在讓我們用訓練數(shù)據(jù)和標簽擬合模型并訓練 5 個 epochs
model.fit(train_images, train_labels, epochs=5, batch_size=64)
結果:
從訓練結果中我們可以看出,該模型能夠達到高達 99% 的準確率,這真是令人印象深刻!!
結論
我們已經看到了卷積神經網絡的底層功能以及它如何從圖像中提取特征。因此,我們可以得出結論,卷積神經網絡是在計算機視覺應用中產生最先進結果的技術之一。
原文標題 : 2022年最新深度學習入門指南

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關稅,能否乘機器人東風翻身?