快速學會一個算法,CNN
大家好,我是小寒
今天給大家介紹一個強大的算法模型,CNN
卷積神經(jīng)網(wǎng)絡(Convolutional Neural Network, CNN)是一類特別適合處理圖像數(shù)據(jù)的深度學習模型。它們通過模擬生物視覺系統(tǒng)的處理方式,能夠自動學習和提取圖像中的特征。
CNN 由一系列層組成,每層都旨在從輸入數(shù)據(jù)中提取越來越復雜的特征,使其非常適合圖像分類、對象檢測和圖像生成等任務。
圖片
CNN 的核心組件
CNN 主要由卷積層(Convolutional Layer)、池化層(Pooling Layer)和全連接層(Fully Connected Layer)構成。
1.卷積層
卷積層是 CNN 的核心組件,用于從輸入數(shù)據(jù)中提取局部特征。
它通過卷積操作,將一個小的濾波器(或卷積核)應用到輸入圖像的不同區(qū)域,以捕捉局部的空間特征。
每個卷積核在輸入數(shù)據(jù)上滑動,并計算其與輸入數(shù)據(jù)的局部區(qū)域的點積,這個操作生成一個特征圖(Feature Map)。
圖片
1.1 過濾器/卷積核
過濾器/卷積核是檢測輸入數(shù)據(jù)中特定特征(如邊緣、紋理或圖案)的小矩陣。
網(wǎng)絡在訓練期間學習這些過濾器,每個過濾器負責檢測不同的特征。
圖片
1.2 步幅
卷積核在輸入圖像上移動的步長。步幅為 1 表示卷積核每次移動一個像素。
2.池化層
池化層用于對特征圖進行下采樣,減少特征圖的尺寸,從而降低計算量和減少過擬合。
池化操作通常選擇局部區(qū)域的最大值(最大池化)或平均值(平均池化),從而減少信息冗余。
2.1 最大池化
最大池化是一種提取局部區(qū)域中最顯著特征的操作。
在一個指定大小的池化窗口內(nèi),最大池化保留該區(qū)域中最大的數(shù)值,而忽略其他數(shù)值。
最大池化的效果是保留重要特征(如邊緣、亮度等),同時減少數(shù)據(jù)的維度。
圖片
2.2 平均池化
另一方面,平均池化是對池化窗口內(nèi)的所有值取平均值,從而得到一個代表性數(shù)值。
與最大池化不同,平均池化保留了池化窗口內(nèi)所有數(shù)值的信息,這使得它在某些應用中可以捕捉到更多的上下文信息。
圖片
3.全連接層
全連接層是卷積神經(jīng)網(wǎng)絡的重要組成部分,它將前一層(通常是卷積層或池化層)的輸出展平成一維向量,然后通過線性變換和激活函數(shù)進行處理。
全連接層的每個神經(jīng)元與前一層的所有神經(jīng)元相連接,因此稱為“全連接”。
全連接層的主要作用是將前面提取到的特征進行進一步組合和處理,從而得出最終的輸出(如分類結果)。
3.1 扁平化
扁平化將二維或三維特征圖轉(zhuǎn)換為一維向量,從而可以將卷積層和池化層連接到全連接層。
圖片
3.2 全連接層
全連接層通過處理卷積層和池化層提取的特征來執(zhí)行最終的分類或回歸任務。
圖片
案例分享
下面是一個使用卷積神經(jīng)網(wǎng)絡(CNN)進行手寫數(shù)字識別的案例代碼。
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
# 加載 MNIST 數(shù)據(jù)集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
train_images, test_images = train_images / 255.0, test_images / 255.0
train_images = train_images.reshape((train_images.shape[0], 28, 28, 1))
test_images = test_images.reshape((test_images.shape[0], 28, 28, 1))
# 構建 CNN 模型
model = models.Sequential([
layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activatinotallow='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activatinotallow='relu'),
layers.Flatten(),
layers.Dense(64, activatinotallow='relu'),
layers.Dense(10, activatinotallow='softmax')
])
# 編譯模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 訓練模型
history = model.fit(train_images, train_labels, epochs=5,
validation_data=(test_images, test_labels))
# 評估模型
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc:.4f}')
# 繪制訓練過程中的準確率
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.title('Accuracy Over Time')
plt.show()
圖片