[Tensorflow][5]MNIST数字识别问题

本文详细探讨了使用TensorFlow解决MNIST数字识别问题,包括数据处理、神经网络模型训练、超参数选择、模型效果验证以及模型的持久化。通过不同模型的比较,强调了激活函数、多层隐藏层、优化方法对模型性能的影响,并介绍了变量管理和模型保存的实现方法。
摘要由CSDN通过智能技术生成

第五章 MNIST数字识别问题

5.1 MNIST数据处理

  • MNIST数据集简介

    • MNIST数据集是NIST数据集的一个子集,是一个手写体数字识别数据集

    • 它包含60000张图片作为训练数据,10000张图片作为测试数据

    • 在MNIST数据集中的每一张图片都代表了0~9中的一个数字,图片的大小都是28*28,且数字都出现在图片的正中间

    • 如图所示,一张数字图片及和它对应的像素矩阵

    • 为了验证模型训练的效果,一般还需要从训练数据中划分出一部分数据作为验证数据

  • TensorFlow中的封装(基本过时)

    • 样例程序

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      
      from tensorflow.examples.tutorials.mnist import input_data
      
      # 载入MNIST数据集,如果指定地址/path/to/MNIST_data下没有已经下载好的数据
      # 那么TensorFlow会自动下载数据
      mnist = input_data.read_data_sets("/path/to/MNIST_data/", one_hot=True)
      
      # 打印训练集的数据量
      print("Training data size:", mnist.train.num_examples)
      
      # 打印验证集的数据量
      print("Validating data size:", mnist.validation.num_examples)
      
      # 打印测试集的数据量
      print("Testing data size:", mnist.test.num_examples)
      
      # 打印训练集中某一样例数据
      # 一张数字图片,它的每个像素点都被放到这个长度为128一维数组中
      # 如果一个像素点越接近于1,则颜色越深;越接近于0,则颜色越浅
      print("Example training data:", mnist.train.images[0])
      
      # 打印训练集中某一样例数据的标记
      # 一个大小为10的一维数组
      # 数组中其中一个数字取值为1,其余数字取值为0
      print("Example training data label:", mnist.train.labels[0])
      
      # 设置batch的大小
      batch_size = 100
      
      # 使用next_batch()方法来获得下一个batch的输入数据
      xs, ys = mnist.train.next_batch(batch_size)
      
      print("X shape:", xs.shape)
      print("Y shape", ys.shape)
      
    • 解读

      1. MNIST数据集被划分为train、validation和test三个数据集

      2. 处理后的每一张图片都是一个长度为784的一维数组,因为神经网络的输入是一个特征向量,所以在此把一张二维图像的像素矩阵放到一个一维数组中可以方便TensorFlow将图片的像素矩阵提供给神经网络的输入层

      3. 像素矩阵中元素的取值范围为[0,1],它代表了颜色的深浅

      4. 使用mnist.train.next_batch()可以从所有的训练数据中读取一小部分作为一个batch


5.2 神经网络模型训练及不同模型结果对比


5.2.1 TensorFlow训练神经网络
  • 回顾主要概念

    • 在神经网络的结构上,深度学习一方面需要使用激活函数实现神经网络模型的去线性化,另一方面需要使用一个或多个隐藏层使得神经网络的结构更深,以解决复杂问题
    • 使用带指数衰减的学习率设置、使用正则化来避免过度拟合,以及使用滑动平均模型可以使得神经网络模型更加健壮
  • 直接给出代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    
    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    
    # MNIST数据集相关参数
    INPUT_NODE = 784                # 输入层的节点数,等于图片的像素
    OUTPUT_NODE = 10                # 输出层的节点数,等于类别的数目。0-9这10个数字,所以是10
    
    # 配置神经网络的参数
    LAYER1_NODE = 500               # 隐藏层节点数,这里只有一个隐藏层,此隐藏层有500个节点
    BATCH_NODE = 100                # batch的大小
    LEARNING_RATE_BASE = 0.8        # 基础的学习率
    LEARNING_RATE_DECAY = 0.99      # 学习率的衰减率
    REGULARIZATION_RATE = 0.0001    # 正则化项在损失函数中的系数
    TRAINING_STEPS = 30000          # 训练轮数
    MOVING_AVERAGE_DECAY = 0.99     # 滑动平均衰减率
    
    
    # 给定神经网络的输入和所有参数,计算神经网络的前向传播结果
    # 在这里定义了一个使用ReLU激活函数的三层全连接网络
    # 通过一层隐藏层实现了多层网络结构
    # 通过ReLU激活函数实现了去线性化
    # 并且提供了对滑动平均模型的支持,此时需要传入avg_class
    def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2):
        if avg_class is None:
            layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1) + biases1)
            return tf.matmul(layer1, weights2) + biases2
        else:
            layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1)) + avg_class.average(biases1))
            return tf.matmul(layer1, avg_class.average(weights2)) + avg_class.average(biases2)
    
    
    # 训练模型的整个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值