python3 10.tensorflow使用正则化进行MNIST数据集简单分类 学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mcyJacky/article/details/88413129

前言

     计算机视觉系列之学习笔记主要是本人进行学习人工智能(计算机视觉方向)的代码整理。本系列所有代码是用python3编写,在平台Anaconda中运行实现,在使用代码时,默认你已经安装相关的python库,这方面不做多余的说明。本系列所涉及的所有代码和资料可在我的github上下载到,gitbub地址:https://github.com/mcyJacky/DeepLearning-CV,如有问题,欢迎指出。

一、使用正则化抵抗过拟合介绍

     上一的篇章已经介绍过抵抗过拟合的几种方法,其中正则化就是其中的一种。使用正则化一般有两种方法:L1正则化和L2正则化,L1正则化可达到模型参数疏化效果,L2正则化使模型参数值衰减,使模型参数值都接近0,使用正则化的目的是:使最后的代价函数减小,但适用于更深层网络,更复杂的任务。其中L1正则化的表达式为:
C = C 0 + λ n w C = C_0 + \frac{λ}{n} \sum \mid w \mid
其中, C C 为最终求解的代价函数, C 0 C_0 为原始代价函数, n n 为样本个数, λ λ 为正则项系数,用来权衡正则项与 C 0 C_0 项比重。

     L2正则化的表达式为:
C = C 0 + λ 2 n w 2 C = C_0 + \frac{λ}{2n} \sum \mid w^{2} \mid
其中, C C 为最终求解的代价函数, C 0 C_0 为原始代价函数, n n 为样本个数, λ λ 为正则项系数,用来权衡正则项与 C 0 C_0 项比重。

二、使用正则化进行MNIST数据集分类

     下面就是加入了正则化项对MNIST数据集进行分类,我们对MNIST数据集使用上一篇的神经网络结构,即784-1000-500-10,输入层有784个神经元,有两个隐藏层:第一个隐藏层是1000个神经元,第二个隐藏层是500个神经元,输出层是10个神经元。具体如下:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

#载入数据集
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)

#每个批次的大小
batch_size = 64
#计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

#定义两个placeholder
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
keep_prob=tf.placeholder(tf.float32)

# 784-1000-500-10
#创建一个简单的神经网络
W1 = tf.Variable(tf.truncated_normal([784,1000],stddev=0.1))
b1 = tf.Variable(tf.zeros([1000])+0.1)
L1 = tf.nn.tanh(tf.matmul(x,W1)+b1)
L1_drop = tf.nn.dropout(L1,keep_prob) 

W2 = tf.Variable(tf.truncated_normal([1000,500],stddev=0.1))
b2 = tf.Variable(tf.zeros([500])+0.1)
L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)
L2_drop = tf.nn.dropout(L2,keep_prob) 

W3 = tf.Variable(tf.truncated_normal([500,10],stddev=0.1))
b3 = tf.Variable(tf.zeros([10])+0.1)
prediction = tf.nn.softmax(tf.matmul(L2_drop,W3)+b3)

#采用L2正则项
l2_loss = tf.nn.l2_loss(W1) + tf.nn.l2_loss(b1) + tf.nn.l2_loss(W2) + tf.nn.l2_loss(b2) + tf.nn.l2_loss(W3) + tf.nn.l2_loss(b3)

#带有正则化项的交叉熵代价函数
loss = tf.losses.softmax_cross_entropy(y,prediction) + 0.0005*l2_loss
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

#初始化变量
init = tf.global_variables_initializer()

#结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(31):
        for batch in range(n_batch):
            batch_xs,batch_ys =  mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})
        
        test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
        train_acc = sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels,keep_prob:1.0})
        print("Iter " + str(epoch) + ",Testing Accuracy " + str(test_acc) +",Training Accuracy " + str(train_acc))


#部分计算结果如下:
# Iter 0,Testing Accuracy 0.9451,Training Accuracy 0.94643635
# Iter 1,Testing Accuracy 0.9529,Training Accuracy 0.9566909
# Iter 2,Testing Accuracy 0.96,Training Accuracy 0.96574545
# Iter 3,Testing Accuracy 0.9608,Training Accuracy 0.9655455
# ...
# Iter 19,Testing Accuracy 0.9665,Training Accuracy 0.9719818
# Iter 20,Testing Accuracy 0.9679,Training Accuracy 0.9732909
# Iter 21,Testing Accuracy 0.9683,Training Accuracy 0.9747273
# Iter 22,Testing Accuracy 0.9664,Training Accuracy 0.9724
# Iter 23,Testing Accuracy 0.9684,Training Accuracy 0.97367275
# Iter 24,Testing Accuracy 0.9666,Training Accuracy 0.9719091
# Iter 25,Testing Accuracy 0.9655,Training Accuracy 0.97212726
# Iter 26,Testing Accuracy 0.9682,Training Accuracy 0.9728
# Iter 27,Testing Accuracy 0.9676,Training Accuracy 0.97221816
# Iter 28,Testing Accuracy 0.9669,Training Accuracy 0.97238183
# Iter 29,Testing Accuracy 0.9675,Training Accuracy 0.97327274
# Iter 30,Testing Accuracy 0.9665,Training Accuracy 0.9725091

     使用正则化后,我们观察最终测试集和训练集的预测结果,可以粗略看出两者的结果相差不大,但是在这个案例中体现也不是太明显,如果我们在训练大型复杂数据时,就能切实感受到带来的好处。

     
     
     
     
【参考】:
     1. 城市数据团课程《AI工程师》计算机视觉方向
     2. deeplearning.ai 吴恩达《深度学习工程师》
     3. 《机器学习》作者:周志华
     4. 《深度学习》作者:Ian Goodfellow


转载声明:
版权声明:非商用自由转载-保持署名-注明出处
署名 :mcyJacky
文章出处:https://blog.csdn.net/mcyJacky

猜你喜欢

转载自blog.csdn.net/mcyJacky/article/details/88413129