tensorflow 4. 逻辑回归-mnist和softmax的应用

65 篇文章 4 订阅
34 篇文章 4 订阅

这里有一个例子演示使用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})作用一样

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值