終于把卷積神經(jīng)網(wǎng)絡(luò)算法搞懂了!!!
大家好,我是小寒
今天給大家分享一個強大的算法模型,卷積神經(jīng)網(wǎng)絡(luò)算法
卷積神經(jīng)網(wǎng)絡(luò)(CNN)是一種專門用于處理具有網(wǎng)格結(jié)構(gòu)數(shù)據(jù)(如圖像)的深度學習模型。
CNN 的核心是通過卷積操作來提取圖像中的局部特征,并通過池化操作降低數(shù)據(jù)的維度。
卷積神經(jīng)網(wǎng)絡(luò)在很多計算機視覺任務(wù)中都表現(xiàn)出色,比如圖像分類、目標檢測和圖像生成等。
圖片
相關(guān)原理
卷積神經(jīng)網(wǎng)絡(luò)由若干層堆疊而成,通常包括卷積層、池化層以及全連接層。
卷積層
卷積層是 CNN 的核心,它使用卷積核(或稱過濾器)對輸入進行卷積操作,以提取輸入數(shù)據(jù)的局部特征。
圖片
- 卷積操作
卷積層使用卷積核(或過濾器)在輸入數(shù)據(jù)上進行局部滑動,計算加權(quán)和來生成特征圖。
這個過程使卷積層能夠識別輸入數(shù)據(jù)中的局部模式,如邊緣、角點等。 - 共享權(quán)重
卷積核的參數(shù)是共享的,也就是說,在整個輸入數(shù)據(jù)中,所有位置使用相同的卷積核。
這種權(quán)重共享機制大大減少了模型的參數(shù)數(shù)量,避免過擬合,并提高了模型的訓(xùn)練效率。 - 參數(shù)
卷積層通常有三個重要參數(shù):
- 卷積核大小(filter size):通常為 3x3 或 5x5,用來定義卷積核的尺寸。
- 步長(stride),表示卷積核在輸入上移動的步幅。步長為 1 時,卷積核每次移動一個像素;步長為 2 時,卷積核每次移動兩個像素。
- 填充(padding),為了控制輸出的大小,填充會在輸入數(shù)據(jù)的邊緣補充零,從而保持輸出尺寸不變。
下圖顯示了使用 3x3 的卷積核和步長為1 進行卷積操作。
圖片
卷積層的作用
- 提取局部特征
- 通過共享權(quán)重減少參數(shù)數(shù)量
池化層
池化層用于對卷積層生成的特征圖進行下采樣,減少數(shù)據(jù)的空間維度和計算量,同時保留重要的特征。
常見的池化方法有最大池化和平均池化。
- 最大池化(Max Pooling)
最常用的池化方法。在局部區(qū)域內(nèi)取最大值作為該區(qū)域的輸出。
例如,對于一個 2x2 的局部區(qū)域,最大池化會輸出這四個值中的最大值。 - 平均池化(Average Pooling)
在局部區(qū)域內(nèi)取平均值作為輸出。
圖片
全連接層
全連接層通常位于卷積神經(jīng)網(wǎng)絡(luò)的最后幾層,用于將卷積和池化層提取的特征進行整合,并輸出預(yù)測結(jié)果。
全連接層與傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)層類似,每一個節(jié)點與上一層的所有節(jié)點都有連接。通過這些連接,全連接層可以將前面提取的特征整合起來,并通過權(quán)重和偏置項計算出最終的輸出。
扁平化
扁平化將二維或三維特征圖轉(zhuǎn)換為一維向量,從而可以將卷積層和池化層連接到全連接層。
圖片
全連接層
全連接層通過處理卷積層和池化層提取的特征來執(zhí)行最終的分類或回歸任務(wù)。
圖片
案例分享
下面是一個使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)進行手寫數(shù)字識別的示例代碼。
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt
# 加載MNIST數(shù)據(jù)集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)
# 構(gòu)建CNN模型
model = models.Sequential()
# 第一個卷積層,32 個濾波器,3x3 濾波器尺寸,ReLU激活函數(shù)
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
# 第二個卷積層,64 個濾波器
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
# 池化層,2x2 池化
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Dropout(0.25))
# 將多維特征圖展平
model.add(layers.Flatten())
# 全連接層,128個神經(jīng)元
model.add(layers.Dense(128, activatinotallow='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activatinotallow='softmax'))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_split=0.1)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")
# 繪制訓(xùn)練過程中的準確率和損失
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.legend()
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.title('Training and Validation Loss')
plt.show()
圖片