TensorFlow实现mnist数字识别——CNN LeNet-5模型

一、概述LeNet-5模型 

    构成:卷积层--池化层--卷积层--池化层--全连接层--全连接层

    1.1 卷积层

        使用n*n的滤波器来进行图像信息的采集

        如下展示了一个3×3的卷积核在5×5的图像上做卷积的过程。每个卷积都代表了一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。TensorFlow实现mnist数字识别——CNN LeNet-5模型_第1张图片

        局部感受野其实是一个滤波的过程,也是一个对图像降维的过程。

        维度减小,深度加深

    

    1.2池化层

 

        池化是对特征向量的下采样,进一步降低了特征的维度,减少了计算量,并且使训练不容易出现过拟合现象。一般有两种池化方式,一种是平均池化(mean-pooling),一种是最大值池化(max-pooling)。池化也是一种滤波。

    1.3 全连接  full connect  

            w * x + b = y 

 

二、构建CNN层

    2.1 定义各个节点的相关参数

input_node  = 784   #输入层的节点数  相当于图片的像素28*28
output_node = 10    #输出层的节点数  相当于分类器的类别的个数
IMAGE_SIZE = 28
IMAGE_CHANNELS = 1
NUM_LABELS = 10
#第一层卷积尺寸和深度
CONV1_DEEP = 32
CONV1_SIZE = 5
#第二层卷积尺寸和深度
CONV2_DEEP = 64
CONV2_SIZE = 5
#全连接层的节点个数
FC_SIZE = 512
 

 

2.2 构建CNN网络

#================================== 第一层  卷积层 ==============================//
    with tf.variable_scope('layer1_cov1'):
        cov1_weights = tf.get_variable("weight",[CONV1_SIZE,
                                              CONV1_SIZE,
                                              IMAGE_CHANNELS,
                                              CONV1_DEEP],  #过滤器的深度
                                              initializer=tf.truncated_normal_initializer(stddev = 0.1))
        
        cov1_bias    = tf.get_variable("bias",[CONV1_DEEP],initializer = tf.constant_initializer(0.0))
        
        cov1 = tf.nn.conv2d(input_tensor,       #代表第几张图片
                            cov1_weights,       #权重
                            strides=[1,1,1,1],  #前后两位必须为1   中间代表步长step 长宽每次步进1
                            padding='SAME')     #采用0来填充图片
        
        #添加偏置项 + 计算结果正则化
        relu1  = tf.nn.relu(tf.nn.bias_add(cov1,cov1_bias))
#================================== 第二层 池化层 ===============================// 
    #这一层的输入为上一层的输出  即28*28*32   池化层选取的过滤器边长为2  使用全0填充
    #移动的步长也为2   因此 输出为14*14*32
    with tf.name_scope("layer2-pool1"):
        pool1 = tf.nn.max_pool(
            relu1,
            ksize=[1,2,2,1],    #过滤器的尺寸  首尾必须为1  中间代表过滤器的尺寸 2*2
            strides=[1,2,2,1],  #后两位必须为1   中间代表步长step 长宽每次步进2
            padding='SAME'      #采用0来填充图片
        )
#================================== 第三层  卷积层 ==============================//
    #这一层的输入为上一层的输出  即14*14*32  batch为5*5  使用全0填充
    #移动的步长也为1   因此 输出为14*14*64
    with tf.variable_scope('layer3_cov2'):
        cov2_weights = tf.get_variable("weight",[CONV2_SIZE,
                                              CONV2_SIZE,
                                              CONV1_DEEP,
                                              CONV2_DEEP],  #过滤器的深度
                                              initializer=tf.truncated_normal_initializer(stddev = 0.1))
        
        cov2_bias    = tf.get_variable("bias",[CONV2_DEEP],initializer = tf.constant_initializer(0.0))
        
        cov2 = tf.nn.conv2d(pool1,              #代表第几张图片
                            cov2_weights,       #权重
                            strides=[1,1,1,1],  #前后两位必须为1   中间代表步长step 长宽每次步进1
                            padding='SAME')     #采用0来填充图片
        
        #添加偏置项 + 计算结果正则化
        relu2  = tf.nn.relu(tf.nn.bias_add(cov2,cov2_bias))
 
 
#================================== 第四层 池化层 ===============================// 

    #这一层的输入为上一层的输出  即14*14*64   池化层选取的过滤器边长为2  使用全0填充
    #移动的步长也为2   因此 输出为7*7*64
    with tf.name_scope("layer4-pool2"):
        pool2 = tf.nn.max_pool(
            relu2,
            ksize=[1,2,2,1],    #过滤器的尺寸  首尾必须为1  中间代表过滤器的尺寸 2*2
            strides=[1,2,2,1],  #后两位必须为1   中间代表步长step 长宽每次步进2
            padding='SAME'      #采用0来填充图片
        )
#==================== 将第四层的输出转化为第五层全连接的输入格式 ======================//     

    #7*7*64的矩阵拉成一维向量  3136
    pool_shape = pool2.get_shape().as_list()
    nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]
    #将第四层输出变成一个batch的向量
    reshaped = tf.reshape(pool2,[pool_shape[0],nodes])
#================================== 第五层 全连接1 ===============================//

    #将3136的一维数组经过全连接之后输出512
	# 输入reshaped  为 1*3136
	# w为3136*512
	# b为1*512
	# 输出fc1为 1*512

    with tf.variable_scope('layer5_fc1'):
        fc1_weights = tf.get_variable("weight",[nodes,
                                             FC_SIZE],  # 全连接尺寸
                                            initializer=tf.truncated_normal_initializer(stddev = 0.1))

        #加入正则化
        if regularizer!=None:
            tf.add_to_collection('losses',regularizer(fc1_weights)) #将当前变量的正则化损失加入losses集合

        fc1_biasws =  tf.get_variable("bias",[FC_SIZE],initializer = tf.constant_initializer(0.1))
        fc1  = tf.nn.relu(tf.matmul(reshaped,fc1_weights)+fc1_biasws)
        if train:
            fc1 = tf.nn.dropout(fc1,0.5)  #丢弃掉部分点  防止过拟合
#================================== 第六层 全连接2 ===============================//         

    #将512的一维数组经过全连接之后输出10
	# fc1  为 1*512
	# w为512*10
	# b为1*10
	# 输出fc1为 1*10

    with tf.variable_scope('layer6_fc2'):
        fc2_weights = tf.get_variable("weight",[FC_SIZE,
                                             NUM_LABELS],  # 全连接尺寸
                                            initializer=tf.truncated_normal_initializer(stddev = 0.1))

        #加入正则化
        if regularizer!=None:
            tf.add_to_collection('losses',regularizer(fc2_weights)) #将当前变量的正则化损失加入losses集合            
        fc2_biasws =  tf.get_variable("bias",[NUM_LABELS],initializer = tf.constant_initializer(0.1))        
        logit  = tf.matmul(fc1,fc2_weights)+fc2_biasws

三、定义训练过程

四、定义测试过程

        同http://blog.csdn.net/yunge812/article/details/79347905

下载地址:

        http://download.csdn.net/download/yunge812/10255801

=======================================================================

最近新开的公众号,文章正在一篇篇的更新,

公众号名称:玩转电子世界

各位朋友有什么问题了可以直接在上面提问,我会一一进行解答的。

跟着阳光非宅男,一步步走进电子的世界。

关注之后回复  资料下载  关键词可以获得免费海量视频学习资料下载~~!

已共享的学习视频资料,共享资料正在不断更新中。

共享机器学习/tensorflow视频学习资料:

=======================================================================

 

你可能感兴趣的:(机器学习/TensorFlow)