• 用了Keras来构建一个卷积神经网络对MNIST数据集进行分类


    首先导入所需库和模块,然后加载MNIST手写数字数据集并对数据进行预处理。接着定义了一个基于卷积神经网络(CNN)的模型,该模型包含多个卷积层、最大池化层以及Dropout层作为正则化手段。模型最后接一个全连接层作为输出层,使用softmax激活函数处理多分类任务。

    模型编译阶段设置了损失函数为“categorical_crossentropy”,优化器为Adam,评估指标为准确率。之后使用训练数据对模型进行训练,并在测试集上评估模型的性能,最终输出测试集上的准确率。

    1. from __future__ import absolute_import # 绝对导入,确保导入的模块是绝对路径下的
    2. from __future__ import division # 导入除法运算的未来版本特性
    3. from __future__ import print_function # 导入打印函数的未来版本特性
    4. import numpy as np
    5. from keras.models import Sequential
    6. from keras.optimizers import RMSprop
    7. from keras.layers import Activation, Dense, Dropout
    8. from keras.layers import Conv2D, MaxPooling2D, Flatten
    9. from keras.utils import to_categorical, plot_model
    10. from tensorflow.keras.datasets import mnist
    11. # 加载MNIST数据集
    12. (x_train, y_train), (x_test, y_test) = mnist.load_data()
    13. # 计算标签的数量
    14. num_labels = len(np.unique(y_train))
    15. # 将标签转换为 one-hot 向量
    16. y_train = to_categorical(y_train)
    17. y_test = to_categorical(y_test)
    18. # 图像输入尺寸
    19. image_size = x_train.shape[1]
    20. # 调整尺寸并进行归一化
    21. x_train = np.reshape(x_train, [-1, image_size, image_size, 1])
    22. x_test = np.reshape(x_test, [-1, image_size, image_size, 1])
    23. x_train = x_train.astype('float32') / 255
    24. x_test = x_test.astype('float32') / 255
    25. # 网络参数
    26. # 图像按原样处理(方形灰度图)
    27. input_shape = (image_size, image_size, 1)
    28. batch_size = 128
    29. kernel_size = 3
    30. pool_size = 2
    31. filters = 64
    32. dropout = 0.2
    33. # 模型是CNN-ReLU-MaxPooling的堆叠
    34. model = Sequential()
    35. model.add(Conv2D(filters=filters,
    36. kernel_size=kernel_size,
    37. activation='relu',
    38. input_shape=input_shape))
    39. model.add(MaxPooling2D(pool_size))
    40. model.add(Conv2D(filters=filters,
    41. kernel_size=kernel_size,
    42. activation='relu'))
    43. model.add(MaxPooling2D(pool_size))
    44. model.add(Conv2D(filters=filters,
    45. kernel_size=kernel_size,
    46. activation='relu'))
    47. model.add(Flatten())
    48. # 添加 dropout 作为正则化器
    49. model.add(Dropout(dropout))
    50. # 输出层是10维的 one-hot 向量
    51. model.add(Dense(num_labels))
    52. model.add(Activation('softmax'))
    53. model.summary()
    54. # 如果可以安装 pydot,则启用此功能
    55. # pip install pydot
    56. #plot_model(model, to_file='cnn-mnist.png', show_shapes=True)
    57. # 用于 one-hot 向量的损失函数
    58. # 使用 Adam 优化器
    59. # 精度是分类任务的好指标
    60. model.compile(loss='categorical_crossentropy',
    61. optimizer='adam',
    62. metrics=['accuracy'])
    63. # 训练网络
    64. model.fit(x_train, y_train, epochs=10, batch_size=batch_size)
    65. _, acc = model.evaluate(x_test,
    66. y_test,
    67. batch_size=batch_size,
    68. verbose=0)
    69. print("\nTest accuracy: %.1f%%" % (100.0 * acc))

    这段代码的主要步骤包括:

    1. 导入所需的模块。
    2. 加载MNIST数据集并进行预处理,包括将标签转换为 one-hot 向量,并将图像像素值归一化到 [0, 1] 区间。
    3. 定义了网络的参数,包括输入图像的尺寸、批处理大小、卷积核大小、池化大小等。
    4. 构建了一个简单的卷积神经网络模型,包括卷积层、ReLU激活函数、池化层、Dropout正则化层以及输出层。
    5. 编译模型,指定损失函数、优化器和评估指标。
    6. 使用训练集训练模型。
    7. 使用测试集评估模型性能,并打印出测试准确率。
  • 相关阅读:
    Swift 5.9 有哪些新特性(二)
    王怀远:阿里云一站式物联网存储架构设计
    【问题解决】Tensorflow中run究竟运行了哪些节点?
    猿创征文 | 2023年必须掌握的DevOps工具推荐(一)
    零基础学Java(2)数据类型与变量
    Python——数据结构
    【校招VIP】前端专业课考点之可靠传输协议
    制造业行业现状及智能生产管理系统一体化解决方案
    NVIDIA NeMo Metrics 轻量性能采集系统
    关于STM32 PWM频率 周期 Period更新问题
  • 原文地址:https://blog.csdn.net/lwhsyit/article/details/138170821