快速學(xué)會(huì)一個(gè)算法,卷積神經(jīng)網(wǎng)絡(luò)?。?!
今天給大家分享一個(gè)強(qiáng)大的算法模型,卷積神經(jīng)網(wǎng)絡(luò)。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)是一類專門用于處理具有網(wǎng)格結(jié)構(gòu)數(shù)據(jù)(如圖像)的深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像處理、計(jì)算機(jī)視覺等領(lǐng)域。
CNN 通過模仿生物視覺系統(tǒng)的結(jié)構(gòu),通過層級(jí)化的卷積和池化操作,自動(dòng)從輸入數(shù)據(jù)中提取特征并進(jìn)行分類或回歸。CNN 的優(yōu)勢(shì)在于其自動(dòng)特征提取能力,不需要人工設(shè)計(jì)特征,非常適合處理圖像等高維數(shù)據(jù)。
圖片
卷積神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(luò)主要由卷積層、池化層和全連接層組成。
卷積層
卷積層是 CNN 的核心層,它的核心思想是通過卷積操作提取圖像的局部特征。
在卷積操作中,使用一組(多個(gè))可訓(xùn)練的卷積核(也稱為濾波器)在輸入圖像上滑動(dòng),并與圖像的局部區(qū)域進(jìn)行卷積計(jì)算。
圖片
每個(gè)卷積核提取圖像的某一特征(如邊緣、紋理、顏色等)。
卷積操作后的結(jié)果是一個(gè)特征圖(Feature Map),表示了該特征在圖像中的空間分布。
關(guān)鍵概念
- 卷積核(Filter/Kerner)
卷積核是一個(gè)小的矩陣,通常是 3x3 或 5x5。 - 卷積核數(shù)量
定義了卷積層的輸出特征圖的數(shù)量。每個(gè)卷積核產(chǎn)生一個(gè)特征圖,多個(gè)卷積核可以提取多種不同的特征。 - 步幅(Stride)
步幅是卷積核在輸入數(shù)據(jù)上滑動(dòng)的步長。步幅決定了卷積操作的輸出尺寸。步幅越大,輸出特征圖越小。 - 填充(Padding)
為了保持輸入和輸出特征圖的尺寸一致,卷積操作通常會(huì)在輸入數(shù)據(jù)的邊緣添加額外的像素。這些額外的像素值通常設(shè)置為0。 - 卷積運(yùn)算
卷積核與輸入數(shù)據(jù)的每個(gè)局部區(qū)域進(jìn)行逐元素相乘并求和的操作。
例如,3x3的卷積核在圖像上滑動(dòng)時(shí),會(huì)與圖像的每個(gè) 3x3 區(qū)域進(jìn)行卷積計(jì)算,生成對(duì)應(yīng)位置的特征圖。
圖片
池化層
池化層用于降低特征圖的空間尺寸,減少計(jì)算量和參數(shù)數(shù)量,同時(shí)保留重要的特征信息
常用的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)。
- 最大池化(Max Pooling),從特定區(qū)域中選取最大值。
圖片
- 平均池化(Average Pooling),取特定區(qū)域的平均值。
圖片
全連接層
在卷積層和池化層提取了局部特征后,CNN 通常會(huì)通過一個(gè)或多個(gè)全連接層將這些特征映射到最終的輸出。例如,圖像分類問題中,全連接層的輸出就是各個(gè)類別的預(yù)測(cè)值。
圖片
CNN的優(yōu)勢(shì)
- 局部感知和權(quán)重共享
卷積操作利用局部感知特性,能夠在圖像的不同區(qū)域提取相似的特征(如邊緣、角點(diǎn)等)。
卷積核在整個(gè)圖像上共享權(quán)重,從而減少了參數(shù)的數(shù)量,避免了全連接網(wǎng)絡(luò)中參數(shù)過多帶來的問題。 - 平移不變性
由于卷積操作具有平移不變性,CNN 能夠有效地識(shí)別圖像中的目標(biāo),無論它們的位置如何。 - 自動(dòng)特征學(xué)習(xí)
CNN 能夠自動(dòng)從原始數(shù)據(jù)中學(xué)習(xí)到特征,而無需人工設(shè)計(jì)特征。
通過卷積層、池化層和全連接層的逐層組合,網(wǎng)絡(luò)能夠從簡單到復(fù)雜地學(xué)習(xí)圖像的層次化特征。
案例分享
下面是一個(gè)使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)進(jìn)行手寫數(shù)字識(shí)別的示例代碼。
首先,我們加載 MNIST 數(shù)據(jù)集。
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
import matplotlib.pyplot as plt
# 加載 MNIST 數(shù)據(jù)集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0
# 重塑數(shù)據(jù)為 [batch_size, 28, 28, 1] 形式
train_images = np.expand_dims(train_images, axis=-1)
test_images = np.expand_dims(test_images, axis=-1)
接下來我們將創(chuàng)建一個(gè)簡單的 CNN 模型。
# 構(gòu)建卷積神經(jīng)網(wǎng)絡(luò) (CNN) 模型
model = models.Sequential()
# 第一層卷積層,32個(gè)3x3的卷積核,激活函數(shù)ReLU
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
# 池化層,2x2的最大池化
model.add(layers.MaxPooling2D((2, 2)))
# 第二層卷積層,64個(gè)3x3的卷積核
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
# 池化層,2x2的最大池化
model.add(layers.MaxPooling2D((2, 2)))
# 展平層,將卷積層的輸出展平為一維
model.add(layers.Flatten())
# 全連接層,128個(gè)神經(jīng)元
model.add(layers.Dense(128, activatinotallow='relu'))
# 輸出層,10個(gè)神經(jīng)元,使用Softmax激活函數(shù)進(jìn)行分類
model.add(layers.Dense(10, activatinotallow='softmax'))
model.summary()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
接下來,我們將使用訓(xùn)練數(shù)據(jù)來訓(xùn)練模型。
history = model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))
訓(xùn)練完成后,我們可以使用測(cè)試集評(píng)估模型的性能。
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"測(cè)試集準(zhǔn)確率: {test_acc}")
predictions = model.predict(test_images)
# 打印預(yù)測(cè)結(jié)果和真實(shí)標(biāo)簽
for i in range(5):
print(f"真實(shí)標(biāo)簽: {test_labels[i]}")
print(f"預(yù)測(cè)標(biāo)簽: {np.argmax(predictions[i])}")
plt.imshow(test_images[i].reshape(28, 28), cmap=plt.cm.binary)
plt.show()
圖片