Tensorflow——神经网络实现MNIST数据集分类

一、由于MNIST下载费事,此处提供下载,MNIST数据集下载:

MNIST数据集             

二、基于tensorflow的神经网络实现:

                   使用神经网络实现MNIST数据分类,此处给出一个简单的例子,仅定义输入层和输出层

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 = 60
#计算一共需要多少个批次
n_batch = mnist.train.num_examples // batch_size

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

#创建一个简单的神经网络
w = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,w)+b)

#二次代价函数
loss = tf.reduce_mean(tf.square(y - prediction))
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

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

#结果存放在一个布尔型列表中
#equal中的两个值,若是一样,则返回True,否则返回False。argmax函数:返回最大值所在的索引值,即位置
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
#求准确率
#将上一步的布尔类型转化为32位浮点型,即True转换为1.0,False转换为0.0,然后计算这些值的平均值作为准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

#定义会话
with tf.Session() as sess:
    #初始化变量
    sess.run(init)
    #迭代21个周期
    for epoch in range(100):
        #n_batch:之前定义的批次
        for batch in range(n_batch):
            #获得100张图片,图片的数据保存在batch_xs中,图片的标签保存在batch_ys中
            batch_xs,batch_ys = mnist.train.next_batch(batch_size)
            #使用Feed操作,此步执行训练操作的op,将数据喂给他
            sess.run(train_step,feed_dict = {x:batch_xs,y:batch_ys})
        #训练一个周期后就可以看下准确率,使用Feed方法,此步执行计算准确度的op操作,将其对应的参数喂给它
        acc = sess.run(accuracy,feed_dict = {x:mnist.test.images,y:mnist.test.labels})
        print("Iter " + str(epoch) + ",Testing Accuracy " + str(acc))
  • 结果:

  • 准确率达到了0.9138

 

 

三、优化措施(不使用LSTM网络和CNN网络)——调参

1、修改batch_size的大小

2、将隐藏层加入网络,可以增加一个、两个........

3、隐藏层的激活函数可以不适用softmax函数,可以使用sigmoid函数、tanh函数、Relu函数

4、增加每层网络的神经元个数

5、权值和偏置值的初始化修改,文中是初始化为0,我们也可以进行其他初始化,例如随机初始化等。

6、代价函数的选择,可以使用交叉熵代替二次代价函数

扫描二维码关注公众号,回复: 5132168 查看本文章

7、修改梯度下降法中的学习率,或者使用其他的优化方式

8、修改迭代次数

 

 

四、优化的真实实例

1、改变batch_size(批处理参数,批尺寸)和epoch(迭代次数)的值

               batch_size = 50

              epoch迭代次数改成100

结果如下:

2、代价函数使用交叉熵代价函数

               batch_size = 100

              epoch迭代次数改成21

将程序中的二次代价函数

#方法一:二次代价函数
loss = tf.reduce_mean(tf.square(y - prediction))

改成与softmax搭配使用的交叉熵

#方法二:交叉熵代价函数(cross-entropy)的使用
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction))

训练结果如下:

Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
Iter 0,Testing Accuracy 0.825
Iter 1,Testing Accuracy 0.8915
Iter 2,Testing Accuracy 0.9006
Iter 3,Testing Accuracy 0.9066
Iter 4,Testing Accuracy 0.9087
Iter 5,Testing Accuracy 0.9101
Iter 6,Testing Accuracy 0.9117
Iter 7,Testing Accuracy 0.9137
Iter 8,Testing Accuracy 0.915
Iter 9,Testing Accuracy 0.9149
Iter 10,Testing Accuracy 0.9178
Iter 11,Testing Accuracy 0.9181
Iter 12,Testing Accuracy 0.9195
Iter 13,Testing Accuracy 0.919
Iter 14,Testing Accuracy 0.9198
Iter 15,Testing Accuracy 0.9203
Iter 16,Testing Accuracy 0.9202
Iter 17,Testing Accuracy 0.9215
Iter 18,Testing Accuracy 0.9217
Iter 19,Testing Accuracy 0.9212
Iter 20,Testing Accuracy 0.9219

与二次代价函数训练的结果对比

Iter 0,Testing Accuracy 0.8321
Iter 1,Testing Accuracy 0.8702
Iter 2,Testing Accuracy 0.8797
Iter 3,Testing Accuracy 0.8885
Iter 4,Testing Accuracy 0.8937
Iter 5,Testing Accuracy 0.8969
Iter 6,Testing Accuracy 0.8998
Iter 7,Testing Accuracy 0.9021
Iter 8,Testing Accuracy 0.904
Iter 9,Testing Accuracy 0.9049
Iter 10,Testing Accuracy 0.9064
Iter 11,Testing Accuracy 0.9063
Iter 12,Testing Accuracy 0.909
Iter 13,Testing Accuracy 0.9096
Iter 14,Testing Accuracy 0.9099
Iter 15,Testing Accuracy 0.9105
Iter 16,Testing Accuracy 0.9114
Iter 17,Testing Accuracy 0.9126
Iter 18,Testing Accuracy 0.9132
Iter 19,Testing Accuracy 0.9134
Iter 20,Testing Accuracy 0.9136

可见,交叉熵代价函数训练出的结果是优于二次代价函数训练出的结果的

五、总结

1、在Tensorflow中,有

与sigmoid搭配使用的交叉熵代价函数:

tf.nn.sigmoid_cross_entropy_with_logits() 

也有与softmax搭配使用的交叉熵代价函数:

tf.nn.softmax_cross_entropy_with_logits()

2、在神经网络的设计中,如果输出的神经元是线性的,那么二次代价函数就是一种合适的选择;

     如果输出神经元是S型函数(例如sigmoid函数),那么比较适合使用交叉熵代价函数。

猜你喜欢

转载自blog.csdn.net/gaoyu1253401563/article/details/86032700