
- Keras 教程
- Keras - 首頁
- Keras - 簡介
- Keras - 安裝
- Keras - 後端配置
- Keras - 深度學習概述
- Keras - 深度學習
- Keras - 模組
- Keras - 層
- Keras - 自定義層
- Keras - 模型
- Keras - 模型編譯
- Keras - 模型評估和預測
- Keras - 卷積神經網路
- Keras - 使用MPL進行迴歸預測
- Keras - 使用LSTM RNN進行時間序列預測
- Keras - 應用
- Keras - 使用ResNet模型進行即時預測
- Keras - 預訓練模型
- Keras 有用資源
- Keras - 快速指南
- Keras - 有用資源
- Keras - 討論
Keras - 卷積神經網路
讓我們將模型從MPL修改為卷積神經網路(CNN),用於我們之前的數字識別問題。
CNN 可以表示如下:

模型的核心特徵如下:
輸入層包含 (1, 8, 28) 個值。
第一層,Conv2D 包含 32 個過濾器和‘relu’啟用函式,核心大小為 (3,3)。
第二層,Conv2D 包含 64 個過濾器和‘relu’啟用函式,核心大小為 (3,3)。
第三層,MaxPooling 的池大小為 (2, 2)。
第五層,Flatten 用於將所有輸入展平為單一維度。
第六層,Dense 包含 128 個神經元和‘relu’啟用函式。
第七層,Dropout 的值為 0.5。
第八層也是最後一層包含 10 個神經元和‘softmax’啟用函式。
使用categorical_crossentropy作為損失函式。
使用Adadelta()作為最佳化器。
使用accuracy作為指標。
使用 128 作為批次大小。
使用 20 個 epochs。
步驟 1 - 匯入模組
讓我們匯入必要的模組。
import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras import backend as K import numpy as np
步驟 2 - 載入資料
讓我們匯入 mnist 資料集。
(x_train, y_train), (x_test, y_test) = mnist.load_data()
步驟 3 - 處理資料
讓我們根據我們的模型更改資料集,以便可以將其饋送到我們的模型中。
img_rows, img_cols = 28, 28 if K.image_data_format() == 'channels_first': x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols) else: x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10)
資料處理與MPL模型類似,只是輸入資料的形狀和影像格式配置不同。
步驟 4 - 建立模型
讓我們建立實際的模型。
model = Sequential() model.add(Conv2D(32, kernel_size = (3, 3), activation = 'relu', input_shape = input_shape)) model.add(Conv2D(64, (3, 3), activation = 'relu')) model.add(MaxPooling2D(pool_size = (2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation = 'relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation = 'softmax'))
步驟 5 - 編譯模型
讓我們使用選擇的損失函式、最佳化器和指標來編譯模型。
model.compile(loss = keras.losses.categorical_crossentropy, optimizer = keras.optimizers.Adadelta(), metrics = ['accuracy'])
步驟 6 - 訓練模型
讓我們使用fit()方法訓練模型。
model.fit( x_train, y_train, batch_size = 128, epochs = 12, verbose = 1, validation_data = (x_test, y_test) )
執行應用程式將輸出以下資訊:
Train on 60000 samples, validate on 10000 samples Epoch 1/12 60000/60000 [==============================] - 84s 1ms/step - loss: 0.2687 - acc: 0.9173 - val_loss: 0.0549 - val_acc: 0.9827 Epoch 2/12 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0899 - acc: 0.9737 - val_loss: 0.0452 - val_acc: 0.9845 Epoch 3/12 60000/60000 [==============================] - 83s 1ms/step - loss: 0.0666 - acc: 0.9804 - val_loss: 0.0362 - val_acc: 0.9879 Epoch 4/12 60000/60000 [==============================] - 81s 1ms/step - loss: 0.0564 - acc: 0.9830 - val_loss: 0.0336 - val_acc: 0.9890 Epoch 5/12 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0472 - acc: 0.9861 - val_loss: 0.0312 - val_acc: 0.9901 Epoch 6/12 60000/60000 [==============================] - 83s 1ms/step - loss: 0.0414 - acc: 0.9877 - val_loss: 0.0306 - val_acc: 0.9902 Epoch 7/12 60000/60000 [==============================] - 89s 1ms/step - loss: 0.0375 -acc: 0.9883 - val_loss: 0.0281 - val_acc: 0.9906 Epoch 8/12 60000/60000 [==============================] - 91s 2ms/step - loss: 0.0339 - acc: 0.9893 - val_loss: 0.0280 - val_acc: 0.9912 Epoch 9/12 60000/60000 [==============================] - 89s 1ms/step - loss: 0.0325 - acc: 0.9901 - val_loss: 0.0260 - val_acc: 0.9909 Epoch 10/12 60000/60000 [==============================] - 89s 1ms/step - loss: 0.0284 - acc: 0.9910 - val_loss: 0.0250 - val_acc: 0.9919 Epoch 11/12 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0287 - acc: 0.9907 - val_loss: 0.0264 - val_acc: 0.9916 Epoch 12/12 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0265 - acc: 0.9920 - val_loss: 0.0249 - val_acc: 0.9922
步驟 7 - 評估模型
讓我們使用測試資料評估模型。
score = model.evaluate(x_test, y_test, verbose = 0) print('Test loss:', score[0]) print('Test accuracy:', score[1])
執行以上程式碼將輸出以下資訊:
Test loss: 0.024936060590433316 Test accuracy: 0.9922
測試精度為 99.22%。我們建立了一個最佳模型來識別手寫數字。
步驟 8 - 預測
最後,從影像中預測數字,如下所示:
pred = model.predict(x_test) pred = np.argmax(pred, axis = 1)[:5] label = np.argmax(y_test,axis = 1)[:5] print(pred) print(label)
以上應用程式的輸出如下:
[7 2 1 0 4] [7 2 1 0 4]
兩個陣列的輸出相同,這表明我們的模型正確預測了前五個影像。