CNN卷积神经网络处理Mnist数据集

CNN模型结构:

输入层:Mnist数据集(28*28)
第一层卷积:感受视野5*5,步长为1,卷积核:32个
第一层池化:池化视野2*2,步长为2
第二层卷积:感受视野5*5,步长为1,卷积核:64个
第二层池化:池化视野2*2,步长为2
全连接层:设置1024个神经元
输出层:0~9十个数字类别
 
代码实现:
  1. import tensorflow as tf
  2. #Tensorflow提供了一个类来处理MNIST数据
  3. from tensorflow.examples.tutorials.mnist import input_data
  4. import time
  5.  
  6. #载入数据集
  7. mnist=input_data.read_data_sets('MNIST_data',one_hot=True)
  8. #设置批次的大小
  9. batch_size=100
  10. #计算一共有多少个批次
  11. n_batch=mnist.train.num_examples//batch_size
  12.  
  13. #定义初始化权值函数
  14. def weight_variable(shape):
  15. initial=tf.truncated_normal(shape,stddev=0.1)
  16. return tf.Variable(initial)
  17. #定义初始化偏置函数
  18. def bias_variable(shape):
  19. initial=tf.constant(0.1,shape=shape)
  20. return tf.Variable(initial)
  21. #卷积层
  22. def conv2d(input,filter):
  23. return tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='SAME')
  24. #池化层
  25. def max_pool_2x2(value):
  26. return tf.nn.max_pool(value,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
  27.  
  28. #输入层
  29. #定义两个placeholder
  30. x=tf.placeholder(tf.float32,[None,784]) #28*28
  31. y=tf.placeholder(tf.float32,[None,10])
  32. #改变x的格式转为4维的向量[batch,in_hight,in_width,in_channels]
  33. x_image=tf.reshape(x,[-1,28,28,1])
  34.  
  35. #卷积、激励、池化操作
  36. #初始化第一个卷积层的权值和偏置
  37. W_conv1=weight_variable([5,5,1,32]) #5*5的采样窗口,32个卷积核从1个平面抽取特征
  38. b_conv1=bias_variable([32]) #每一个卷积核一个偏置值
  39. #把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
  40. h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
  41. h_pool1=max_pool_2x2(h_conv1) #进行max_pooling 池化层
  42.  
  43. #初始化第二个卷积层的权值和偏置
  44. W_conv2=weight_variable([5,5,32,64]) #5*5的采样窗口,64个卷积核从32个平面抽取特征
  45. b_conv2=bias_variable([64])
  46. #把第一个池化层结果和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
  47. h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
  48. h_pool2=max_pool_2x2(h_conv2) #池化层
  49.  
  50. #28*28的图片第一次卷积后还是28*28,第一次池化后变为14*14
  51. #第二次卷积后为14*14,第二次池化后变为了7*7
  52. #经过上面操作后得到64张7*7的平面
  53.  
  54. #全连接层
  55. #初始化第一个全连接层的权值
  56. W_fc1=weight_variable([7*7*64,1024])#经过池化层后有7*7*64个神经元,全连接层有1024个神经元
  57. b_fc1 = bias_variable([1024])#1024个节点
  58. #把池化层2的输出扁平化为1维
  59. h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])
  60. #求第一个全连接层的输出
  61. h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
  62.  
  63. #keep_prob用来表示神经元的输出概率
  64. keep_prob=tf.placeholder(tf.float32)
  65. h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
  66.  
  67. #初始化第二个全连接层
  68. W_fc2=weight_variable([1024,10])
  69. b_fc2=bias_variable([10])
  70.  
  71. #输出层
  72. #计算输出
  73. prediction=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
  74.  
  75. #交叉熵代价函数
  76. cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
  77. #使用AdamOptimizer进行优化
  78. train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
  79. #结果存放在一个布尔列表中(argmax函数返回一维张量中最大的值所在的位置)
  80. correct_prediction=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))
  81. #求准确率(tf.cast将布尔值转换为float型)
  82. accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
  83.  
  84. #创建会话
  85. with tf.Session() as sess:
  86. start_time=time.clock()
  87. sess.run(tf.global_variables_initializer()) #初始化变量
  88. for epoch in range(21): #迭代21次(训练21次)
  89. for batch in range(n_batch):
  90. batch_xs,batch_ys=mnist.train.next_batch(batch_size)
  91. sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7}) #进行迭代训练
  92. #测试数据计算出准确率
  93. acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
  94. print('Iter'+str(epoch)+',Testing Accuracy='+str(acc))
  95. end_time=time.clock()
  96. print('Running time:%s Second'%(end_time-start_time)) #输出运行时间

  运行结果:

TensorFlow主要函数说明
1、卷积层
  1. tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

  

(1)data_format:表示输入的格式,有两种分别为:“NHWC”和“NCHW”,默认为“NHWC”
(2)input:输入是一个4维格式的(图像)数据,数据的 shape 由 data_format 决定:当 data_format 为“NHWC”输入数据的shape表示为[batch, in_height, in_width, in_channels],分别表示训练时一个batch的图片数量、图片高度、 图片宽度、 图像通道数。当 data_format 为“NHWC”输入数据的shape表示为[batch, in_channels, in_height, in_width]
(3)filter:卷积核是一个4维格式的数据:shape表示为:[height,width,in_channels, out_channels],分别表示卷积核的高、宽、深度(与输入的in_channels应相同)、输出 feature map的个数(即卷积核的个数)。
(4)strides:表示步长:一个长度为4的一维列表,每个元素跟data_format互相对应,表示在data_format每一维上的移动步长。当输入的默认格式为:“NHWC”,则 strides = [batch , in_height , in_width, in_channels]。其中 batch 和 in_channels 要求一定为1,即只能在一个样本的一个通道上的特征图上进行移动,in_height , in_width表示卷积核在特征图的高度和宽度上移动的布长。
(5)padding:表示填充方式:“SAME”表示采用填充的方式,简单地理解为以0填充边缘,当stride为1时,输入和输出的维度相同;“VALID”表示采用不填充的方式,多余地进行丢弃。
对于卷积操作:
2、池化层
  1. #池化层:
  2. #Max pooling:取“池化视野”矩阵中的最大值
  3. tf.nn.max_pool( value, ksize,strides,padding,data_format=’NHWC’,name=None)
  4. #Average pooling:取“池化视野”矩阵中的平均值
  5. tf.nn.avg_pool(value, ksize,strides,padding,data_format=’NHWC’,name=None)

  

TensorFlow——CNN卷积神经网络处理Mnist数据集的更多相关文章

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

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

  2. tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图

    tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图 因为很多 demo 都比较复杂,专门抽出这两个函数,写的 demo. 更多教程:http://www.tensorflown ...

  3. Tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_利用训练好的模型进行分类

    #coding:utf-8 import tensorflow as tf from PIL import Image,ImageFilter from tensorflow.examples.tut ...

  4. mxnet卷积神经网络训练MNIST数据集测试

    mxnet框架下超全手写字体识别—从数据预处理到网络的训练—模型及日志的保存 import numpy as np import mxnet as mx import logging logging. ...

  5. TensorFlow——LSTM长短期记忆神经网络处理Mnist数据集

    1.RNN(Recurrent Neural Network)循环神经网络模型 详见RNN循环神经网络:https://www.cnblogs.com/pinard/p/6509630.html 2. ...

  6. TensorFlow构建卷积神经网络/模型保存与加载/正则化

    TensorFlow 官方文档:https://www.tensorflow.org/api_guides/python/math_ops # Arithmetic Operators import ...

  7. 使用TensorFlow的卷积神经网络识别自己的单个手写数字,填坑总结

    折腾了几天,爬了大大小小若干的坑,特记录如下.代码在最后面. 环境: Python3.6.4 + TensorFlow 1.5.1 + Win7 64位 + I5 3570 CPU 方法: 先用MNI ...

  8. day-16 CNN卷积神经网络算法之Max pooling池化操作学习

    利用CNN卷积神经网络进行训练时,进行完卷积运算,还需要接着进行Max pooling池化操作,目的是在尽量不丢失图像特征前期下,对图像进行downsampling. 首先看下max pooling的 ...

  9. TensorFlow实现卷积神经网络

    1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...

随机推荐

  1. POJ 3691 DNA repair ( Trie图 && DP )

    题意 : 给出 n 个病毒串,最后再给出一个主串,问你最少改变主串中的多少个单词才能使得主串中不包含任何一个病毒串 分析 : 做多了AC自动机的题,就会发现这些题有些都是很套路的题目.在构建 Trie ...

  2. Go简易分布式对象存储 合并文件的所有分块为一个文件

    项目 项目地址: https://github.com/Draymonders/cloud 欢迎大家Watch or Star 缘由 由于项目中对大文件进行5MB为一个分块上传(多线程,提升上传效率) ...

  3. 一本通【例题4】Addition Chains——题解

    又是一道剪枝剪了半天的搜索题...题目传送 要充分利用题目中的约束条件:1.:2.对于每个k(1≤k≤m)k(1≤k≤m)满足ak=ai+aj(0≤i,j≤k−1)ak=ai+aj(0≤i,j≤k−1 ...

  4. 使用vue技术应当使用的技术和兼容性选择

    假如你的前端框架使用了vue,那你可以大胆地使用以下技术,并忽略其他js和css的兼容性问题,因为 关于vue的兼容性 官方给出了规定 Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 ...

  5. multipages-generator今日发布?!妈妈再也不用担心移动端h5网站搭建了!

    本文适合的读者?‍?‍?‍? 现在在手淘,京东,今日头条,美柚等过亿用户的手机app中的,都常见h5网页,他们有更新快,灵活,便于分享和传播的特性.这里有他们中的几个h5的例子:(手淘,美柚).这些a ...

  6. 解决 ffmpeg 在avformat_find_stream_info执行时间太长

    用ffmpeg做demux,网上很多参考文章.对于网络流,avformt_find_stream_info()函数默认需要花费较长的时间进行流格式探测,那么,如何减少探测时间内? 可以通过设置AVFo ...

  7. 网络流小记(EK&dinic&当前弧优化&费用流)

    欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...

  8. 如何:执行大型 XML 文档的流式转换 大XML文件解析入库的一个方法

    w Parsing Huge XML Files Incrementally http://pclib.github.io/safari/program/python-cookbook/Text/ch ...

  9. MongoDB学习【二】—MongoDB基础和数据类型

    一.MongoDB基础知识 在MongoDB中相关术语的解释和sql术语对应关系 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table col ...

  10. 测开之路一百零八:bootstrap表格

    引入bootstrap和jquery 普通表格 html自带的边框线 bootstrap表格属性 bootstrap表格 边框线 鼠标经过变色 压缩表格,减小密度 自适应屏幕 隔行突出(变色) 表格里 ...