Python uses the Keras deep learning framework to build a convolutional neural network model to recognize MNIST handwritten fonts

1. Introduction to MNIST dataset

The MNIST dataset is a very famous dataset of handwritten digits and one of the most popular datasets in the field of machine learning. The images made up of this dataset are all 28x28 grayscale images. It has a total of 70,000 images, and it consists of 60,000 training images and 10,000 testing images. The MNIST dataset has been preprocessed and can be directly used to train the model.
The pictures in the dataset show handwritten numbers from 0 to 9, and the labels identify which numbers the picture shows.

2. Obtain training set and test

Python uses the Keras deep learning framework to recognize MNIST handwritten fonts based on the convolutional neural network model. The prediction accuracy of the model on the test set is 99%

## 60000张 训练图片,每张图片28*28
## 10000张 测试图片,每张图片28*28
def prepareData(self):
    (xTrain, yTrain), (xTest, yTest) = keras.datasets.mnist.load_data()
    xTrain = xTrain / 255.0 # 缩放  numpy.ndarray,(60000, 28, 28)
    xTest = xTest / 255.0   # 缩放, 范围[0,1]

    xTrain = np.expand_dims(xTrain, -1)  # (60000, 28, 28) -> (60000, 28, 28, 1)
    xTest = np.expand_dims(xTest, -1)    # (10000, 28, 28) -> (10000, 28, 28, 1)
    print("xTrain shape", xTrain.shape)
    yTrain = keras.utils.to_categorical(yTrain, num_classes=10) # 将整型的类别标签转为onehot编码
    yTest = keras.utils.to_categorical(yTest, num_classes=10)   # 10个数字,num_classes为10
    print(type(yTrain))
    return xTrain, yTrain, xTest, yTest

return training set X,y; test X,y

3. Create a convolutional neural network model

def createModel(self):
    inputShape = (28, 28, 1)    #  (60000, 28, 28, 1),60000个样本
    # 激活函数:sigmoid,relu,tanh
    # 卷积层可以处理二维数据,矩阵
    # 全连接层只能处理一维数据,向量
    model = keras.Sequential(
        [
            keras.Input(shape=inputShape),
            layers.Conv2D(32, kernel_size=(3, 3), activation='relu'),  # 卷积层:卷积函数:32 过滤器个数
            layers.MaxPooling2D(pool_size=(2, 2)),   # 最大池化层
            layers.Conv2D(32, kernel_size=(3, 3), activation='relu'),  # 卷积层:卷积核尺寸,一般是3*3,或者5*5
            layers.MaxPooling2D(pool_size=(2, 2)),   # 最大池化层
            layers.Flatten(),     # 将输入层的数据压成一维数据,
            layers.Dropout(0.5),  # 深度学习网络训练过程中,按照一定的概率丢弃神经网络单元,防止过拟合,默认0.5,丢弃50%的神经元
            # Softmax 函数能够将一个K维实值向量归一化,所以它主要被用于多分类任务
            # Sigmoid 能够将一个实数归一化,因此它一般用于二分类任务。
            # 当 Softmax 的维数 K=2 时,Softmax 会退化为 Sigmoid 函数
            layers.Dense(10, activation="softmax")  # Dense代表全连接网络,输出维度10,激活函数softmax
        ]
    )

    model.summary()  # 输出模型各层的参数状况
    return model

4. Training model

def trainModel(self, model:keras.Sequential, xTrain:numpy.array, yTrain:numpy.array):
    # 指定损失函数
    model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
    model.fit(xTrain,
              yTrain,
              batch_size=128,         # 每次梯度更新的样本数,默认32
              epochs=15,              # 训练模型迭代次数
              validation_split=0.1)   # 验证集的比例
    return model

5. Test model

def testModel(self, model:keras.Sequential, xTest, yTest):
    score = model.evaluate(xTest, yTest,
                           verbose=0) # 日志展示,0-不输出;1-显示进度条;2-每个epochs输出1行记录
    print("Loss:", score[0])        # 损失
    print("Accuracy:", score[1])    # 准确率

6. Complete code

# -*- coding: utf-8 -*-
import numpy
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

# Keras Mnist 模型
class KrMnistModel(object):

    ## 60000张 训练图片,每张图片28*28
    ## 10000张 测试图片,每张图片28*28
    def prepareData(self):
        (xTrain, yTrain), (xTest, yTest) = keras.datasets.mnist.load_data()
        xTrain = xTrain / 255.0 # 缩放  numpy.ndarray,(60000, 28, 28)
        xTest = xTest / 255.0   # 缩放, 范围[0,1]

        xTrain = np.expand_dims(xTrain, -1)  # (60000, 28, 28) -> (60000, 28, 28, 1)
        xTest = np.expand_dims(xTest, -1)    # (10000, 28, 28) -> (10000, 28, 28, 1)
        print("xTrain shape", xTrain.shape)
        yTrain = keras.utils.to_categorical(yTrain, num_classes=10) # 将整型的类别标签转为onehot编码
        yTest = keras.utils.to_categorical(yTest, num_classes=10)   # 10个数字,num_classes为10
        print(type(yTrain))
        return xTrain, yTrain, xTest, yTest

    def createModel(self):
        inputShape = (28, 28, 1)    #  (60000, 28, 28, 1),60000个样本
        # 激活函数:sigmoid,relu,tanh
        # 卷积层可以处理二维数据,矩阵
        # 全连接层只能处理一维数据,向量
        model = keras.Sequential(
            [
                keras.Input(shape=inputShape),
                layers.Conv2D(32, kernel_size=(3, 3), activation='relu'),  # 卷积层:卷积函数:32 过滤器个数
                layers.MaxPooling2D(pool_size=(2, 2)),   # 最大池化层
                layers.Conv2D(32, kernel_size=(3, 3), activation='relu'),  # 卷积层:卷积核尺寸,一般是3*3,或者5*5
                layers.MaxPooling2D(pool_size=(2, 2)),   # 最大池化层
                layers.Flatten(),     # 将输入层的数据压成一维数据,
                layers.Dropout(0.5),  # 深度学习网络训练过程中,按照一定的概率丢弃神经网络单元,防止过拟合,默认0.5,丢弃50%的神经元
                # Softmax 函数能够将一个K维实值向量归一化,所以它主要被用于多分类任务
                # Sigmoid 能够将一个实数归一化,因此它一般用于二分类任务。
                # 当 Softmax 的维数 K=2 时,Softmax 会退化为 Sigmoid 函数
                layers.Dense(10, activation="softmax")  # Dense代表全连接网络,输出维度10,激活函数softmax
            ]
        )

        model.summary()  # 输出模型各层的参数状况
        return model


    def trainModel(self, model:keras.Sequential, xTrain:numpy.array, yTrain:numpy.array):
        # 指定损失函数
        model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
        model.fit(xTrain,
                  yTrain,
                  batch_size=128,         # 每次梯度更新的样本数,默认32
                  epochs=15,              # 训练模型迭代次数
                  validation_split=0.1)   # 验证集的比例
        return model

    def testModel(self, model:keras.Sequential, xTest, yTest):
        score = model.evaluate(xTest, yTest,
                               verbose=0) # 日志展示,0-不输出;1-显示进度条;2-每个epochs输出1行记录
        print("Loss:", score[0])        # 损失
        print("Accuracy:", score[1])    # 准确率


# main function
if __name__ == '__main__':
    krObj = KrMnistModel()
    print("准备数据……")
    xTrain, yTrain, xTest, yTest = krObj.prepareData()
    print("创建模型……")
    model = krObj.createModel()
    print("训练模型……")
    model = krObj.trainModel(model, xTrain, yTrain)
    print("测试模型……")
    krObj.testModel(model, xTest, yTest)

7. Running results

"C:\Program Files\Python37\python.exe" D:/MyProj/TfDLProj/krModel/KrMnistModel.py
2023-04-09 20:22:06.754283: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
准备数据……
xTrain shape (60000, 28, 28, 1)
<class 'numpy.ndarray'>
创建模型……
2023-04-09 20:22:13.968864: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2023-04-09 20:22:13.978588: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library nvcuda.dll
2023-04-09 20:22:14.046314: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1720] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: GeForce GTX 1650 Ti computeCapability: 7.5
coreClock: 1.485GHz coreCount: 16 deviceMemorySize: 4.00GiB deviceMemoryBandwidth: 178.84GiB/s
2023-04-09 20:22:14.047261: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2023-04-09 20:22:14.097692: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublas64_11.dll
2023-04-09 20:22:14.097992: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublasLt64_11.dll
2023-04-09 20:22:14.122078: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cufft64_10.dll
2023-04-09 20:22:14.129733: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library curand64_10.dll
2023-04-09 20:22:14.183585: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusolver64_10.dll
2023-04-09 20:22:14.199841: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusparse64_11.dll
2023-04-09 20:22:14.204166: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudnn64_8.dll
2023-04-09 20:22:14.204704: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1862] Adding visible gpu devices: 0
2023-04-09 20:22:14.206580: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-04-09 20:22:14.208133: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1720] Found device 0 with properties: 
pciBusID: 0000:01:00.0 name: GeForce GTX 1650 Ti computeCapability: 7.5
coreClock: 1.485GHz coreCount: 16 deviceMemorySize: 4.00GiB deviceMemoryBandwidth: 178.84GiB/s
2023-04-09 20:22:14.208710: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2023-04-09 20:22:14.208996: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublas64_11.dll
2023-04-09 20:22:14.209275: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublasLt64_11.dll
2023-04-09 20:22:14.209560: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cufft64_10.dll
2023-04-09 20:22:14.209838: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library curand64_10.dll
2023-04-09 20:22:14.210123: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusolver64_10.dll
2023-04-09 20:22:14.210397: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusparse64_11.dll
2023-04-09 20:22:14.210673: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudnn64_8.dll
2023-04-09 20:22:14.210985: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1862] Adding visible gpu devices: 0
2023-04-09 20:22:15.198078: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1261] Device interconnect StreamExecutor with strength 1 edge matrix:
2023-04-09 20:22:15.198413: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1267]      0 
2023-04-09 20:22:15.198590: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1280] 0:   N 
2023-04-09 20:22:15.199449: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2903 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1650 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5)
2023-04-09 20:22:15.201051: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
Model: "sequential"

_________________________________________________________________

Layer (type)                 Output Shape              Param #   
=================================================================

conv2d (Conv2D)              (None, 26, 26, 32)        320       

_________________________________________________________________

max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0         

_________________________________________________________________

conv2d_1 (Conv2D)            (None, 11, 11, 32)        9248      

_________________________________________________________________

max_pooling2d_1 (MaxPooling2 (None, 5, 5, 32)          0         

_________________________________________________________________

flatten (Flatten)            (None, 800)               0         

_________________________________________________________________

dropout (Dropout)            (None, 800)               0         

_________________________________________________________________

dense (Dense)                (None, 10)                8010      
=================================================================

Total params: 17,578
Trainable params: 17,578
Non-trainable params: 0

_________________________________________________________________

训练模型……
2023-04-09 20:22:15.442757: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
Epoch 1/15
2023-04-09 20:22:15.784489: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublas64_11.dll
2023-04-09 20:22:16.640072: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublasLt64_11.dll
2023-04-09 20:22:16.653720: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudnn64_8.dll
2023-04-09 20:22:18.352832: I tensorflow/core/platform/windows/subprocess.cc:308] SubProcess ended with return code: 0

2023-04-09 20:22:18.470222: I tensorflow/core/platform/windows/subprocess.cc:308] SubProcess ended with return code: 0

422/422 [==============================] - 7s 8ms/step - loss: 0.9618 - accuracy: 0.6814 - val_loss: 0.0942 - val_accuracy: 0.9747
Epoch 2/15
422/422 [==============================] - 3s 6ms/step - loss: 0.1555 - accuracy: 0.9518 - val_loss: 0.0662 - val_accuracy: 0.9832
Epoch 3/15
422/422 [==============================] - 3s 6ms/step - loss: 0.1119 - accuracy: 0.9658 - val_loss: 0.0522 - val_accuracy: 0.9853
Epoch 4/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0925 - accuracy: 0.9707 - val_loss: 0.0461 - val_accuracy: 0.9878
Epoch 5/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0804 - accuracy: 0.9739 - val_loss: 0.0444 - val_accuracy: 0.9878
Epoch 6/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0752 - accuracy: 0.9766 - val_loss: 0.0426 - val_accuracy: 0.9873
Epoch 7/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0723 - accuracy: 0.9783 - val_loss: 0.0379 - val_accuracy: 0.9890
Epoch 8/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0677 - accuracy: 0.9791 - val_loss: 0.0375 - val_accuracy: 0.9887
Epoch 9/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0633 - accuracy: 0.9798 - val_loss: 0.0333 - val_accuracy: 0.9907
Epoch 10/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0606 - accuracy: 0.9804 - val_loss: 0.0323 - val_accuracy: 0.9902
Epoch 11/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0571 - accuracy: 0.9826 - val_loss: 0.0348 - val_accuracy: 0.9905
Epoch 12/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0555 - accuracy: 0.9825 - val_loss: 0.0327 - val_accuracy: 0.9903
Epoch 13/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0520 - accuracy: 0.9841 - val_loss: 0.0326 - val_accuracy: 0.9905
Epoch 14/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0506 - accuracy: 0.9836 - val_loss: 0.0328 - val_accuracy: 0.9910
Epoch 15/15
422/422 [==============================] - 3s 6ms/step - loss: 0.0533 - accuracy: 0.9834 - val_loss: 0.0316 - val_accuracy: 0.9910
测试模型……
Loss: 0.029247775673866272
Accuracy: 0.9900000095367432

Process finished with exit code 0

Accuracy: 0.9900000095367432
Correct rate: 99%

Guess you like

Origin blog.csdn.net/programmer589/article/details/130457765