
我的环境语言环境Python 3.10.14编译器jupyter notebook深度学习环境TensorFlow 2.17.0提示以下是本篇文章正文内容下面案例可供参考一、导入数据1.引入库导入TensorFlow库并从TensorFlow的Keras模块中导入数据集、层和模型的类。此外还导入了matplotlib.pyplot用于数据可视化。随后加载MNIST数据集这是一个广泛使用的手写数字识别数据集。从TensorFlow的Keras模块中导入数据集(datasets)、层(layers)和模型(models)。import matplotlib.pyplot as plt导入matplotlib的pyplot模块并简称为plt用于数据可视化。(train_images, train_labels), (test_images, test_labels) datasets.mnist.load_data()加载MNIST数据集。MNIST数据集包含手写数字的灰度图像每个图像大小为28x28像素。这行代码将数据集分为两个部分训练集和测试集。每个部分包含图像和对应的标签import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt (train_images, train_labels), (test_images, test_labels) datasets.mnist.load_data()2.归一化对MNIST数据集中的图像进行归一化处理并查看数据的维度信息。train_images, test_images train_images / 255.0, test_images / 255.0这行代码将训练集和测试集中的图像像素值从0到255的范围标准化到0到1的范围。这是通过将每个像素值除以255来实现的。归一化是深度学习中常用的预处理步骤它有助于模型更快地收敛。train_images.shape, test_images.shape, train_labels.shape, test_labels.shape这行代码打印出训练集图像、测试集图像、训练集标签和测试集标签的维度信息。train_images, test_images train_images / 255.0, test_images / 255.0 train_images.shape,test_images.shape,train_labels.shape,test_labels.shape代码输出((60000, 28, 28), (10000, 28, 28), (60000,), (10000,))二、使用步骤1.可视化图片将MNIST数据集中的前20张手写数字图片以子图的形式显示出来的。代码使用了matplotlib库的pyplot模块来创建和显示图像。创建一个新的图形窗口并设置其大小为20英寸宽和10英寸高。循环遍历前20张图片。plt.subplot(2,10,i1)在图形窗口中创建子图。这里创建了一个2行10列的子图布局每个子图用于显示一张图片。plt.xticks([])和plt.yticks([])设置子图不显示x轴和y轴的刻度。plt.grid(False)设置子图不显示网格线。plt.imshow(train_images[i], cmapplt.cm.binary)使用imshow函数显示第i张图片。cmapplt.cm.binary指定了使用二值色图来显示图像这样可以更清晰地区分图像中的黑白部分。plt.xlabel(train_labels[i])设置子图的x轴标签为对应的手写数字标签。plt.figure(figsize(20,10)) for i in range(20): plt.subplot(2,10,i1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(train_images[i], cmapplt.cm.binary) plt.xlabel(train_labels[i]) plt.show()代码输出2.调整图片格式将MNIST数据集中的图像从原始的三维数组重塑为四维数组以便用于卷积神经网络CNN模型。CNN模型通常需要四维输入其中最后一个维度是通道数。对于灰度图像通道数为1。train_images train_images.reshape((60000, 28, 28, 1))将训练集图像重塑为四维数组其中第一个维度是图像数量60000接下来的三个维度分别是图像的高度28、宽度28和通道数1。test_images test_images.reshape((10000, 28, 28, 1))将测试集图像重塑为四维数组其中第一个维度是图像数量10000接下来的三个维度分别是图像的高度28、宽度28和通道数1。train_images.shape, test_images.shape, train_labels.shape, test_labels.shape打印重塑后的训练集图像、测试集图像、训练集标签和测试集标签的维度信息。train_images train_images.reshape((60000, 28, 28, 1)) test_images test_images.reshape((10000, 28, 28, 1)) train_images.shape,test_images.shape,train_labels.shape,test_labels.shape代码输出((60000, 28, 28, 1), (10000, 28, 28, 1), (60000,), (10000,))三、构建CNN网络模型这段代码定义了一个用于手写数字识别的卷积神经网络CNN模型。模型由多个层组成包括卷积层、池化层、Flatten层和全连接层。layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1))这是一个卷积层它使用32个3x3大小的卷积核。activationrelu指定了使用ReLURectified Linear Unit激活函数这有助于增加网络的非线性特性并加速训练。input_shape(28, 28, 1)指定了输入数据的形状即28x28像素的灰度图像。layers.MaxPooling2D((2, 2))这是一个池化层它使用2x2大小的窗口进行最大池化以减少特征图的空间维度从而减少参数数量和计算量同时保留最重要的特征。layers.Conv2D(64, (3, 3), activationrelu)这是第二个卷积层它使用64个3x3大小的卷积核和ReLU激活函数。layers.MaxPooling2D((2, 2))这是第二个池化层同样使用2x2大小的最大池化。layers.Flatten()Flatten层将多维的输入一维化这是连接卷积层和全连接层的桥梁。layers.Dense(64, activationrelu)这是一个全连接层它有64个神经元和ReLU激活函数。这一层进一步提取特征。layers.Dense(10)这是输出层它有10个神经元对应于10个可能的数字类别0到9。由于这是一个多分类问题通常在输出层使用softmax激活函数但在Keras中如果使用tf.keras.losses.SparseCategoricalCrossentropy作为损失函数可以在不显式添加softmax激活函数的情况下直接使用原始分数。model models.Sequential([ layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activationrelu), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(64, activationrelu), layers.Dense(10) ]) model.summary()代码输出四、编译模型这段代码是用于配置卷积神经网络模型的训练参数包括优化器、损失函数和评估指标。这些参数是通过model.compile()方法设置的这是在训练模型之前必须进行的步骤。optimizeradam设置优化器为Adam。Adam优化器是一种自适应学习率优化算法它结合了RMSprop和Momentum两种优化算法的优点通常在训练深度学习模型时表现良好。losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue)设置损失函数为稀疏分类交叉熵损失函数。对于多分类问题如果标签是整数形式例如MNIST数据集中的0到9则使用SparseCategoricalCrossentropy。from_logitsTrue表示模型的输出不需要经过softmax激活函数因为SparseCategoricalCrossentropy会内部处理softmax转换。metrics[accuracy]设置性能评估指标为准确率。这意味着在训练过程中模型将监控并报告准确率指标即正确分类的样本占总样本的比例。model.compile( optimizeradam, losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue), metrics[accuracy])五、训练模型这段代码是使用TensorFlow的model.fit()方法来训练之前定义的卷积神经网络模型。这个方法是深度学习模型训练的核心它将输入数据和标签通过模型进行迭代训练直到达到指定的迭代次数epochs。下面是代码的详细解释train_images这是模型训练时使用的输入图像数据已经通过前面的代码进行了归一化和重塑。train_labels这是模型训练时使用的输入标签数据用于监督学习。epochs10这个参数设置了训练模型的迭代次数。每个epoch都会遍历一次完整的训练数据集。validation_data(test_images, test_labels)这个参数设置了验证数据集用于在每个epoch结束后评估模型的性能。test_images和test_labels分别是测试集的图像和标签数据。使用验证数据集可以帮助我们监控模型在未见过的数据上的表现防止过拟合。history model.fit( train_images, train_labels, epochs10, validation_data(test_images, test_labels))运行结果model.fit()函数参数batch_size每次梯度更新的样本数即批量大小。verbose控制日志显示的详细程度。callbacks回调函数列表可以在训练过程中的特定时机执行。validation_split用作验证集的训练数据的比例。shuffle是否在每轮迭代之前混洗数据。class_weight和sample_weight用于处理类别不平衡问题。initial_epoch开始训练的初始epoch编号。steps_per_epoch一个epoch包含的步数。validation_steps在验证集上的step总数。validation_freq使用验证集实施验证的频率。max_queue_size、workers、use_multiprocessing这些参数与多线程和多进程有关用于提高训练的效率。参考文献 model.fit() 参数详解【TensorFlow2入门手册】_model.fit workers-CSDN博客六、预测plt.imshow(test_images[1])代码输出pre model.predict(test_images) # 对所有测试图片进行预测 pre[1]代码输出总结该项目实现了一个使用TensorFlow和Keras框架的卷积神经网络模型旨在识别MNIST数据集中的手写数字。主要流程包括数据预处理如归一化和重塑以适应模型输入构建一个Sequential模型其中包含卷积层、池化层、Flatten层和全连接层编译模型时选择Adam优化器和交叉熵损失函数并设置准确率为性能指标接着进行模型训练指定迭代次数并使用测试集作为验证数据来监控性能最后通过预测测试集图像并展示其中一张图像及其预测概率分布来评估模型的分类效果。