Tensorflow深度学习入门——优化训练MNIST数据和调用训练模型识别图片

适合入门


"""A very simple MNIST classifier.
Documentation at
http://niektemme.com/ @@to doThis script is based on the Tensoflow MNIST expert tutorial
See extensive documentation for the tutorial at
https://www.tensorflow.org/versions/master/tutorials/mnist/pros/index.html
"""#import modules
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data#import data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)sess = tf.InteractiveSession()#它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的.# Create the model
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]))
y = tf.nn.softmax(tf.matmul(x, W) + b)'''
为了创建这个模型,我们需要创建大量的权重和偏置项。
这个模型中的权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度。
由于我们使用的是ReLU神经元,因此比较好的做法是用一个较小的正数来初始化偏置项,
以避免神经元节点输出恒为0的问题(dead neurons)。
为了不在建立模型的时候反复做初始化操作,我们定义两个函数用于初始化。
'''def weight_variable(shape):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)'''
TensorFlow在卷积和池化上有很强的灵活性。我们怎么处理边界?步长应该设多大?
在这个实例里,我们会一直使用vanilla版本。我们的卷积使用1步长(stride size),
0边距(padding size)的模板,保证输出和输入是同一个大小。
我们的池化用简单传统的2x2大小的模板做max pooling。
为了代码更简洁,我们把这部分抽象成一个函数。
'''
def conv2d(x, W):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')'''
第一层卷积,它由一个卷积接一个max pooling完成。卷积在每个5x5的patch中算出32个特征。
卷积的权重张量形状是 [5, 5, 1, 32] ,前两个维度是patch的大小,
接着是输入的通道数目,最后是输出的通道数目。
而对于每一个输出通道都有一个对应的偏置量。
'''W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])#为了用这一层,我们把 x 变成一个4d向量,其第2、第3维对应图片的宽、高,
#最后一维代表图片的颜色通道数(因为是灰度图所以这里的通道数为1,如果是rgb彩色图,则为3)。
x_image = tf.reshape(x, [-1,28,28,1])
#我们把 x_image 和权值向量进行卷积,加上偏置项,然后应用ReLU激活函数,最后进行max pooling
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)'''
第二层中,每个5x5的patch会得到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)
h_pool2 = max_pool_2x2(h_conv2)'''
现在,图片尺寸减小到7x7,我们加入一个有1024个神经元的全连接层,用于处理整个图片。
我们把池化层输出的张量reshape成一些向量,
乘上权重矩阵,加上偏置,然后对其使用ReLU。
'''
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([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。
我们用一个 placeholder 来代表一个神经元的输出在dropout中保持不变的概率。
这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout。
TensorFlow的 tf.nn.dropout 操作除了可以屏蔽神经元的输出外,
还会自动处理神经元输出值的scale。
所以用dropout的时候可以不用考虑scale。
'''
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)#输出层:最后,我们添加一个softmax层,就像前面的单层softmax regression一样
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)'''
为了进行训练和评估,我们使用与之前简单的单层SoftMax神经网络模型几乎相同的一套代码,
只是我们会用更加复杂的ADAM优化器来做梯度最速下降,
在 feed_dict 中加入额外的参数 keep_prob 来控制dropout比例。
然后每100次迭代输出一次日志。
'''
# Define loss and optimizer
cross_entropy = -tf.reduce_sum(y_*tf.log(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))"""
Train the model and save the model to disk as a model2.ckpt file
file is stored in the same directory as this python script is startedBased on the documentatoin at
https://www.tensorflow.org/versions/master/how_tos/variables/index.html
"""
saver = tf.train.Saver()
sess.run(tf.initialize_all_variables())
#with tf.Session() as sess:#sess.run(init_op)
for i in range(20000):batch = mnist.train.next_batch(50)if i%200 == 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})save_path = saver.save(sess, "save_model_2_20000/model2.ckpt")
print ("Model saved in file: ", save_path)print("test accuracy %g"%accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

训练时长:15~30分钟
训练后的 精度为: 99.28%

"""Predict a handwritten integer (MNIST expert).Script requires
1) saved model (model2.ckpt file) in the same location as the script is run from.
(requried a model created in the MNIST expert tutorial)
2) one argument (png file location of a handwritten integer)"""#import modules
import sys
import tensorflow as tf
from PIL import Image, ImageFilterdef predictint(imvalue):"""This function returns the predicted integer.The imput is the pixel values from the imageprepare() function."""# Define the model (same as when creating the model file)x = tf.placeholder(tf.float32, [None, 784])W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))def weight_variable(shape):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):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')   W_conv1 = weight_variable([5, 5, 1, 32])b_conv1 = bias_variable([32])x_image = tf.reshape(x, [-1,28,28,1])h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)h_pool1 = max_pool_2x2(h_conv1)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)h_pool2 = max_pool_2x2(h_conv2)W_fc1 = weight_variable([7 * 7 * 64, 1024])b_fc1 = bias_variable([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)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.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)init_op = tf.global_variables_initializer()saver = tf.train.Saver()"""Load the model2.ckpt filefile is stored in the same directory as this python script is startedUse the model to predict the integer. Integer is returend as list.Based on the documentatoin athttps://www.tensorflow.org/versions/master/how_tos/variables/index.html"""with tf.Session() as sess:sess.run(init_op)saver.restore(sess, "save_model_2_20000/model2.ckpt")#print ("Model restored.")prediction=tf.argmax(y_conv,1)return prediction.eval(feed_dict={x: [imvalue],keep_prob: 1.0}, session=sess)def imageprepare(argv):"""This function returns the pixel values.The imput is a png file location."""im = Image.open(argv).convert('L')width = float(im.size[0])height = float(im.size[1])newImage = Image.new('L', (28, 28), (255)) #creates white canvas of 28x28 pixelsif width > height: #check which dimension is bigger#Width is bigger. Width becomes 20 pixels.nheight = int(round((20.0/width*height),0)) #resize height according to ratio widthif (nheigth == 0): #rare case but minimum is 1 pixelnheigth = 1  # resize and sharpenimg = im.resize((20,nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)wtop = int(round(((28 - nheight)/2),0)) #caculate horizontal pozitionnewImage.paste(img, (4, wtop)) #paste resized image on white canvaselse:#Height is bigger. Heigth becomes 20 pixels. nwidth = int(round((20.0/height*width),0)) #resize width according to ratio heightif (nwidth == 0): #rare case but minimum is 1 pixelnwidth = 1# resize and sharpenimg = im.resize((nwidth,20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)wleft = int(round(((28 - nwidth)/2),0)) #caculate vertical pozitionnewImage.paste(img, (wleft, 4)) #paste resized image on white canvas#newImage.save("sample.png")tv = list(newImage.getdata()) #get pixel values#normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.tva = [ (255-x)*1.0/255.0 for x in tv] return tva#print(tva)def main(argv):"""Main function."""imvalue = imageprepare(argv)predint = predictint(imvalue)print (predint[0]) #first value in listif __name__ == "__main__":#main(sys.argv[1])main("8_0.png")

识别结果为:

Tensorflow深度学习入门(5)——优化训练MNIST数据和调用训练模型识别图片相关推荐

  1. [TensorFlow深度学习入门]实战九·用CNN做科赛网TibetanMNIST藏文手写数字数据集准确率98%+

    [TensorFlow深度学习入门]实战九·用CNN做科赛网TibetanMNIST藏文手写数字数据集准确率98.8%+ 我们在博文,使用CNN做Kaggle比赛手写数字识别准确率99%+,在此基础之 ...

  2. [TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式)

    [TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式) 个人网站–> http://www.yansongsong.cn TensorFl ...

  3. Tensorflow深度学习入门(1)——Tensorflow环境搭建

    Tensorflow深度学习入门--环境搭建 自测以下的环境搭建方式是行得通的,目前我用的就是这些 1.        下载安装Ubuntu 14.04 虚拟机 https://github.com/ ...

  4. 深度学习入门源代码下载使用mnist数据集出现错误EOFError Compressed file ended before the end-of-stream marker was reached

    深度学习入门:基于Python的理论与实现源代码下载使用mnist数据集出现错误[EOFError: Compressed file ended before the end-of-stream ma ...

  5. 《深度学习入门P72》显示mnist图像

    import numpy as np from PIL import Image data = np.load('/home/zhangshicai/下载/dlCode/code/mnist.npz' ...

  6. 深度学习入门笔记系列 ( 二 )——基于 tensorflow 的一些深度学习基础知识

    本系列将分为 8 篇 .今天是第二篇 .主要讲讲 TensorFlow 框架的特点和此系列笔记中涉及到的入门概念 . 1.Tensor .Flow .Session .Graphs TensorFlo ...

  7. 使用TensorFlow.js在浏览器中进行深度学习入门

    目录 设置TensorFlow.js 创建训练数据 检查点 定义神经网络模型 训练AI 测试结果 终点线 内存使用注意事项 下一步是什么?狗和披萨? 下载TensorFlowJS示例-6.1 MB T ...

  8. 基于TensorFlow深度学习框架,运用python搭建LeNet-5卷积神经网络模型和mnist手写数字识别数据集,设计一个手写数字识别软件。

    本软件是基于TensorFlow深度学习框架,运用LeNet-5卷积神经网络模型和mnist手写数字识别数据集所设计的手写数字识别软件. 具体实现如下: 1.读入数据:运用TensorFlow深度学习 ...

  9. 深度学习入门笔记(十五):深度学习框架(TensorFlow和Pytorch之争)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  10. TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络

    TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnote ...

最新文章

  1. 分享这篇耗子叔的-《请玉伯一起来聊一聊“所向无敌的土方法”》
  2. lingo 嵌套@for或嵌套@sum
  3. 从无头单链表中删除节点 结构之法 4
  4. webstorm怎么跑项目_怎么跑Mint-UI的实例,你知道吗?
  5. cookie对比localStorage哪个适合作为网站皮肤存储
  6. 通过system调用Am命令执行动作
  7. linux实验三makefile,实验平台上Makefile详细的解释
  8. 干货收藏!639页《深度学习:Deep Learning》图文并茂课程PPT
  9. ubuntu查看oracle客户端,ubuntu 9.04 下安装 oracle 客户端oracle-xe-client
  10. mac 下chrome 和 微信web开发工具跨域配置
  11. 【Winhex】狂派入门: Winhex的简单使用教程
  12. Linux 磁盘无损扩容
  13. 计算机word题目设置标题,word文档标题怎么设置?word设置标题样式的方法
  14. python中fact_python中fact函数使用
  15. 陈强《计量经济学及Stata应用》习题答案
  16. matlab中regress函数教程,regress()函数
  17. AirSim无人机仿真——手柄操作
  18. 关于谭浩强老先生的《C++程序设计教程》
  19. SVN出现黄色感叹号,红绿双箭头
  20. 年底了,开发板开始搞促销了,推荐几款超值的ARM开发板。

热门文章

  1. 欧姆龙编程软件SysmacStudio卸载方法
  2. 【第七篇】Vue实战综合案例
  3. KML和KMZ 用什么软件打开?
  4. 如何从网站提取数据?
  5. 银联的支付创新产业基地将落户安徽合肥 投资达80亿
  6. 离散考试题计算机,离散数学试题及答案_离散数学试题库_离散数学试卷及答案...
  7. 读掘金小册组件精讲总结2
  8. 计算机房防凝露保温材料,机房保温的方案.docx
  9. 最新全国五级行政区划json文件下载链接 全国最新统计用区划代码和城乡划分代码使用指南
  10. html语言pre,【已解决】html代码中用pre还是code表示程序代码以及如何指定代码的语音种类...