LeNet-5模型之MNIST手写数字数据集训练-验证-测试三部曲(tesorflow)

本文介绍了使用TensorFlow实现LeNet-5模型在MNIST数据集上训练、验证和测试的过程。模型在测试集上达到99.28%的准确率,训练时间约为2分钟。此外,还讨论了模型加载的问题,并分享了在线手写数字识别资源和LeNet-5的原始论文链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeNet5简介

LeNet-5模型是Yann Lecun教授在1998年提出的,成功应用于数字识别问题的卷积神经神经网络。在MNIST数据集上,达到了99.27%的正确率。

  1. 图像输入:28×28像素
  2. CONV1——卷积模板5×5×32,步长为1,全0填充,输出28×28×32图像
  3. Pool1——池化层模板是2×2,步长为2,全0填充,输出14×14×32图像
  4. CONV2——卷积模板5×5×64,步长为1,全0填充,输出14×14×64图像
  5. Pool2——池化模板大小为2×2,步长为2,全0填充,输出7×7×64图像
  6. FC1——全链接层1,输入为7×7×64=3136,展平之,向量维度1 ×3136,构造此全链接层的权重维度3136×512,FC1输出维度为1×512
  7. FC2——全链接层2,输入为1×512,权重维度为512×10,FC2输出维度1×10

网络搭建并训练之

编写网络搭建文件:mnist_cnn_inference.py

import tensorflow as tf
# 设定神经网络的参数
INPUT_NODE = 784
OUTPUT_NODE = 10

IMAGE_SIZE = 28
NUM_CHANNELS = 1
NUM_LABELS = 10

# 第一层卷积深度与尺寸
CONV1_DEEP = 32
CONV1_SIZE = 5

# 第二层卷积深度与尺寸
CONV2_DEEP = 64
CONV2_SIZE = 5

# 全连接层节点个数
FC_SIZE = 512

# 定义前向传播的过程,这里添加一个新参数train,用于区分训练和测试过程,这个过程中使用到dropout
# 方法,可以防止过拟合,且dropout只在训练中使用。
def inference(input_tensor, train, regularizer):
# 声明第一层神经网络的变量并完成前向传播过程
    with tf.variable_scope('layer1-conv1'):
        conv1_weights = tf.get_variable("conv1_weights", [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv1_biases = tf.get_variable("conv1_biases", [CONV1_DEEP], initializer=tf.constant_initializer(0.0))

        # 使用边长为5, 深度为32的过滤器, 过滤器的移动步长是1, 且使用全零填充。
        conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')
        relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))

    # 实现第二层池化层的前向传播过程
    # 使用全零填充,移动的步长为2,这一层的输入是上一层的输出,也就是28*28*32
    with tf.name_scope('layer2-pool1'):
        pool1 = tf.nn.max_pool(relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

    # 声明第三层的卷积变量并实现前向传播过程。这一层的输入为14*14*32的矩阵
    with tf.variable_scope('layer3-conv2'):
        conv2_weighs = tf.get_variable('conv2_weighs', [CONV2_SIZE, CONV2_SIZE, CONV1_DEEP, CONV2_DEEP],
                                       initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv2_biases = tf.get_variable('conv2_biases', [CONV2_DEEP], initializer=tf.constant_initializer(0.0))

        # 使用边长为5, 深度为64的过滤器, 步长为1, 且使用全零填充
        conv2 = tf.nn.conv2d(pool1, conv2_weighs, strides=[1, 1, 1, 1], padding='SAME')
        relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))

    # 实现第四层池化层的前向传播过程
    # 这一层的输入是14*14*64的矩阵,输出是7*7*64的矩阵
    with tf.name_scope('layer4-pool2'):
        pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值