Keras Deep Learning - Construire un modèle CNN pour reconnaître les chiffres manuscrits du MNIST

Continuez à créer, accélérez la croissance ! C'est le 5ème jour de ma participation au "Nuggets Daily New Plan · June Update Challenge", cliquez pour voir les détails de l'événement

Analyse des tâches et des modèles

Dans Convolutional Neural Networks ( Convolutional Neural Network, CNN) Fundamentals, nous avons découvert les problèmes CNNdes comment . Dans cette section, nous allons construire un CNNmodèle pour reconnaître MNISTles chiffres manuscrits. Nous avons utilisé les stratégies suivantes pour construire le CNNmodèle :

  • La forme d'entrée est 28 x 28 x 1, la taille du noyau de convolution utilisé est3 x 3 x 1
    • Il convient de noter que la taille du noyau de convolution peut être modifiée, mais le nombre de canaux ne peut pas être modifié, il doit être le même que le nombre de canaux d'entrée
    • 10Utiliser les noyaux de convolution
  • Une fois que l'image d'entrée a traversé la couche convolutive, utilisez la couche de regroupement :
    • La taille de l'image de sortie est réduite de moitié
    • Sortie obtenue après mise en commun de l'aplatissement
  • La couche aplatie est connectée à une couche masquée 1000avec des unités
  • Enfin, connectez la couche cachée à la couche de sortie, qui a des 10classes (y compris des nombres 0-9) dans la couche de sortie

Après avoir construit le modèle, nous générons 1une , traduisons 1en pixels et testons les performances du CNNmodèle ; dans 1la section , nous avons vu qu'un réseau de neurones entièrement connecté ne peut pas s'efforcer de prédire cela signifie La catégorie de l'image.

Construction et formation du modèle CNN

Ensuite, Kerasimplémentez le CNNschéma défini ci-dessus à l'aide de l'implémentation pour MNISTapprendre à utiliser le CNNmodèle sur les données.

  1. Charger et prétraiter les données :
from keras.layers import Dense,Conv2D,MaxPool2D,Flatten
from keras.models import Sequential
from keras.datasets import mnist
from keras.utils import np_utils
import numpy as np

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[1], 1)
x_test = x_test.reshape(x_test.shape[0], x_test.shape[1], x_test.shape[1], 1)
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
复制代码

Les étapes de prétraitement sont exactement les mêmes que celles que nous avons utilisées dans Building Deep Feedforward Neural Networks .

  1. Créez et compilez le modèle :
model = Sequential()
model.add(Conv2D(10, (3, 3), input_shape=(28, 28, 1), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.summary()

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
复制代码

De brèves informations sur le schéma du modèle que nous avons initialisé dans le code précédent peuvent être obtenues :

model.summary()
复制代码

Les brèves informations de schéma du modèle de sortie sont les suivantes :

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 26, 26, 10)        100       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 10)        0         
_________________________________________________________________
flatten (Flatten)            (None, 1690)              0         
_________________________________________________________________
dense (Dense)                (None, 512)               865792    
_________________________________________________________________
dense_1 (Dense)              (None, 10)                5130      
=================================================================
Total params: 871,022
Trainable params: 871,022
Non-trainable params: 0
_________________________________________________________________
复制代码

Il y 100a un paramètres dans la couche convolutive, car il y a10 des noyaux de convolution dans la couche convolutive, il y a donc un total de paramètres de poids et de termes de biais (dans chaque noyau de convolution ), un total de paramètres. La couche max pooling n'a pas de paramètres car elle a seulement besoin de calculer la valeur maximale dans noyau de pooling de size . On peut voir que l'utilisation du modèle peut réduire considérablement la quantité de paramètres de réseau.3 x 3 x 1901011002 x 2CNN

  1. Enfin, ajustez le modèle :
model.fit(x_train, y_train,
            validation_data=(x_test, y_test),
            epochs=10,
            batch_size=1024,
            verbose=1)
复制代码

Le 10modèle epochpeut atteindre 98%une :

Suivi du processus de formation des modèles

  1. Ensuite, générez 1une et décalées 1de pixels :
# 获取标签为1的所有图像输入
x_test1 = x_test[y_test[:, 1]==1]
# 利用所有标签为1的图像生成均值图像
pic = np.zeros((x_test.shape[1], x_test.shape[2]))
pic2 = np.copy(pic)
for i in range(x_test1.shape[0]):
    pic2 = x_test1[i, :, :, 0]
pic = pic + pic2
pic = (pic / x_test1.shape[0])
# 将均值图像中的每个像素向左平移一个像素
for i in range(pic.shape[0]):
    if i < 21:
        pic[:, i] = pic[:, i+1]
# 对平移后的图像进行预测
p = model.predict(pic.reshape(1, x_test.shape[1], x_test.shape[2], 1))
print(p)
c = np.argmax(p)
print('CNN预测结果:', c)
复制代码

La sortie du modèle qui en résulte est la suivante :

[[1.3430370e-05 9.9989212e-01 2.0535077e-05 2.6301734e-07 4.3278211e-05
  5.9122913e-06 1.5874346e-05 6.2533190e-06 2.0079199e-06 4.1732173e-07]]
CNN预测结果: 1
复制代码

En y regardant, nous pouvons voir que les prédictions obtenues à l'aide de l' CNNarchitecture 1.

Liens connexes

Explication détaillée des concepts de base des réseaux de neurones convolutifs

Construire des réseaux de neurones convolutifs avec Keras

Je suppose que tu aimes

Origine juejin.im/post/7103728382965186573
conseillé
Classement