講透一個強大的算法模型,CNN!!
今天給大家介紹一個超強的算法模型,CNN
卷積神經網絡(CNN)是一種深度學習模型,主要用于處理具有網格結構(如圖像)的數據。CNN 在計算機視覺領域表現尤為突出,廣泛應用于圖像分類、目標檢測、圖像生成等任務。
CNN 通過引入卷積層、池化層等特殊層,能夠有效提取數據的局部特征,同時減少參數量,提升訓練效率和模型的泛化能力。
CNN 的基本組成結構
一個典型的卷積神經網絡通常由以下幾個部分組成。
卷積層
卷積層是 CNN 的核心組件。它通過卷積操作來提取輸入數據的局部特征。
卷積操作是將一個小的濾波器(filter)或者稱為卷積核(kernel)在輸入數據上滑動,進行逐元素的點積運算,從而生成一個特征圖(feature map)。
- 局部連接:卷積核只作用于輸入圖像的局部區域,因此每個輸出特征僅與輸入圖像的一部分有關。
- 權重共享:卷積核在輸入圖像的不同區域重復使用,從而減少了模型的參數數量。
圖片
池化層
池化層的作用是減少特征圖的尺寸,降低計算復雜度,同時保留重要特征。常見的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。
- 最大池化:選取池化窗口內的最大值作為輸出,保留了最顯著的特征。
- 平均池化:計算池化窗口內的平均值,平滑特征圖。
圖片
全連接層
卷積層和池化層的輸出(特征圖)一般會展開成一個一維向量,并輸入到全連接層。
全連接層類似于傳統的前饋神經網絡,每個節點與上一層的所有節點相連。
全連接層用于綜合卷積層和池化層提取的特征并輸出最終的分類結果。
圖片
卷積神經網絡的工作流程:
圖片
- 輸入層:輸入圖像數據。
- 卷積層:提取圖像的局部特征,通過多個卷積層逐步提取更高層次的特征。
- 池化層:對特征圖進行下采樣,減少數據維度。
- 激活函數:引入非線性特性,使模型能夠學習復雜的特征。
- 全連接層:將提取的特征整合并映射到分類空間。
- 輸出層:通常使用 Softmax 函數進行多分類任務,輸出每個類別的概率分布。
案例分享
以下是一個使用卷積神經網絡(CNN)進行手寫數字識別的示例代碼,利用的是經典的 MNIST 數據集。
首先導入必要的 python 庫。
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
然后加載和預處理數據。
# 加載 MNIST 數據集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
train_images = train_images.reshape((train_images.shape[0], 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((test_images.shape[0], 28, 28, 1)).astype('float32') / 255
plt.figure(figsize=(8, 4))
for i in range(10):
plt.subplot(2, 5, i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i].reshape(28, 28), cmap=plt.cm.binary)
plt.xlabel(train_labels[i])
plt.show()
圖片
接下來,構建 CNN 模型
# 構建卷積神經網絡模型
model = models.Sequential()
# 第一層卷積,32 個過濾器,大小為 3x3,激活函數為 ReLU,輸入形狀為 28x28x1
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2))) # 最大池化層
# 第二層卷積,64 個過濾器,大小為 3x3
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 第三層卷積,64 個過濾器,大小為 3x3
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
# 全連接層
model.add(layers.Flatten()) # 將卷積層的輸出展開為一維向量
model.add(layers.Dense(64, activatinotallow='relu')) # 全連接層
model.add(layers.Dense(10, activatinotallow='softmax')) # 輸出層,10 個分類,使用 softmax 激活
model.summary()
圖片
然后,編譯和訓練模型:
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))
# 繪制訓練和驗證損失曲線
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(loc='upper right')
plt.show()
圖片
最后,對測試集進行預測:
predictions = model.predict(test_images)
plt.figure(figsize=(8, 4))
for i in range(10):
plt.subplot(2, 5, i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(test_images[i].reshape(28, 28), cmap=plt.cm.binary)
plt.xlabel(f"True: {test_labels[i]}, Pred: {predictions[i].argmax()}")
plt.show()
圖片