Keras - Mạng Neural Convolution

Hãy để chúng tôi sửa đổi mô hình từ MPL thành Convolution Neural Network (CNN) cho vấn đề nhận dạng chữ số trước đó của chúng tôi.

CNN có thể được trình bày như sau:

Các tính năng cốt lõi của mô hình như sau:

  • Lớp đầu vào bao gồm (1, 8, 28) giá trị.

  • Lớp đầu tiên, Conv2D bao gồm 32 bộ lọc và chức năng kích hoạt 'relu' với kích thước hạt nhân, (3,3).

  • Lớp thứ hai, Conv2D bao gồm 64 bộ lọc và chức năng kích hoạt 'relu' với kích thước hạt nhân, (3,3).

  • Lớp lưới, MaxPooling có kích thước hồ bơi là (2, 2).

  • Lớp thứ năm, Flatten được sử dụng để làm phẳng tất cả đầu vào của nó thành một chiều.

  • Lớp thứ sáu, Dense bao gồm 128 tế bào thần kinh và chức năng kích hoạt 'relu'.

  • Lớp thứ bảy, Dropout có 0,5 là giá trị của nó.

  • Lớp thứ tám và lớp cuối cùng bao gồm 10 tế bào thần kinh và chức năng kích hoạt 'softmax'.

  • Sử dụng categorical_crossentropy như hàm mất mát.

  • Sử dụng Adadelta() như Trình tối ưu hóa.

  • Sử dụng accuracy dưới dạng số liệu.

  • Sử dụng 128 làm kích thước lô.

  • Sử dụng 20 làm kỷ nguyên.

Step 1 − Import the modules

Hãy để chúng tôi nhập các mô-đun cần thiết.

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

Step 2 − Load data

Hãy để chúng tôi nhập tập dữ liệu mnist.

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

Step 3 − Process the data

Hãy để chúng tôi thay đổi tập dữ liệu theo mô hình của chúng tôi để nó có thể được đưa vào mô hình của chúng tôi.

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)

Việc xử lý dữ liệu tương tự như mô hình MPL ngoại trừ hình dạng của dữ liệu đầu vào và cấu hình định dạng hình ảnh.

Step 4 − Create the model

Hãy để chúng tôi tạo ra mô hình thực tế.

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'))

Step 5 − Compile the model

Hãy để chúng tôi biên dịch mô hình bằng cách sử dụng chức năng mất mát, trình tối ưu hóa và số liệu đã chọn.

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

Step 6 − Train the model

Hãy để chúng tôi đào tạo mô hình bằng cách sử dụng fit() phương pháp.

model.fit(
   x_train, y_train, 
   batch_size = 128, 
   epochs = 12, 
   verbose = 1, 
   validation_data = (x_test, y_test)
)

Việc thực thi ứng dụng sẽ xuất ra thông tin dưới đây:

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

Step 7 − Evaluate the model

Hãy để chúng tôi đánh giá mô hình bằng cách sử dụng dữ liệu thử nghiệm.

score = model.evaluate(x_test, y_test, verbose = 0) 

print('Test loss:', score[0]) 
print('Test accuracy:', score[1])

Thực thi đoạn mã trên sẽ xuất ra thông tin bên dưới:

Test loss: 0.024936060590433316 
Test accuracy: 0.9922

Độ chính xác của bài kiểm tra là 99,22%. Chúng tôi đã tạo ra một mô hình tốt nhất để xác định các chữ số viết tay.

Step 8 − Predict

Cuối cùng, dự đoán chữ số từ hình ảnh như dưới đây -

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

print(pred) 
print(label)

Kết quả của ứng dụng trên như sau:

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

Đầu ra của cả hai mảng là giống hệt nhau và nó cho biết mô hình của chúng tôi dự đoán chính xác năm hình ảnh đầu tiên.