基于mnist数据集利用LeNet5实现手写数字识别重点解析

**

手写数字识别我分三个部分说明:

**

  1. 步骤简要说明(看懂大致流程);
  2. 代码实现(完整代码);
  3. 说明(使用说明)

步骤简要说明

前向传播:搭建模型。前面这张图只是搭建神经网路的前向传播,即是神经网络的主体框架,最重要的部分。
在这里插入图片描述
反向传播:优化模型参数。这应该是老套路,通过梯度下降法或者其他方法使得损失函数变得越来越小,从而优化前向传播的参数权重W、偏置B。其中有些步骤我把它拎出来大致简述下:

  • 滑动平均(MovingAverage):使下一次参数更新考虑到前面数据的影响。
  • 正则化项(regularize):抑制某些参数(对模型影响很大的参数)对模型的影响或贡献,防止过拟合。
  • 指数学习率衰减(exponential_decay):自动调节学习率,一是加快训练速度;二是防止学习率过大从而导致的待优化参数取不到最优值。
  • 交叉熵(cross_entropy):一种分类机制。

测试程序:在建立好的模型上测试新的数据集,观察其准确率是多少。这里知识点无非就是模型的加载。
应用程序:将自己的图片放入模型看看预测值,即是整个神经网络的目的。我是通过OpenCV进行处理图片的,也可以利用PIL。我这里有三个版本。

  1. app1.0是输入要预测图片的个数,然后一张一张的输入图片地址,进行预测,最后将结果利用可视化函数显示。
  2. app2.0在1.0的基础上加了批量化处理,即是将指定图片自动读入模型,解放双手。
  3. app3.0在2.0的基础上优化了阈值的取法,通过频率直方图观察图片像素值频率的分布,从而找到合适的阈值(这里还是有点麻烦,后面在完善);添加了准确率显示,不用一个一个的眼动的去数啦。

**

代码实现

  1. 前向传播部分(forward.py)

import tensorflow as tf
IMAGE_SIZE = 28
NUM_CHANNELS = 1
CONV1_SIZE = 5
CONV1_KERNEL_NUM = 32
CONV2_SIZE = 5
CONV2_KERNEL_NUM = 64
FC_NODE = 512
OUTPUT_NODE = 10

def getWeight(shape,regularizer):
    w = tf.Variable(tf.truncated_normal(shape,stddev=0.1))
    if regularizer != None: tf.add_to_collection("losses",tf.contrib.layers.l2_regularizer(regularizer)(w))
    return w

def getBias(shape):
    b = tf.Variable(tf.zeros(shape))
    return b

def conv2d(x,w):
    return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding="SAME")

def max_pool_2x2(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")

def forward(x,train,regularizer):
    conv1_w = getWeight([CONV1_SIZE,CONV1_SIZE,NUM_CHANNELS,CONV1_KERNEL_NUM],regularizer)
    conv1_b = getBias([CONV1_KERNEL_NUM])
    conv1 = conv2d(x,conv1_w)
    relu1 = tf.nn.relu(tf.nn.bias_add(conv1,conv1_b))
    pool1 = max_pool_2x2(relu1)
    
    conv2_w = getWeight([CONV2_SIZE,CONV2_SIZE,CONV1_KERNEL_NUM,CONV2_KERNEL_NUM],regularizer) 
    conv2_b = getBias([CONV2_KERNEL_NUM])
    conv2 = conv2d(pool1,conv2_w) 
    relu2 = tf.nn.relu(tf.nn.bias_add(conv2,conv2_b))
    pool2 = max_pool_2x2(relu2)
    #print ( "pool2: ",pool2," type:",type(  pool2))

    pool_shape = pool2.get_shape().as_list()
    nodes = pool_shape[1]*pool_shape[2]*pool_shape[3]
    reshaped = tf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值