Tensorflow实践之MNIST数据集上的Logistic Regression

Logistic Regression 简介

Tensorflow实践之MNIST数据集上的Logistic Regression
Logistic回归实质上就是一个线性模型,但是因为它的结果就是没有隐藏的神经网络,而且它的训练优化方法也很神经网络一样,所以很多神经网络学习之前都会先学习一下Logistic回归。
因为我们是在MNIST数据集上进行Logistic Regression,而MNIST是一个多分类问题,所以我们将原来的sigmoid函数换成softmax函数,sigmoid函数和softmax函数都是将正实数映射到0-1之间的方法,不同的是sigmoid是针对二分类问题,而softmax可以用于多分类:
sigmoid(x)=11+exsoftmax(xi)=exijexj sigmoid(x)=\frac{1}{1+e^{-x}}\quad\quad\quad softmax(x_{i})=\frac{e^{x_{i}}}{\sum_{j}e^{x_{j}}}
其中softmax函数中的xi是某一类别,j属于所有类别。

tensorflow实现

我们之前实现了一个自编码器的程序,现在我们实现Logistic回归并总结一下tensorflow实现网络的流程。

导入MNIST数据集

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./MNIST/",one_hot=True)

然后我们总结一下tensorflow实现网络的一般步骤:

tensorflow 完成网络的几个步骤
1. 创建输入输出的placeholder(可能还有其他参数可以写成placeholder形式)
2. 创建w和b的Tensor和初始化
3. 网络前向传播
4. 设计损失函数和优化方法
5. tensorflow.Session()开始训练

可能这些步骤中最难的部分就是前向传播,不一样的网络有不一样的前向传播,不过好在tensorflow给我们提供了很多高级或者低级的api,不过是卷积操作还是RNN之类的都可以调用函数。
我们按照这个步骤实现一下Logistic Regression:

1. 创建输入输出的placeholder

#1.创建输入输出的placeholder
X = tf.placeholder(dtype=tf.float32,shape=[None,784])
Y = tf.placeholder(dtype=tf.float32,shape=[None,10])

顺带我们看一下placeholder函数:
Tensorflow实践之MNIST数据集上的Logistic Regression
placeholder只有三个函数,dtype是它里面的数据类型,一般都是tf.float32,shape就是行数,列数,因为我们传进行的输入可能变,所以是[None,784]。想看这些函数可以去tensorflow官方api查看。

2. 创建w和b的Tensor和初始化

#2.创建w和b的Tensor和初始化
w = tf.Variable(tf.random_normal([784,10]),dtype=tf.float32)
b = tf.Variable(tf.random_normal([10]),dtype=tf.float32)

3. 网络前向传播

#3. 网络前向传播
A1 = tf.nn.softmax(tf.add(tf.matmul(X,w),b))

4. 设计损失函数和优化方法

#4. 设计损失函数和优化方法
y_true = Y
y_predict = A1
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y,logits=y_predict))
optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)

5. tensorflow.Session()开始训练

#5. tensorflow.Session()开始训练
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        X_batch,Y_batch = mnist.train.next_batch(128)
        _,l = sess.run([optimizer,cost],feed_dict={X:X_batch,Y:Y_batch})
        if i%1000==0:
            print ("Cost after interation %i:%f"%(i,l))

    acc = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y_predict,1),tf.argmax(Y,1)),tf.float32))
    print ("test accuracy is %f"%acc.eval({X:mnist.test.images,Y:mnist.test.labels}))

模型效果

我们将一个batch称为一轮,我们可以看下1000轮的效果:
Tensorflow实践之MNIST数据集上的Logistic Regression
然后调整轮词到10000:

Cost after interation 0:2.363908
Cost after interation 1000:1.721364
Cost after interation 2000:1.567436
Cost after interation 3000:1.556966
Cost after interation 4000:1.508942
Cost after interation 5000:1.568054
Cost after interation 6000:1.541994
Cost after interation 7000:1.488760
Cost after interation 8000:1.520135
Cost after interation 9000:1.543028
test accuracy is 0.929600

可以看到即使是线性模型效果也是非常好的。
欢迎评论交流,也欢迎关注,后续会继续更新自己学习到的深度学习内容!