Keras 卷積神經(jīng)網(wǎng)絡

2021-10-15 15:08 更新

讓我們將模型從 MPL 修改為卷積神經(jīng)網(wǎng)絡(CNN),解決我們早期的數(shù)字識別問題。

CNN可以表示如下:

該模型的核心特征如下

  • 輸入層由 (1, 8, 28) 個值組成。
  • 第一層,Conv2D32 個過濾器和內(nèi)核大小為 (3,3)“relu”激活函數(shù)組成。
  • 第二層,Conv2D64 個過濾器和內(nèi)核大小為 (3,3)“relu”激活函數(shù)組成。
  • 第三層,MaxPooling 的池大小為 (2, 2)。
  • 第五層,Flatten用于將其所有輸入展平為單一維度。
  • 第六層,Dense128 個神經(jīng)元和“relu”激活函數(shù)組成。
  • 第七層,Dropout的值為 0.5
  • 第八層也是最后一層由 10 個神經(jīng)元和“softmax”激活函數(shù)組成。
  • 使用 categorical_crossentropy 作為損失函數(shù)。
  • 使用 Adadelta() 作為優(yōu)化器。
  • 使用 accuracy 作為指標。
  • 使用 128 作為批量大小。
  • 使用 20 作為紀元。

第 1 步 - 導入模塊

導入必要的模塊。

  1. import keras
  2. from keras.datasets import mnist
  3. from keras.models import Sequential
  4. from keras.layers import Dense, Dropout, Flatten
  5. from keras.layers import Conv2D, MaxPooling2D
  6. from keras import backend as K
  7. import numpy as np

第 2 步 - 加載數(shù)據(jù)

導入 mnist 數(shù)據(jù)集。

  1. (x_train, y_train), (x_test, y_test) = mnist.load_data()

第 3 步 - 處理數(shù)據(jù)

根據(jù)我們的模型更改數(shù)據(jù)集,以便將其輸入到我們的模型中。

  1. img_rows, img_cols = 28, 28
  2. if K.image_data_format() == 'channels_first':
  3. x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
  4. x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
  5. input_shape = (1, img_rows, img_cols)
  6. else:
  7. x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
  8. x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
  9. input_shape = (img_rows, img_cols, 1)
  10. x_train = x_train.astype('float32')
  11. x_test = x_test.astype('float32')
  12. x_train /= 255
  13. x_test /= 255
  14. y_train = keras.utils.to_categorical(y_train, 10)
  15. y_test = keras.utils.to_categorical(y_test, 10)

除了輸入數(shù)據(jù)的形狀和圖像格式配置之外,數(shù)據(jù)處理類似于 MPL 模型。

第 4 步 - 創(chuàng)建模型

創(chuàng)建實際模型。

  1. model = Sequential()
  2. model.add(Conv2D(32, kernel_size = (3, 3),
  3. activation = 'relu', input_shape = input_shape))
  4. model.add(Conv2D(64, (3, 3), activation = 'relu'))
  5. model.add(MaxPooling2D(pool_size = (2, 2)))
  6. model.add(Dropout(0.25)) model.add(Flatten())
  7. model.add(Dense(128, activation = 'relu'))
  8. model.add(Dropout(0.5))
  9. model.add(Dense(10, activation = 'softmax'))

第 5 步 - 編譯模型

使用選定的損失函數(shù)、優(yōu)化器和指標來編譯模型。

  1. model.compile(loss = keras.losses.categorical_crossentropy,
  2. optimizer = keras.optimizers.Adadelta(), metrics = ['accuracy'])

第 6 步 - 訓練模型

使用fit()方法訓練模型。

  1. model.fit(
  2. x_train, y_train,
  3. batch_size = 128,
  4. epochs = 12,
  5. verbose = 1,
  6. validation_data = (x_test, y_test)
  7. )

執(zhí)行應用程序?qū)⑤敵鲆韵滦畔?

  1. Train on 60000 samples, validate on 10000 samples Epoch 1/12
  2. 60000/60000 [==============================] - 84s 1ms/step - loss: 0.2687
  3. - acc: 0.9173 - val_loss: 0.0549 - val_acc: 0.9827 Epoch 2/12
  4. 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0899
  5. - acc: 0.9737 - val_loss: 0.0452 - val_acc: 0.9845 Epoch 3/12
  6. 60000/60000 [==============================] - 83s 1ms/step - loss: 0.0666
  7. - acc: 0.9804 - val_loss: 0.0362 - val_acc: 0.9879 Epoch 4/12
  8. 60000/60000 [==============================] - 81s 1ms/step - loss: 0.0564
  9. - acc: 0.9830 - val_loss: 0.0336 - val_acc: 0.9890 Epoch 5/12
  10. 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0472
  11. - acc: 0.9861 - val_loss: 0.0312 - val_acc: 0.9901 Epoch 6/12
  12. 60000/60000 [==============================] - 83s 1ms/step - loss: 0.0414
  13. - acc: 0.9877 - val_loss: 0.0306 - val_acc: 0.9902 Epoch 7/12
  14. 60000/60000 [==============================] - 89s 1ms/step - loss: 0.0375
  15. -acc: 0.9883 - val_loss: 0.0281 - val_acc: 0.9906 Epoch 8/12
  16. 60000/60000 [==============================] - 91s 2ms/step - loss: 0.0339
  17. - acc: 0.9893 - val_loss: 0.0280 - val_acc: 0.9912 Epoch 9/12
  18. 60000/60000 [==============================] - 89s 1ms/step - loss: 0.0325
  19. - acc: 0.9901 - val_loss: 0.0260 - val_acc: 0.9909 Epoch 10/12
  20. 60000/60000 [==============================] - 89s 1ms/step - loss: 0.0284
  21. - acc: 0.9910 - val_loss: 0.0250 - val_acc: 0.9919 Epoch 11/12
  22. 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0287
  23. - acc: 0.9907 - val_loss: 0.0264 - val_acc: 0.9916 Epoch 12/12
  24. 60000/60000 [==============================] - 86s 1ms/step - loss: 0.0265
  25. - acc: 0.9920 - val_loss: 0.0249 - val_acc: 0.9922

第 7 步 - 評估模型

讓我們使用測試數(shù)據(jù)評估模型。

  1. score = model.evaluate(x_test, y_test, verbose = 0)
  2. print('Test loss:', score[0])
  3. print('Test accuracy:', score[1])

執(zhí)行上述代碼將輸出以下信息:

  1. Test loss: 0.024936060590433316
  2. Test accuracy: 0.9922

測試準確率為99.22%。我們創(chuàng)建了一個最佳模型來識別手寫數(shù)字。

第 8 步- 預測

最后,從圖像中預測數(shù)字如下:

  1. pred = model.predict(x_test)
  2. pred = np.argmax(pred, axis = 1)[:5]
  3. label = np.argmax(y_test,axis = 1)[:5]
  4. print(pred)
  5. print(label)

上述應用程序的輸出如下:

  1. [7 2 1 0 4]
  2. [7 2 1 0 4]

兩個數(shù)組的輸出是相同的,這表明我們的模型正確預測了前五個圖像。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號