Keras 教學 3 – CNN 卷積層、池化層、展平層、密集層、丟棄層

An artist’s illustration of artificial intelligence (AI). This image depicts how AI could be used in the field of sustainability from biodiversity to climate. It was created by Nidia Dias ...

Keras 是一個開源的深度學習庫,在這篇Keras 教學文章中,我們將學習使用Keras建立卷積神經網路(Convolutional Neural Network, CNN)來解決手寫數字辨識問題。我們將應用卷積層、池化層、展平層、密集層和丟棄層,創造一個MNIST卷積神經網路。

卷積層

卷積層是CNN的核心。它用於提取圖像特徵。以下是一個卷積層的例子:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D

cnn = Sequential()
cnn.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) # 卷積層

在這個例子中,我們使用了一個3×3 大小的卷積核(kernel),並且使用ReLU激活函數。

參數說明

  • filters: 卷積核數量。在這個例子中為32。
  • kernel_size: 卷積核大小。在這個例子中為 3×3。
  • activation: 激活函數。在這個例子中為ReLU。
  • input_shape: 輸入形狀。在這個例子中為 28×28×1,即單通道的 28×28圖像。

池化層

池化層用於降低特徵圖的空間維度,減少參數和計算量。以下是一個池化層的例子:

from tensorflow.keras.layers import MaxPooling2D

cnn.add(MaxPooling2D((2, 2))) # 池化層

在這個例子中,我們使用了 2×2 大小的池化窗口,以減少圖像的空間尺寸。

參數說明

  • pool_size: 池化窗口大小。在這個例子中為 2×2。

展平層

展平層將卷積層和池化層的輸出展平為一維向量,以便與全連接層(密集層)相連接。以下是一個展平層的例子:

from tensorflow.keras.layers import Flatten

cnn.add(Flatten()) # 展平層

參數說明

密集層

密集層是通常的全連接神經網路(Fully Connected Neural Network)。以下是一個密集層的例子:

from tensorflow.keras.layers import Dense

cnn.add(Dense(64, activation='relu')) # 密集層

參數說明

  • units: 神經元數量。在這個例子中為64。
  • activation: 激活函數。在這個例子中為ReLU。

丟棄層

丟棄層用於防止過度擬合(Overfitting),通過隨機丟棄一部分神經元來實現。以下是一個丟棄層的例子:

from tensorflow.keras.layers import Dropout

cnn.add(Dropout(0.25)) # 丟棄層

在這個例子中,我們丟棄了25%的神經元。

參數說明

  • rate: 丟棄率。在這個例子中為0.25。

CNN架構例子

讓我們來建立一個完整的CNN架構例子:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout

cnn = Sequential()
cnn.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) # 卷積層
cnn.add(MaxPooling2D((2, 2))) # 池化層
cnn.add(Conv2D(64, (3, 3), activation='relu')) # 卷積層
cnn.add(MaxPooling2D((2, 2))) # 池化層
cnn.add(Conv2D(64, (3, 3), activation='relu')) # 卷積層
cnn.add(Flatten()) # 展平層
cnn.add(Dense(64, activation='relu')) # 密集層
cnn.add(Dense(10, activation='softmax')) # 密集層

cnn.summary()

該CNN架構共有三個卷積層,每個池化層在每個卷積層後面。接下來是一個展平層,然後是兩個密集層。這樣的架構適用於MNIST手寫數字辨識。

參數說明

  • Conv2D(32, (3, 3), activation=’relu’, input_shape=(28, 28, 1)): 32個 3×33×3 大小的卷積核,ReLU激活函數,輸入形狀為 28×28×128×28×1。
  • MaxPooling2D((2, 2)): 2×22×2 大小的池化窗口。
  • Conv2D(64, (3, 3), activation=’relu’): 64個 3×33×3 大小的卷積核,ReLU激活函數。
  • Flatten(): 將輸出展平為一維向量。
  • Dense(64, activation=’relu’): 64個神經元的全連接層,ReLU激活函數。
  • Dense(10, activation=’softmax’): 10個神經元的全連接層,softmax激活函數。

CNN實作 CIFAR-10

如果您想要在CIFAR-10數據集上實作CNN,以下是一個簡單的例子:

from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical

# 載入CIFAR-10數據集
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

# 正規化數據
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

# 對目標變量進行one-hot編碼
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 創建CNN模型
cnn_cifar = Sequential()
cnn_cifar.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
cnn_cifar.add(MaxPooling2D((2, 2)))
cnn_cifar.add(Conv2D(64, (3, 3), activation='relu'))
cnn_cifar.add(MaxPooling2D((2, 2)))
cnn_cifar.add(Conv2D(64, (3, 3), activation='relu'))
cnn_cifar.add(Flatten())
cnn_cifar.add(Dense(64, activation='relu'))
cnn_cifar.add(Dense(10, activation='softmax'))

# 編譯模型
cnn_cifar.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])

# 訓練模型
history_cifar = cnn_cifar.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.2)

通過本文,我們深入探討了在Keras中使用卷積神經網路(CNN)時的卷積層、池化層、展平層、密集層和丟棄層。這些概念對於理解和有效地訓練CNN模型至關重要。在您的AI之旅中,請牢記這些概念,它們將成為您的強大工具之一。

keras連結: https://keras.io Back to Blog

返回頂端