ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于神经网络的mnist数据集的手写数字识别

基于神经网络的mnist数据集的手写数字识别 目录1. MNIST 数据集数据格式与存储结构2. 数据集加载与验证数据集对象属性访问3. 利用tensorflow识别MNISTSoftmax 回归的数学表达以及实现数据读取与占位符/变量定义Softmax 回归模型构建损失函数与优化器定义会话运行与训练流程4.卷积神经网络在MNIST分类中的优势输入重塑从向量还原到 28×28 图像卷积/池化相关的辅助函数两层卷积网络结构全连接层与 Dropout 处理输出层与损失函数优化器配置与训练准确率评估与测试1. MNIST 数据集训练图像共包含60000张每张图像为28×28像素的灰度图对应一个手写数字标签0到9。这些图像用于模型的训练过程使模型学习不同数字的特征表示。测试图像共包含10000张同样为28×28像素的灰度图与训练集具有相同的分布特性。测试集用于评估训练后模型的泛化能力提供独立于训练数据的性能指标。数据格式与存储结构原始的MNIST数据以二进制格式存储通常包括以下文件train-images.idx3-ubyte训练图像数据。train-labels.idx1-ubyte训练图像对应的标签。t10k-images.idx3-ubyte测试图像数据。t10k-labels.idx1-ubyte测试图像对应的标签。2. 数据集加载与验证通过执行语句mnist input_data.read_data_sets(MNIST_data/, one_hotTrue)可以加载MNIST手写数字数据集。该操作会检查本地目录MNIST_data/是否已存在所需的数据文件。若目录中缺少数据文件系统将自动从官方源下载原始数据并解压至MNIST_data/文件夹内。下载过程包括训练集、测试集和验证集的图像数据及标签信息。数据集对象属性访问加载完成后mnist对象包含多个属性可用于访问不同部分的数据mnist.train.images返回训练集的图像数据形状为[55000, 784]每张图像是一个长度为784的向量28×28像素展平。mnist.train.labels返回训练集对应的标签采用 one-hot 编码形状为[55000, 10]。mnist.test.images测试集图像数据形状为[10000, 784]。mnist.test.labels测试集标签one-hot 编码形状为[10000, 10]。mnist.validation.images验证集图像数据通常为训练集中抽取的5000张图片。mnist.validation.labels验证集标签对应 one-hot 编码。训练标签mnist.train.labels的形状为 (55000, 10)表示共有 55000 张训练图像每张图像对应一个 10 维的 One-Hot 向量。每个数字类别0 到 9被映射为一个长度为 10 的二进制向量其中只有对应类别的位置为 1其余均为 0。例如数字 0 对应的 One-Hot 向量是[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]数字 1 对应的 One-Hot 向量是[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]...数字 9 对应的 One-Hot 向量是[0, 0, 0, 0, 0, 0, 0, 0, 0, 1]这种表示方式便于神经网络进行分类任务因为输出层可以有 10 个神经元每个神经元对应一个类别通过 Softmax 激活函数输出概率分布。3. 利用tensorflow识别MNISTSoftmax 回归的数学表达以及实现Softmax 函数的作用是把各类别的“打分”logits转换成满足概率约束的数值每个类别概率在 0–1 之间且所有类别概率之和为 1。设单个样本特征为 x模型参数为 W、b则先计算各类别的打分logit W^T x b数据读取与占位符/变量定义首先导入 TensorFlow 并读取 MNIST 数据集然后定义输入 x、参数 W 和 b以及标签 y_import tensorflow as tf from tensorflow.keras.datasets import mnist # 读取 MNIST 数据集 (x_train, y_train), (x_test, y_test) mnist.load_data() # 归一化像素值至 [0, 1] 范围 x_train x_train.astype(float32) / 255.0 x_test x_test.astype(float32) / 255.0 # 将图像展平为 784 维向量28x28 x_train x_train.reshape(-1, 784) x_test x_test.reshape(-1, 784) # 定义输入占位符x 表示输入图像数据形状为 [None, 784] x tf.placeholder(tf.float32, [None, 784]) # 定义模型参数权重 W784×10偏置 b10 W tf.Variable(tf.zeros([784, 10])) b tf.Variable(tf.zeros([10])) # 定义标签占位符y_ 表示真实类别标签形状为 [None, 10]one-hot 编码 y_ tf.placeholder(tf.float32, [None, 10])Softmax 回归模型构建# 计算线性输出z xW b z tf.matmul(x, W) b # 应用 Softmax 函数得到预测概率分布 y tf.nn.softmax(z)损失函数与优化器定义# 交叉熵损失函数使用 log_softmax 避免数值不稳定 cross_entropy tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits_v2(labelsy_, logitsz) ) # 使用梯度下降优化器最小化损失 optimizer tf.train.GradientDescentOptimizer(0.5) train_step optimizer.minimize(cross_entropy)会话运行与训练流程# 初始化变量 init tf.global_variables_initializer() # 启动会话并执行训练 with tf.Session() as sess: sess.run(init) # 批量训练循环 for i in range(1000): batch_x, batch_y x_train[i*100:(i1)*100], y_train[i*100:(i1)*100] # 转换标签为 one-hot 编码 batch_y tf.keras.utils.to_categorical(batch_y, 10) # 执行训练步骤 sess.run(train_step, feed_dict{x: batch_x, y_: batch_y}) # 评估模型准确率 correct_prediction tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) test_acc sess.run(accuracy, feed_dict{x: x_test, y_: tf.keras.utils.to_categorical(y_test, 10)}) print(fTest Accuracy: {test_acc:.4f})4.卷积神经网络在MNIST分类中的优势卷积神经网络CNN通过保留图像的空间结构信息有效提升了对MNIST手写数字数据集的分类性能。与传统的Softmax回归将28×28像素图像展平为784维向量的方法相比CNN利用局部感受野和权值共享机制能够自动学习图像中的边缘、纹理等低层特征并逐层组合成更复杂的高层语义特征。输入重塑从向量还原到28×28图像将输入 x 重塑为 [-1, 28, 28, 1] 的张量其中 -1 表示 batch 大小由输入自动推断x_image tf.reshape(x, [-1, 28, 28, 1])卷积/池化相关的辅助函数def weight_variable(shape): initial tf.truncated_normal(shape, stddev0.1) return tf.Variable(initial) def bias_variable(shape): initial tf.constant(0.1, shapeshape) return tf.Variable(initial) def conv2d(x, W): return tf.nn.conv2d(x, W, strides[1, 1, 1, 1], paddingSAME) def max_pool_2x2(x): return tf.nn.max_pool(x, ksize[1, 2, 2, 1], strides[1, 2, 2, 1], paddingSAME)两层卷积网络结构W_conv1 weight_variable([5, 5, 1, 32]) b_conv1 bias_variable([32]) h_conv1 tf.nn.relu(conv2d(x_image, W_conv1) b_conv1) h_pool1 max_pool_2x2(h_conv1) W_conv2 weight_variable([5, 5, 32, 64]) b_conv2 bias_variable([64]) h_conv2 tf.nn.relu(conv2d(h_pool1, W_conv2) b_conv2) h_pool2 max_pool_2x2(h_conv2)全连接层与 Dropout 处理在经过两次 2×2 最大池化操作后输入特征图尺寸由 28×28 降低至 7×7。该阶段的输出为形状为[batch_size, 7, 7, 64]的张量表示每个样本有 64 个通道的特征图。为了接入全连接层需将此三维特征图展平为一维向量。使用tf.reshape将h_pool2转换为形状为[-1, 7 * 7 * 64]的二维张量其中-1表示批量大小可动态适应。展平后的数据作为第一个全连接层的输入。定义权重矩阵W_fc1为[7 * 7 * 64, 1024]对应从 3136 维7×7×64映射到 1024 维的线性变换。偏置项b_fc1维度为[1024]。通过矩阵乘法与偏置相加得到中间激活值。应用 ReLU 激活函数以引入非线性表达能力提升模型对复杂模式的学习能力。此时输出维度为 1024。为防止过拟合在训练过程中引入 Dropout 技术。通过tf.nn.dropout对前一层输出进行随机失活保留概率由keep_prob控制设置为 0.5即一半神经元被随机关闭。该操作仅在训练阶段启用测试阶段需设为 1.0 以保留全部连接。W_fc1 weight_variable([7 * 7 * 64, 1024]) b_fc1 bias_variable([1024]) h_pool2_flat tf.reshape(h_pool2, [-1, 7 * 7 * 64]) h_fc1 tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) b_fc1) keep_prob tf.placeholder(tf.float32) h_fc1_drop tf.nn.dropout(h_fc1, keep_prob)输出层与损失函数优化器配置与训练将 1024 维的特征向量映射至 10 类别的预测结果构建最终分类层。权重矩阵W_fc2形状为[1024, 10]偏置b_fc2为[10]。输出为未归一化的类别得分即 logits。直接使用tf.matmul(h_fc1_drop, W_fc2) b_fc2得到 logits 向量不经过 softmax 处理以便后续计算交叉熵损失时更稳定。采用tf.nn.softmax_cross_entropy_with_logits计算每样本的交叉熵损失。该函数内部自动执行 softmax 并计算损失避免数值不稳定问题。通过tf.reduce_mean对整个批次的损失取均值得到标量损失值。选用 Adam 优化器进行参数更新其自适应学习率机制有助于快速收敛并稳定训练过程。学习率设定为 1e-4适用于大多数图像分类任务。调用minimize方法使优化器最小化交叉熵损失从而更新网络中所有可训练变量权重和偏置。W_fc2 weight_variable([1024, 10]) b_fc2 bias_variable([10]) y_conv tf.matmul(h_fc1_drop, W_fc2) b_fc2 # logits cross_entropy tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labelsy_, logitsy_conv) ) train_step tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)准确率评估与测试# 批量测试评估 print(sess.run(accuracy, feed_dict{ x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0 }))
返回列表