这里有一个例子演示使用softmax算法对mnist数据集做逻辑回归训练。代码在这里
这里的例子与temsorflow tutorials下的例子有较大差异。官方的源码在这里
主要差异在官方例子严格封装了四部曲:预测、损失、训练、评估。本文的例子也都有相应的步骤,但是没有将每一步封装成函数。所以推荐大家去看下tensorflow官网例子的代码风格。
四部曲的一个讲解图片:
image
本次先来研究TensorFlow-Examples这个项目的例子,后面研究tensorflow官网的例子。
'''
一个使用tensorflow的逻辑回归算法的例子
本例程使用了MNIST手写数据集:
(http://yann.lecun.com/exdb/mnist/)
Project: https://github.com/aymericdamien/TensorFlow-Examples/
'''
from __future__ import print_function
import tensorflow as tf
#导入MNIST数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./data/', one_hot=True)
#超参数
learning_rate = 0.02
training_epochs = 25
batch_size = 100
display_step = 1
#tf计算图的输入
x = tf.placeholder(tf.float32, [None, 784]) #mnist中的图片形状是28*28=784
y = tf.placeholder(tf.float32, [None, 10]) #共有0~9十个分类
#模型权重参数
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
#构造模型,前向预测
pred = tf.nn.softmax(tf.matmul(x, W) + b) #soft max
#使用交叉熵最小化误差,构造损失函数
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
#使用梯度下降作为优化函数
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
#初始化变量
init = tf.global_variables_initializer()
#开始训练
with tf.Session() as sess:
#首先执行初始化的动作
sess.run(init)
#循环训练
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(mnist.train.num_examples/batch_size)
#在batch内的数据上循环训练
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# 运行优化操作和求代loss
_, c = sess.run([optimizer, cost], feed_dict={x:batch_xs,
y:batch_ys})
#计算loss的平均值
avg_cost += c/total_batch
#每个epoch都显示日志信息
if (epoch+1)%display_step == 0:
print('Epoch', '%04d' % (epoch+1), 'cost=', '{:.9f}'.format(avg_cost))
print('Optimization Finished!')
#评估模型
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y,1))
#计算准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print('Accuracy:', accuracy.eval({x:mnist.test.images, y:mnist.test.labels}))
本次输出为:
Extracting ./data/train-images-idx3-ubyte.gz
Extracting ./data/train-labels-idx1-ubyte.gz
Extracting ./data/t10k-images-idx3-ubyte.gz
Extracting ./data/t10k-labels-idx1-ubyte.gz
2018-03-21 23:03:01.409627: I C:\tf_jenkins\home\workspace\rel-win\M\windows\PY\36\tensorflow\core\platform\cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
Epoch 0001 cost= 0.925978589
Epoch 0002 cost= 0.526254420
Epoch 0003 cost= 0.454482552
Epoch 0004 cost= 0.419291513
Epoch 0005 cost= 0.397361512
Epoch 0006 cost= 0.381882034
Epoch 0007 cost= 0.370305932
Epoch 0008 cost= 0.361112824
Epoch 0009 cost= 0.353574065
Epoch 0010 cost= 0.347223472
Epoch 0011 cost= 0.341899154
Epoch 0012 cost= 0.337232508
Epoch 0013 cost= 0.333123128
Epoch 0014 cost= 0.329476996
Epoch 0015 cost= 0.326202850
Epoch 0016 cost= 0.323313250
Epoch 0017 cost= 0.320611633
Epoch 0018 cost= 0.318096246
Epoch 0019 cost= 0.315851949
Epoch 0020 cost= 0.313741414
Epoch 0021 cost= 0.311840049
Epoch 0022 cost= 0.310004324
Epoch 0023 cost= 0.308363335
Epoch 0024 cost= 0.306689580
Epoch 0025 cost= 0.305273963
Optimization Finished!
Accuracy: 0.9183
[Finished in 21.0s]
我尝试了调整学习率和batch_size及training_epoch,准确率没有超过0.93,这可能是这种算法的天花板。
本此运行的程序包含了以下知识点:
- softmax函数
- from tensorflow.examples.tutorials.mnist import input_data
- batch和epoch
tensorflow.examples.tutorials.mnist下的input_data是mnist数据集的载入程序,如果本地没有代码就会从网上下载,只下载一次。为了使用方便,它将图像格式化输入,支持批量取出。
由于数据集比较大,使用全部数据集训练浪费时间,所以定义了batch_size每次随机取一部分数据训练。一个轮回称为一个epoch。
其它知识点:
- tf.argmax(vector, 1):返回的是vector中的最大值的索引号
- tf.cast()用来转换类型
- accuracy.eval({x:mnist.test.images, y:mnist.test.labels})和sess.run(accuracy, feed_dict = {x:mnist.test.images, y:mnist.test.labels})作用一样
网友评论