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
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 MNIST 数据集测试代码入门
- tensorflow mnist数据集手写字识别
- tensorflow MNIST数据集
- tensorflow MNIST数据集的训练(线性模型)及tensorboard计算结果可视化
- Tensorflow MNIST 卷积神经网络入门与思考系列
- Tensorflow MNIST 数据集測试代码入门
- 学习笔记TF056:TensorFlow MNIST,数据集、分类、可视化
- TensorFlow mnist数据集路径 MNIST_data 数据下载问题
- tensorflow mnist数据集 cnn demo
- TensorFlow mnist 数据集练习
- tensorflow MNIST数据集上简单的MLP网络
- Tensorflow MNIST 数据集测试代码入门
- tensorflow mnist实战笔记(二)制作和读取自己的数据集
- tensorflow tutorials(八):手写数字数据集MNIST介绍
- 罗斯基白话:TensorFlow + 实战系列(五)实战MNIST
- 如何安装Spark & TensorflowOnSpark
- tensorflow mnist 示例运行结果
- TensorFlow MNIST (Softmax)
- TensorFlowOnSpark HDP环境搭建及Mnist部署测试过程
- tensorflow +mnist