您的位置:首页 > 其它

Tensorflow学习系列(三): tensorflow mnist数据集如何跑出99+的准确率

2017-03-17 10:25 561 查看
如需转载,请注明出处,欢迎加入深度学习
255568483

mnist数据集基本上可以算做是数据科学里的hello world程序。

tensorflow官方文档有一个例子可以对mnist数据集做分析,对于刚入门者,可以通过简单的模型达到92%的准确率。

以下代码分析是对应所做的分析,请看对应的中文注释

#!/usr/bin/env python
# encoding: utf-8
# 文件说明:
# 原始参考URL:
# 功能说明:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

FLAGS = None

def main(_):
# 获取数据集
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

# 定义输入和输出的占位符
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])

# 定义通用函数
def weight_variable(shape):
# 截断正态分布 标准方差为0.1
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)

def bias_variable(shape):
# 设为非零避免死神经元
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)

def conv2d(x, W):
# 卷积不改变输入的shape
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='SAME')

sess = tf.InteractiveSession()

# 构建模型

# 把输入变换成一个4d的张量,第二三个对应的是图片的长和宽,第四个参数对应的颜色
x_image = tf.reshape(x, [-1, 28, 28, 1])

# 计算32个特征,每5*5patch,第一二个参数指的是patch的size,第三个参数是输入的channels,第四个参数是输出的channels
W_conv1 = weight_variable([5, 5, 1, 32])
# 偏差的shape应该和输出的shape一致,所以也是32
b_conv1 = bias_variable([32])

# 28*28的图片卷积时步长为1,随意卷积后大小不变,按2*2最大值池化,相当于从2*2块中提取一个最大值,
# 所以池化后大小为[28/2,28/2] = [14,14],第二次池化后为[14/2,14/2] = [7,7]

# 对数据做卷积操作
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
# max_pool_2x2之后,图片变成14*14
h_pool1 = max_pool_2x2(h_conv1)

# 在以前的基础上,生成了64个特征
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
# max_pool_2x2之后,图片变成7*7
h_pool2 = max_pool_2x2(h_conv2)

# 构造一个全连接的神经网络,1024个神经元
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
# 输出为1024
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

# 做Dropout操作
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

# 定义损失函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
# 定义优化函数
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# 计算准确率
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 初始化参数
sess.run(tf.global_variables_initializer())
for i in range(20000):
batch = mnist.train.next_batch(50)
if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g" % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

print("test accuracy %g" % accuracy.eval(feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--data_dir', type=str, default='data/mnist/input_data',
help='Directory for storing input data')
FLAGS, unparsed = parser.parse_known_args()
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)


运行效果截图



kaggle上有人跑出了99.8的准确率,我分析了他的模型,对应的结构如下:

Mnist数据集如何做到99.8%的准确率

根据kaggle上分享的文章,其模型结构如下:

1.先使用ZeroPadding2D 对2D输入的边界填充0,以控制卷积以后特征图的大小,输出为(None, 32, 32, 1)

2.Convolution2D,输出为(None, 27, 27, 24)

3.Activation (None, 27, 27, 24)

4. BatchNormalization  该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接近0,其标准差接近1 (None, 27, 27, 24)

5. MaxPooling2D池化数据 (None, 13, 13, 24)

6. ZeroPadding2D (None, 17, 17, 24)

7. Convolution2D (None, 13, 13, 48)

8. Activation (None, 13, 13, 48)

9. BatchNormalization (None, 13, 13, 48)

10. MaxPooling2D (None, 6, 6, 48)

11. ZeroPadding2D (None, 10, 10, 48)

12. Convolution2D (None, 7, 7, 64)

13. Activation (None, 7, 7, 64)

14. BatchNormalization (None, 7, 7, 64)

15. MaxPooling2D (None, 3, 3, 64)

16. Dropout (None, 3, 3, 64)

17.Flatten (None, 576)

18. Dropout (None, 576)

19. Dense (None, 3136)

20. Activation (None, 3136)

21.Dense (None, 10)

22.Activation (None, 10)

以上模型本人未做验证,如果你能跑出99.8的准确率,请分享一下你的模型。

当然kaggle上也有跑出了100%的准确率,我实在是搞不明白是如何跑出来的。

以上代码运行环境为tensorflow1.0,

欢迎加入深度学习群 255568483
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tensorflow 深度学习