TensorFlow实现mnist数字识别——两层全连接实现

一、写"添加层"函数

        1.1  明确各个节点的个数

input_node  = 784   #输入层的节点数  相当于图片的像素28*28

output_node = 10    #输出层的节点数  相当于分类器的类别的个数

L1_node    =  500     #隐藏层节点的个数

1.2 定义权重初始化函数

def get_weight_variable(shape,regularizer):
    weights = tf.get_variable("weights",shape,initializer=tf.truncated_normal_initializer(stddev = 0.1))
    if regularizer!=None:
        tf.add_to_collection('losses',regularizer(weights)) #将当前变量的正则化损失加入losses集合
    return weights

1.3 构建整个网络结构  共两层

#添加两个层  输出采用relu作为激活函数  实现列去线性化  
def inference(input_tensor,regularizer):
    
    #声明第一层变量并完成前向传播的过程
    with tf.variable_scope('layer1'):
        weights = get_weight_variable([input_node,L1_node],regularizer)
        bias    = tf.get_variable("bias",[L1_node],initializer = tf.constant_initializer(0.0))
        layer1  = tf.nn.relu(tf.matmul(input_tensor,weights)+bias)
        
    #声明第二层变量并完成前向传播的过程
    with tf.variable_scope('layer2'):
        weights = get_weight_variable([L1_node    ,output_node ],regularizer)
        bias    = tf.get_variable("bias",[output_node ],initializer = tf.constant_initializer(0.0))
        layer2  = tf.nn.relu(tf.matmul(layer1,weights)+bias)
    
    return layer2  

        layer1中  输入为1*input_node    w为 input_node*L1_node 的矩阵  b为1*L1_node   输出结果为1*L1_node

        layer1中  输入为1*L1_node         w为 L1_node*output_node的矩阵 b为1*output_node输出结果为1*output_node

 

二、定义训练过程

        2.1 定义输入输出的placeholder

    x  = tf.placeholder(tf.float32, [None, mnist_inference.input_node],  name='x_input')
    y_ = tf.placeholder(tf.float32, [None, mnist_inference.output_node], name='y_input')

        2.2 定义正则函数     

    regularizer = tf.contrib.layers.l2_regularizer(regularization_rate)

        2.3  构建神经网络结构       

    y  = mnist_inference.inference(x,regularizer) #构建神经网络结构

        这里调用了在第一章定义的inference函数

        2.4  初始化滑动平均类 加快早期变量的更新速度  

    #初始化滑动平均类 加快早期变量的更新速度   衰减率0.99
    global_step = tf.Variable(0,trainable = False)
    variable_averages = tf.train.ExponentialMovingAverage(moving_average_decay,global_step)
    variables_averages_op = variable_averages.apply(tf.trainable_variables())
      

        这两句话是一个固定的套路格式  用于滑动平均

        2.5  计算cross_entropy的均值

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = y, labels= tf.argmax(y_,1))

 

    cross_entropy_mean = tf.reduce_mean(cross_entropy)

        2.6 总损失 = 交叉熵损失 + 正则化损失

    loss = cross_entropy_mean + tf.add_n(tf.get_collection('losses'))

        2.7 设置衰减的学习率

learining_rate = tf.train.exponential_decay(learning_rate_base,global_step,mnist.train.num_examples/batch_size , learning_rate_decay)

        2.8 采用GradientDescentOptimizer的优化算法

    train_step = tf.train.GradientDescentOptimizer(learining_rate).minimize(loss,global_step = global_step)

        2.9 反向传播来更新神经网络的参数   更新每一个参数的滑动平均值

    train_op = tf.group(train_step,variables_averages_op)

        2.10 设置保存

    saver = tf.train.Saver()

        2.11 开始循环训练 

    xs,ys = mnist.train.next_batch(batch_size) #每次取出100个数进行训练
    _,loss_value,step = sess.run([train_op,loss,global_step],feed_dict={x:xs,y_:ys})

        2.12 打印、保存训练结果

    print("%d traing step,loss is %g"%(step,loss_value))
    saver.save(sess,os.path.join(SAVE_PATH,SAVE_MODEL_NAME),global_step = global_step)

        训练结果:

1 traing step,loss is 2.68094

1001 traing step,loss is 0.214418

2001 traing step,loss is 0.243217

3001 traing step,loss is 0.252535

4001 traing step,loss is 0.174281

5001 traing step,loss is 0.213977

6001 traing step,loss is 0.221109

注意  参数学习率learning_rate_base不宜设置太高  开始我按照书上写的0.8 发现学习不收敛  我改为0.1之后才有收敛结果

三、定义测试过程

利用已经训练好的模型  进行模型的验证

3.1 定义输入输出

x  = tf.placeholder(tf.float32, [None, mnist_inference.input_node],  name='x_input')
y_ = tf.placeholder(tf.float32, [None, mnist_inference.output_node], name='y_input')
validate_feed = {x:mnist.validation.images,    y_:mnist.validation.labels}

3.2 构建神经网络

y  = mnist_inference.inference(x,None) #构建神经网络结构  正则化损失函数为none
3.3 计算准确率   判断预测结果y是否和真实值y_一致
 
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) #判断是否和真实值y_相等  1代表仅在第一个维度上进行
#tf.cast将数据转换成float32  再利用reduce_mean求平均数      
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))   
 

3.4  滑动平均

variable_averages = tf.train.ExponentialMovingAverage(mnist_train.moving_average_decay)        
variables_to_restore = variable_averages.variables_to_restore()
saver = tf.train.Saver(variables_to_restore)

3.5 加载训练出来的模型

saver.restore(sess,ckpt.model_checkpoint_path)

3.6 计算准确度

accuracy_score = sess.run(accuracy,feed_dict = validate_feed)

最终结果:

实验设置  每10秒验证一次模型的准确度

after model.ckpt-1001 training accuracy is 0.9496
after model.ckpt-2001 training accuracy is 0.9666
after model.ckpt-2001 training accuracy is 0.9666
after model.ckpt-3001 training accuracy is 0.9718
after model.ckpt-3001 training accuracy is 0.9718

after model.ckpt-4001 training accuracy is 0.9756

 

下载地址:

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

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

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

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

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

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

TensorFlow实现mnist数字识别——两层全连接实现_第1张图片

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

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

TensorFlow实现mnist数字识别——两层全连接实现_第2张图片

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

TensorFlow实现mnist数字识别——两层全连接实现_第3张图片

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

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