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