訂閱
糾錯
加入自媒體

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í)入門指南

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號