1. #coding:utf-8
  2.  
  3. import tensorflow as tf
  4. from PIL import Image,ImageFilter
  5. from tensorflow.examples.tutorials.mnist import input_data
  6.  
  7. def imageprepare(argv): # 该函数读一张图片,处理后返回一个数组,进到网络中预测
  8. """
  9. This function returns the pixel values.
  10. The imput is a png file location.
  11. """
  12. im = Image.open(argv).convert('L')
  13. width = float(im.size[0])
  14. height = float(im.size[1])
  15. newImage = Image.new('L', (28, 28), (255)) # creates white canvas of 28x28 pixels
  16.  
  17. if width > height: # check which dimension is bigger
  18. # Width is bigger. Width becomes 20 pixels.
  19. nheight = int(round((20.0 / width * height), 0)) # resize height according to ratio width
  20. if nheight == 0: # rare case but minimum is 1 pixel
  21. nheight = 1
  22. # resize and sharpen
  23. img = im.resize((20, nheight), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
  24. wtop = int(round(((28 - nheight) / 2), 0)) # caculate horizontal pozition
  25. newImage.paste(img, (4, wtop)) # paste resized image on white canvas
  26. else:
  27. # Height is bigger. Heigth becomes 20 pixels.
  28. nwidth = int(round((20.0 / height * width), 0)) # resize width according to ratio height
  29. if (nwidth == 0): # rare case but minimum is 1 pixel
  30. nwidth = 1
  31. # resize and sharpen
  32. img = im.resize((nwidth, 20), Image.ANTIALIAS).filter(ImageFilter.SHARPEN)
  33. wleft = int(round(((28 - nwidth) / 2), 0)) # caculate vertical pozition
  34. newImage.paste(img, (wleft, 4)) # paste resized image on white canvas
  35.  
  36. # newImage.save("sample.png")
  37.  
  38. tv = list(newImage.getdata()) # get pixel values
  39.  
  40. # normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.
  41. tva = [(255 - x) * 1.0 / 255.0 for x in tv]
  42. return tva
  43. def weight_variable(shape):
  44. initial = tf.truncated_normal(shape,stddev=0.1) #生成一个截断的正态分布
  45. return tf.Variable(initial)
  46.  
  47. def bias_variable(shape):
  48. initial = tf.constant(0.1,shape = shape)
  49. return tf.Variable(initial)
  50.  
  51. #卷基层
  52. def conv2d(x,W):
  53. return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
  54. #池化层
  55. def max_pool_2x2(x):
  56. return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
  57. #定义两个placeholder
  58. x = tf.placeholder(tf.float32, [None,784])
  59. #y = tf.placeholder(tf.float32,[None,10])
  60.  
  61. #改变x的格式转为4D的向量[batch,in_height,in_width,in_channels]
  62. x_image = tf.reshape(x, [-1,28,28,1])
  63.  
  64. #初始化第一个卷基层的权值和偏置
  65. W_conv1 = weight_variable([5,5,1,32]) #5*5的采样窗口 32个卷积核从一个平面抽取特征 32个卷积核是自定义的
  66. b_conv1 = bias_variable([32]) #每个卷积核一个偏置值
  67.  
  68. #把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
  69. h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
  70. h_pool1 = max_pool_2x2(h_conv1) #进行max-pooling
  71.  
  72. #初始化第二个卷基层的权值和偏置
  73. W_conv2 = weight_variable([5,5,32,64]) # 5*5的采样窗口 64个卷积核从32个平面抽取特征 由于前一层操作得到了32个特征图
  74. b_conv2 = bias_variable([64]) #每一个卷积核一个偏置值
  75.  
  76. #把h_pool1和权值向量进行卷积 再加上偏置值 然后应用于relu激活函数
  77. h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2)
  78. h_pool2 = max_pool_2x2(h_conv2) #进行max-pooling
  79.  
  80. #28x28的图片第一次卷积后还是28x28 第一次池化后变为14x14
  81. #第二次卷积后 变为14x14 第二次池化后变为7x7
  82. #通过上面操作后得到64张7x7的平面
  83.  
  84. #初始化第一个全连接层的权值
  85. W_fc1 = weight_variable([7*7*64,1024])#上一层有7*7*64个神经元,全连接层有1024个神经元
  86. b_fc1 = bias_variable([1024]) #1024个节点
  87.  
  88. #把第二个池化层的输出扁平化为一维
  89. h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])
  90. #求第一个全连接层的输出
  91. h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
  92.  
  93. #keep_prob用来表示神经元的输出概率
  94. keep_prob = tf.placeholder(tf.float32)
  95. h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)
  96.  
  97. #初始化第二个全连接层
  98. W_fc2 = weight_variable([1024,10])
  99. b_fc2 = bias_variable([10])
  100.  
  101. #计算输出
  102. gailv = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
  103.  
  104. saver = tf.train.Saver()
  105. with tf.Session() as sess:
  106. sess.run(tf.global_variables_initializer())
  107. saver.restore(sess,'/home/xxx/logs/mnistmodel-1')
  108. array = imageprepare('/home/xxx/logs/7.jpg') # 读一张包含数字的图片
  109. prediction = tf.argmax(gailv, 1) # 预测
  110. prediction = prediction.eval(feed_dict={x:[array],keep_prob:1.0},session=sess)
  111. print('The digits in this image is:%d' % prediction[0])
 
 
 
 
 
第二修改部分:(上面的可能运行GPU会耗尽)

#coding:utf-8

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 = 100

n_batch = mnist.train._num_examples // batch_size

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')
#定义两个placeholder
x = tf.placeholder(tf.float32, [None,784])
y = tf.placeholder(tf.float32,[None,10])

#改变x的格式转为4D的向量[batch,in_height,in_width,in_channels]
x_image = tf.reshape(x, [-1,28,28,1])

#初始化第一个卷基层的权值和偏置
W_conv1 = weight_variable([5,5,1,32]) #5*5的采样窗口 32个卷积核从一个平面抽取特征 32个卷积核是自定义的
b_conv1 = bias_variable([32]) #每个卷积核一个偏置值

#把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
h_pool1 = max_pool_2x2(h_conv1) #进行max-pooling

#初始化第二个卷基层的权值和偏置
W_conv2 = weight_variable([5,5,32,64]) # 5*5的采样窗口 64个卷积核从32个平面抽取特征 由于前一层操作得到了32个特征图
b_conv2 = bias_variable([64]) #每一个卷积核一个偏置值

#把h_pool1和权值向量进行卷积 再加上偏置值 然后应用于relu激活函数
h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2) #进行max-pooling

#28x28的图片第一次卷积后还是28x28 第一次池化后变为14x14
#第二次卷积后 变为14x14 第二次池化后变为7x7
#通过上面操作后得到64张7x7的平面

#初始化第一个全连接层的权值
W_fc1 = weight_variable([7*7*64,1024])#上一层有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)

#keep_prob用来表示神经元的输出概率
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])

#计算输出
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)

#交叉熵代价函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))

#使用AdamOptimizer进行优化
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
#结果存放在一个布尔列表中
correct_prediction = tf.equal(tf.argmax(prediction,1),tf.argmax(y,1)) #argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(50):
for batch in range(n_batch):
batch_xs,batch_ys = mnist.train.next_batch(batch_size)
sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7})
batch_xstest,batch_ystest = mnist.test.next_batch(batch_size)
acc = sess.run(accuracy,feed_dict={x: batch_xstest,y:batch_ystest,keep_prob:0.7})
print ("Iter "+ str(epoch) + ", Testing Accuracy= " + str(acc))

saver.save(sess,save_path='C:/Users/Administrator/Desktop/深度学习500问/logs/mnist_net.ckpt')

结果 手写数字图片7被预测为7

  1. I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0
  2. I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0: Y
  3. I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:03:00.0)
  4. The digits in this image is:7

Tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_利用训练好的模型进行分类的更多相关文章

  1. TensorFlow——CNN卷积神经网络处理Mnist数据集

    CNN卷积神经网络处理Mnist数据集 CNN模型结构: 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积 ...

  2. tensorflow学习笔记七----------卷积神经网络

    卷积神经网络比神经网络稍微复杂一些,因为其多了一个卷积层(convolutional layer)和池化层(pooling layer). 使用mnist数据集,n个数据,每个数据的像素为28*28* ...

  3. tensorflow学习之路-----卷积神经网络个人总结

    卷积神经网络大总结(个人理解) 神经网络 1.概念:从功能他们模仿真实数据 2.结构:输入层.隐藏层.输出层.其中隐藏层要有的参数:权重.偏置.激励函数.过拟合 3.功能:能通过模仿,从而学到事件 其 ...

  4. 利用卷积神经网络实现MNIST手写数据识别

    代码: import torch import torch.nn as nn import torch.utils.data as Data import torchvision # 数据库模块 im ...

  5. 机器学习与Tensorflow(4)——卷积神经网络与tensorflow实现

    1.标准卷积神经网络 标准的卷积神经网络由输入层.卷积层(convolutional layer).下采样层(downsampling layer).全连接层(fully—connected laye ...

  6. Tensorflow学习教程------过拟合

    Tensorflow学习教程------过拟合   回归:过拟合情况 / 分类过拟合 防止过拟合的方法有三种: 1 增加数据集 2 添加正则项 3 Dropout,意思就是训练的时候隐层神经元每次随机 ...

  7. 使用TensorFlow v2.0构建卷积神经网络

    使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...

  8. 3层-CNN卷积神经网络预测MNIST数字

    3层-CNN卷积神经网络预测MNIST数字 本文创建一个简单的三层卷积网络来预测 MNIST 数字.这个深层网络由两个带有 ReLU 和 maxpool 的卷积层以及两个全连接层组成. MNIST 由 ...

  9. Neuromation新研究:利用卷积神经网络进行儿童骨龄评估

    近日,Neuromation 团队在 Medium 上撰文介绍其最新研究成果:利用卷积神经网络(CNN)评估儿童骨龄,这一自动骨龄评估系统可以得到与放射科专家相似或更好的结果.该团队评估了手骨不同区域 ...

随机推荐

  1. HiBench成长笔记——(6) HiBench测试结果分析

    Scan Join Aggregation Scan Join Aggregation Scan Join Aggregation Scan Join Aggregation Scan Join Ag ...

  2. DRF项目之自定义分页器

    在项目中,我们多需要自定义分页器. 代码实现: class PageNum(PageNumberPagination): '''自定义分页器''' # 每页显示个数 page_size = 10 pa ...

  3. SpringMVC 文件的上传、下载

    文件上传 (1)下载添加2个jar包 commons-fileupload.jar commons-io.jar SpringMVC的文件上传依赖于Apache的FileUpload组件,需要下载添加 ...

  4. 云服务器:西部数码VS阿里云

    公司因为业务的需要,申请了两个云服务器.一个是西部数码的,一个是阿里云香港的.其中西部数码的配置高一些,一年4500元左右:香港的则便宜些,一年2200左右.因为备案问题,主业务放在成都的西部数码服务 ...

  5. log4j配置文件——hibernate

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j ...

  6. Mysql多对多关系的查询

    1.创建user表 2.创建gateway表 3.创建user_gateway表 4.创建device表 5.创建gateway_device表 6.创建一个实体类 public class Devi ...

  7. Jmeter安装插件Stepping Thread Group

    下载链接:https://jmeter-plugins.org/downloads/old/ 下载解压后,将JMeterPlugins-Standard.jar包放在jmeter安装目录的jmeter ...

  8. P1010 一元多项式求导

    1010 一元多项式求导 (转跳点:

  9. HDU - 6181 Two Paths(次短路)

    题意:求次短路. 分析:关键是情况讨论. LL tmpd = x.d + e.dist; 以下情况对应的更新结果 1.tmpd(2) < 最短路(3) < 次短路(4)-------> ...

  10. C++面试常见问题——09static关键字

    static关键字 局部变量 局部变量 局部变量是最常见的量,编译器不会对其进行初始化,除非对其显式赋值,不然初始值是随机的. 普通局部变量存储在栈空间,使用完毕后会立即被释放. 静态局部变量 静态局 ...