快速學會一個算法,CNN
今天給大家分享一個超強的算法,CNN
卷積神經網絡(Convolutional Neural Network,CNN)是一種深度學習模型,廣泛應用于圖像和視頻分析、自然語言處理和其他相關領域。CNN 通過模擬生物視覺系統的處理方式,能夠自動學習數據的層次特征。
在了解什么是 CNN 以及它們如何運作之前,我們需要先了解神經網絡。
什么是神經網絡?
神經網絡是一種深度學習方法,源自人類大腦生物神經網絡的概念。它由大量相互連接的人工神經元(也稱為節點或單元)組成,每個神經元接收輸入,進行簡單處理后生成輸出,并將結果傳遞給下一層的神經元。
圖片
傳統神經網絡的問題
傳統神經網絡,也稱為全連接神經網絡,在處理輸入數據(如圖像)之前,將其展平為一長串數字。
想象一下,你有一個構成圖像的像素網格,你將該網格變成一長排像素。當你這樣做時,你會丟失有關每個像素相對于其他像素的位置的重要空間信息。這就像拆開一個拼圖,將所有碎片排成一行,你會失去這些碎片組成的圖畫。
由于空間信息的丟失,傳統的神經網絡不太擅長理解圖像。
CNN 如何解決這個問題
卷積神經網絡 (CNN) 是一種特殊類型的神經網絡,專門用于處理網格狀數據(例如圖像)。
CNN 的設計目的是以一種保持空間信息完整的方式處理圖像。它們使用稱為卷積層的特殊層,以小部分掃描圖像,尋找模式。
圖片
- 卷積層
卷積層是 CNN 的核心組件。它通過應用卷積核(過濾器)在輸入數據上滑動,提取局部特征。每個卷積核都是一個小矩陣,通常尺寸較小(如 3x3、5x5)。卷積操作計算輸入圖像的局部區域與卷積核的點積,產生特征圖(feature map)。多個卷積核可以提取圖像的不同特征。 - 池化層
池化層用于下采樣,減少特征圖的尺寸,同時保留重要信息。常用的池化方法包括最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化選取池化窗口內的最大值,而平均池化計算池化窗口內的平均值。 - 全連接層
全連接層將一層中的每個神經元鏈接到下一層中的每個神經元,從而能夠根據卷積層和池化層提取的特征做出高級決策。
技術細節
卷積運算
卷積運算包括在輸入圖像上滑動過濾器并計算過濾器與過濾器覆蓋的圖像塊之間的點積。
圖片
此過程會生成一個特征圖,突出顯示特定特征,例如邊緣或紋理。通過卷積操作收集的特征類型取決于它使用的過濾器/內核。
2.激活函數
激活函數將非線性引入網絡,使其能夠學習更復雜的模式。CNN 中最常用的激活函數是 ReLU(整流線性單元),它將負像素值替換為零,從而使網絡學習速度更快、性能更好。
圖片
3.池化層
池化層對特征圖進行下采樣,在保留基本信息的同時減小其大小。
最大池化從特征圖的每個塊中選擇最大值,因其在總結特征方面的有效性而被廣泛使用。
圖片
4.全連接層
卷積層和池化層完成從圖像中提取和匯總特征的工作后,需要對數據進行解釋和分類。這就是全連接層 (FC) 的作用所在,它在卷積神經網絡 (CNN) 的決策過程中起著至關重要的作用。
圖片
案例分享
以下是使用 Keras 實現 CNN 的示例,用于實現手寫數字識別任務(MNIST 數據集)。
1.導入庫和數據集
首先,導入必要的庫和 MNIST 數據集。
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 數據集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 數據預處理
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 的濾波器,激活函數為 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 的濾波器,激活函數為 ReLU
model.add(Conv2D(64, kernel_size=(3, 3), activatinotallow='relu'))
# 第二個池化層,池化大小為 2x2
model.add(MaxPooling2D(pool_size=(2, 2)))
# 將多維數據展平為一維
model.add(Flatten())
# 全連接層,具有 128 個神經元,激活函數為 ReLU
model.add(Dense(128, activatinotallow='relu'))
# 輸出層,具有 10 個神經元(對應 10 個類別),激活函數為 softmax
model.add(Dense(10, activatinotallow='softmax'))
3.編譯模型
編譯模型,指定損失函數、優化器和評價指標。
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
4.訓練模型
使用訓練數據訓練模型。
history = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10, batch_size=200, verbose=2)
5.評估模型
評估模型在測試數據上的性能。
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()
圖片