Keras - Faltungs-Neuronales Netz

Lassen Sie uns das Modell von MPL auf ändern Convolution Neural Network (CNN) für unser früheres Problem der Ziffernidentifikation.

CNN kann wie folgt dargestellt werden -

Die Hauptmerkmale des Modells sind wie folgt:

  • Die Eingabeebene besteht aus (1, 8, 28) Werten.

  • Erste Schicht, Conv2D besteht aus 32 Filtern und einer 'relu'-Aktivierungsfunktion mit Kernelgröße (3,3).

  • Zweite Schicht, Conv2D besteht aus 64 Filtern und einer 'relu'-Aktivierungsfunktion mit Kernelgröße (3,3).

  • Dünne Schicht, MaxPooling hat Poolgröße von (2, 2).

  • Fünfte Schicht, Flatten wird verwendet, um alle Eingaben in eine einzige Dimension zu reduzieren.

  • Sechste Schicht, Dense besteht aus 128 Neuronen und 'Relu'-Aktivierungsfunktion.

  • Siebte Schicht, Dropout hat 0,5 als Wert.

  • Die achte und letzte Schicht besteht aus 10 Neuronen und der Softmax-Aktivierungsfunktion.

  • Verwenden categorical_crossentropy als Verlustfunktion.

  • Verwenden Adadelta() als Optimierer.

  • Verwenden accuracy als Metriken.

  • Verwenden Sie 128 als Stapelgröße.

  • Verwenden Sie 20 als Epochen.

Step 1 − Import the modules

Importieren wir die notwendigen Module.

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

Importieren wir den Mnist-Datensatz.

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

Step 3 − Process the data

Lassen Sie uns den Datensatz entsprechend unserem Modell ändern, damit er in unser Modell eingespeist werden kann.

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)

Die Datenverarbeitung ähnelt dem MPL-Modell mit Ausnahme der Form der Eingabedaten und der Konfiguration des Bildformats.

Step 4 − Create the model

Lassen Sie uns das eigentliche Modell erstellen.

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

Lassen Sie uns das Modell mit ausgewählten Verlustfunktionen, Optimierern und Metriken kompilieren.

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

Step 6 − Train the model

Lassen Sie uns das Modell mit trainieren fit() Methode.

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

Beim Ausführen der Anwendung werden die folgenden Informationen ausgegeben:

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

Lassen Sie uns das Modell anhand von Testdaten bewerten.

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

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

Wenn Sie den obigen Code ausführen, werden die folgenden Informationen ausgegeben:

Test loss: 0.024936060590433316 
Test accuracy: 0.9922

Die Testgenauigkeit beträgt 99,22%. Wir haben ein bestes Modell erstellt, um die Handschriftziffern zu identifizieren.

Step 8 − Predict

Schließlich prognostizieren Sie die Ziffer aus Bildern wie folgt -

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

print(pred) 
print(label)

Die Ausgabe der obigen Anwendung ist wie folgt:

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

Die Ausgabe beider Arrays ist identisch und zeigt an, dass unser Modell die ersten fünf Bilder korrekt vorhersagt.