【TensorFlow】MNIST(使用LeNet5+滑动平均+正则化+指数衰减法+激活函数+模型持久化)

本文介绍了使用TensorFlow构建LeNet5模型识别MNIST手写数字的过程,包括数据下载、代码结构、模型结构、优化方法(滑动平均、正则化、指数衰减法)以及ReLU激活函数的使用。通过训练和测试,探讨了学习率对模型收敛的影响,并给出了调整学习率后的效果。
摘要由CSDN通过智能技术生成

项目已上传至 GitHub —— lenet-5

下载MNIST数据集


以下有两种下载方式,如果链接失效可以搜索网上的资源

下载之后将其放在 mnist/data/ 文件夹下,目录结构如下

mnist/
    data/
        train-images-idx3-ubyte.gz
        train-labels-idx1-ubyte.gz
        t10k-images-idx3-ubyte.gz
        t10k-labels-idx1-ubyte.gz

代码结构


为了使代码有更好的可读性和扩展性,需要将之按功能分为不同的模块,并将可重用的代码抽象成库函数

所以可以把代码分成三个模块

  • inference
  • train
  • evaluate

并且保存下来的模型需要单独放在 model 文件夹下

具体的文件夹目录如下

mnist/
    data/
        ......
    LeNet-5/
        model/
            ......
        inference.py
        train.py
        eval.py

完整代码


该代码实现自《TensorFlow:实战Google深度学习框架》

  1. 神经网络结构类似 LeNet-5,input -> conv -> maxpool -> conv -> maxpool -> fc -> fc -> output

  2. 使用的优化方法

    • 滑动平均
    • 正则化
    • 指数衰减法
  3. 使用 ReLU 激活函数

  4. 每隔 1000 轮保存一次模型

首先是 inference.py ,这个库函数负责模型训练及测试的前向传播过程

import tensorflow as tf

# 定义神经网络相关参数
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


# 前向传播
def inference(input_tensor, train, regularizer):
    # 声明第一层卷积层的变量并实现前向传播过程
    with tf.variable_scope('layer1-conv1'):
        conv1_weights = tf.get_variable(
            'weight', [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
            initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv1_biases = tf.get_variable(
            'bias', [CONV1_DEEP], initializer=tf.constant_initializer(0.0))

        # 使用边长为5,深度为32的过滤器,过滤器步长为1,使用全0填充
        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,步长为2,使用全0填充
    with tf.variable_scope('layer2-pool1'):
        pool1 = tf.nn.max_pool(
            relu1, ksize=[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值