講透一個(gè)強(qiáng)大的算法模型,CNN?。?/h1>
今天給大家介紹一個(gè)超強(qiáng)的算法模型,CNN
卷積神經(jīng)網(wǎng)絡(luò)(CNN)是一種深度學(xué)習(xí)模型,主要用于處理具有網(wǎng)格結(jié)構(gòu)(如圖像)的數(shù)據(jù)。CNN 在計(jì)算機(jī)視覺領(lǐng)域表現(xiàn)尤為突出,廣泛應(yīng)用于圖像分類、目標(biāo)檢測(cè)、圖像生成等任務(wù)。
CNN 通過引入卷積層、池化層等特殊層,能夠有效提取數(shù)據(jù)的局部特征,同時(shí)減少參數(shù)量,提升訓(xùn)練效率和模型的泛化能力。
CNN 的基本組成結(jié)構(gòu)
一個(gè)典型的卷積神經(jīng)網(wǎng)絡(luò)通常由以下幾個(gè)部分組成。
卷積層
卷積層是 CNN 的核心組件。它通過卷積操作來(lái)提取輸入數(shù)據(jù)的局部特征。
卷積操作是將一個(gè)小的濾波器(filter)或者稱為卷積核(kernel)在輸入數(shù)據(jù)上滑動(dòng),進(jìn)行逐元素的點(diǎn)積運(yùn)算,從而生成一個(gè)特征圖(feature map)。
- 局部連接:卷積核只作用于輸入圖像的局部區(qū)域,因此每個(gè)輸出特征僅與輸入圖像的一部分有關(guān)。
- 權(quán)重共享:卷積核在輸入圖像的不同區(qū)域重復(fù)使用,從而減少了模型的參數(shù)數(shù)量。
圖片
池化層
池化層的作用是減少特征圖的尺寸,降低計(jì)算復(fù)雜度,同時(shí)保留重要特征。常見的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。
- 最大池化:選取池化窗口內(nèi)的最大值作為輸出,保留了最顯著的特征。
- 平均池化:計(jì)算池化窗口內(nèi)的平均值,平滑特征圖。
圖片
全連接層
卷積層和池化層的輸出(特征圖)一般會(huì)展開成一個(gè)一維向量,并輸入到全連接層。
全連接層類似于傳統(tǒng)的前饋神經(jīng)網(wǎng)絡(luò),每個(gè)節(jié)點(diǎn)與上一層的所有節(jié)點(diǎn)相連。
全連接層用于綜合卷積層和池化層提取的特征并輸出最終的分類結(jié)果。
圖片
卷積神經(jīng)網(wǎng)絡(luò)的工作流程:
圖片
- 輸入層:輸入圖像數(shù)據(jù)。
- 卷積層:提取圖像的局部特征,通過多個(gè)卷積層逐步提取更高層次的特征。
- 池化層:對(duì)特征圖進(jìn)行下采樣,減少數(shù)據(jù)維度。
- 激活函數(shù):引入非線性特性,使模型能夠?qū)W習(xí)復(fù)雜的特征。
- 全連接層:將提取的特征整合并映射到分類空間。
- 輸出層:通常使用 Softmax 函數(shù)進(jìn)行多分類任務(wù),輸出每個(gè)類別的概率分布。
案例分享
以下是一個(gè)使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)進(jìn)行手寫數(shù)字識(shí)別的示例代碼,利用的是經(jīng)典的 MNIST 數(shù)據(jù)集。
首先導(dǎo)入必要的 python 庫(kù)。
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
然后加載和預(yù)處理數(shù)據(jù)。
# 加載 MNIST 數(shù)據(jù)集
(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()
圖片
接下來(lái),構(gòu)建 CNN 模型
# 構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)模型
model = models.Sequential()
# 第一層卷積,32 個(gè)過濾器,大小為 3x3,激活函數(shù)為 ReLU,輸入形狀為 28x28x1
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2))) # 最大池化層
# 第二層卷積,64 個(gè)過濾器,大小為 3x3
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 第三層卷積,64 個(gè)過濾器,大小為 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 個(gè)分類,使用 softmax 激活
model.summary()
圖片
然后,編譯和訓(xùn)練模型:
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))
# 繪制訓(xùn)練和驗(yàn)證損失曲線
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()
圖片
最后,對(duì)測(cè)試集進(jìn)行預(yù)測(cè):
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()
圖片