机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

一、二次代价函数 1. 形式:

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

 

其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数

2. 利用梯度下降法调整权值参数大小,推导过程如下图所示:

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

根据结果可得,权重w和偏置b的梯度跟激活函数的梯度成正比(即激活函数的梯度越大,w和b的大小调整的越快,训练速度也越快)

3. 激活函数是sigmoid函数时,二次代价函数调整参数过程分析

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

 

理想调整参数状态:距离目标点远时,梯度大,参数调整较快;距离目标点近时,梯度小,参数调整较慢。
如果我的目标点是调整到M点,从A点==>B点的调整过程,A点距离目标点远,梯度大,调整参数较快;B点距离目标较近,梯度小,调整参数慢。符合参数调整策略
如果我的目标点是调整到N点,从B点==>A点的调整过程,A点距离目标点近,梯度大,调整参数较快;B点距离目标较远,梯度小,调整参数慢。不符合参数调整策略

二、交叉熵代价函数 1.形式:

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

 

其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数

2. 利用梯度下降法调整权值参数大小,推导过程如下图所示:

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

 

根据结果可得,权重w和偏置b的梯度跟激活函数的梯度无关。而和输出值与实际值的误差成正比(即误差越大,w和b的大小调整的越快,训练速度也越快)

3.激活函数是sigmoid函数时,二次代价函数调整参数过程分析

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

 

理想调整参数状态:距离目标点远时,梯度大,参数调整较快;距离目标点近时,梯度小,参数调整较慢。
如果我的目标点是调整到M点,从A点==>B点的调整过程,A点距离目标点远,误差大,调整参数较快;B点距离目标较近,误差小,调整参数较慢。符合参数调整策略
如果我的目标点是调整到N点,从B点==>A点的调整过程,A点距离目标点近,误差小,调整参数较慢;B点距离目标较远,误差大,调整参数较快。符合参数调整策略

总结:

如果输出神经元是线性的,选择二次代价函数较为合适

如果输出神经元是S型函数(sigmoid函数),选择交叉熵代价函数较为合适

如果输出神经元是softmax回归的代价函数,选择对数释然代价函数较为合适

二、利用代价函数优化MNIST数据集识别程序 1.在Tensorflow中代价函数的选择:


如果输出神经元是线性的,选择二次代价函数较为合适 loss = tf.reduce_mean(tf.square())
如果输出神经元是S型函数(sigmoid函数),选择交叉熵代价函数较为合适 loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits())
如果输出神经元是softmax回归的代价函数,选择对数释然代价函数较为合适 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits())

2.通过代价函数选择对MNIST数据集分类程序优化

#使用交叉熵代价函数

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

1 import os 2 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 3 import tensorflow as tf 4 from tensorflow.examples.tutorials.mnist import input_data 5 #载入数据集 6 mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 7 #每个批次的大小(即每次训练的图片数量) 8 batch_size = 50 9 #计算一共有多少个批次 10 n_bitch = mnist.train.num_examples // batch_size 11 #定义两个placeholder 12 x = tf.placeholder(tf.float32, [None, 784]) 13 y = tf.placeholder(tf.float32, [None, 10]) 14 #创建一个只有输入层(784个神经元)和输出层(10个神经元)的简单神经网络 15 Weights = tf.Variable(tf.zeros([784, 10])) 16 Biases = tf.Variable(tf.zeros([10])) 17 Wx_plus_B = tf.matmul(x, Weights) + Biases 18 prediction = tf.nn.softmax(Wx_plus_B) 19 #交叉熵代价函数 20 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction)) 21 #使用梯度下降法 22 train_step = tf.train.GradientDescentOptimizer(0.15).minimize(loss) 23 #初始化变量 24 init = tf.global_variables_initializer() 25 #结果存放在一个布尔型列表中 26 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1)) #argmax返回一维张量中最大的值所在的位置,标签值和预测值相同,返回为True 27 #求准确率 28 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) #cast函数将correct_prediction的布尔型转换为浮点型,然后计算平均值即为准确率 29 30 with tf.Session() as sess: 31 sess.run(init) 32 #将测试集循环训练20次 33 for epoch in range(21): 34 #将测试集中所有数据循环一次 35 for batch in range(n_bitch): 36 batch_xs, batch_ys = mnist.train.next_batch(batch_size) #取测试集中batch_size数量的图片及对应的标签值 37 sess.run(train_step, feed_dict={x:batch_xs, y:batch_ys}) #将上一行代码取到的数据进行训练 38 acc = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels}) #准确率的计算 39 print('Iter : ' + str(epoch) + ',Testing Accuracy = ' + str(acc))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjjwd.html