快速學會一個算法,CNN
今天給大家分享一個超強的算法,CNN
卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network,CNN)是一種深度學習模型,廣泛應用于圖像和視頻分析、自然語言處理和其他相關領域。CNN 通過模擬生物視覺系統(tǒng)的處理方式,能夠自動學習數(shù)據(jù)的層次特征。
在了解什么是 CNN 以及它們?nèi)绾芜\作之前,我們需要先了解神經(jīng)網(wǎng)絡。
什么是神經(jīng)網(wǎng)絡?
神經(jīng)網(wǎng)絡是一種深度學習方法,源自人類大腦生物神經(jīng)網(wǎng)絡的概念。它由大量相互連接的人工神經(jīng)元(也稱為節(jié)點或單元)組成,每個神經(jīng)元接收輸入,進行簡單處理后生成輸出,并將結果傳遞給下一層的神經(jīng)元。
圖片
傳統(tǒng)神經(jīng)網(wǎng)絡的問題
傳統(tǒng)神經(jīng)網(wǎng)絡,也稱為全連接神經(jīng)網(wǎng)絡,在處理輸入數(shù)據(jù)(如圖像)之前,將其展平為一長串數(shù)字。
想象一下,你有一個構成圖像的像素網(wǎng)格,你將該網(wǎng)格變成一長排像素。當你這樣做時,你會丟失有關每個像素相對于其他像素的位置的重要空間信息。這就像拆開一個拼圖,將所有碎片排成一行,你會失去這些碎片組成的圖畫。
由于空間信息的丟失,傳統(tǒng)的神經(jīng)網(wǎng)絡不太擅長理解圖像。
CNN 如何解決這個問題
卷積神經(jīng)網(wǎng)絡 (CNN) 是一種特殊類型的神經(jīng)網(wǎng)絡,專門用于處理網(wǎng)格狀數(shù)據(jù)(例如圖像)。
CNN 的設計目的是以一種保持空間信息完整的方式處理圖像。它們使用稱為卷積層的特殊層,以小部分掃描圖像,尋找模式。
圖片
- 卷積層
卷積層是 CNN 的核心組件。它通過應用卷積核(過濾器)在輸入數(shù)據(jù)上滑動,提取局部特征。每個卷積核都是一個小矩陣,通常尺寸較?。ㄈ?3x3、5x5)。卷積操作計算輸入圖像的局部區(qū)域與卷積核的點積,產(chǎn)生特征圖(feature map)。多個卷積核可以提取圖像的不同特征。 - 池化層
池化層用于下采樣,減少特征圖的尺寸,同時保留重要信息。常用的池化方法包括最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化選取池化窗口內(nèi)的最大值,而平均池化計算池化窗口內(nèi)的平均值。 - 全連接層
全連接層將一層中的每個神經(jīng)元鏈接到下一層中的每個神經(jīng)元,從而能夠根據(jù)卷積層和池化層提取的特征做出高級決策。
技術細節(jié)
卷積運算
卷積運算包括在輸入圖像上滑動過濾器并計算過濾器與過濾器覆蓋的圖像塊之間的點積。
圖片
此過程會生成一個特征圖,突出顯示特定特征,例如邊緣或紋理。通過卷積操作收集的特征類型取決于它使用的過濾器/內(nèi)核。
2.激活函數(shù)
激活函數(shù)將非線性引入網(wǎng)絡,使其能夠學習更復雜的模式。CNN 中最常用的激活函數(shù)是 ReLU(整流線性單元),它將負像素值替換為零,從而使網(wǎng)絡學習速度更快、性能更好。
圖片
3.池化層
池化層對特征圖進行下采樣,在保留基本信息的同時減小其大小。
最大池化從特征圖的每個塊中選擇最大值,因其在總結特征方面的有效性而被廣泛使用。
圖片
4.全連接層
卷積層和池化層完成從圖像中提取和匯總特征的工作后,需要對數(shù)據(jù)進行解釋和分類。這就是全連接層 (FC) 的作用所在,它在卷積神經(jīng)網(wǎng)絡 (CNN) 的決策過程中起著至關重要的作用。
圖片
案例分享
以下是使用 Keras 實現(xiàn) CNN 的示例,用于實現(xiàn)手寫數(shù)字識別任務(MNIST 數(shù)據(jù)集)。
1.導入庫和數(shù)據(jù)集
首先,導入必要的庫和 MNIST 數(shù)據(jù)集。
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.utils import to_categorical
# 加載 MNIST 數(shù)據(jù)集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 數(shù)據(jù)預處理
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype('float32') / 255
# 將標簽轉換為 one-hot 編碼
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
2.構建 CNN 模型
接下來,定義 CNN 模型的架構。
model = Sequential()
# 第一個卷積層,帶有 32 個 3x3 的濾波器,激活函數(shù)為 ReLU
model.add(Conv2D(32, kernel_size=(3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
# 第一個池化層,池化大小為 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第二個卷積層,帶有 64 個 3x3 的濾波器,激活函數(shù)為 ReLU
model.add(Conv2D(64, kernel_size=(3, 3), activatinotallow='relu'))
# 第二個池化層,池化大小為 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))
# 將多維數(shù)據(jù)展平為一維
model.add(Flatten())
# 全連接層,具有 128 個神經(jīng)元,激活函數(shù)為 ReLU
model.add(Dense(128, activatinotallow='relu'))
# 輸出層,具有 10 個神經(jīng)元(對應 10 個類別),激活函數(shù)為 softmax
model.add(Dense(10, activatinotallow='softmax'))
3.編譯模型
編譯模型,指定損失函數(shù)、優(yōu)化器和評價指標。
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
4.訓練模型
使用訓練數(shù)據(jù)訓練模型。
history = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10, batch_size=200, verbose=2)
5.評估模型
評估模型在測試數(shù)據(jù)上的性能。
scores = model.evaluate(x_test, y_test, verbose=0)
print(f"Accuracy: {scores[1]*100:.2f}%")
6.可視化訓練過程
繪制訓練和驗證的損失及準確率曲線。
# 繪制訓練和驗證損失曲線
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.show()
圖片