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. docker-compose简介

    一.Docker-Compose简介   Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排.   Docker-Compose将所管理的容器分为三 ...

  2. php给配置数组赋默认值奇

    extract($this->_config['connection'] + array( 'database' => '', 'hostname' => '', 'username ...

  3. Collections 索引

    About Me NOIp 数据结构专题总结 NOIp 图论算法专题总结 NOIp 基础数论知识点总结 NOIp 数学知识点总结 搜索算法总结 (不包含朴素 DFS, BFS) 位运算 字符串算法总结 ...

  4. 为什么Redis可以方便地实现分布式锁

    1.Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系. 2.Redis的SETNX命令可以方便的实现分布式锁. setNX(SET if  ...

  5. 取得所有网卡的MAC地址,包括禁用的

    先在nuget包中添加System.Management.Automation引用. 然后下面就是代码了. using System;using System.Collections.ObjectMo ...

  6. canvas万花筒案例

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>Ti ...

  7. ubuntu命令整理中

    系统变量文件: ~/.bashrc 打印系统变量:echo $ANDROID_NDK 查看磁盘空间:df -h 解压缩: .tar.gz 解压:tar zxvf FileName.tar.gz 压缩: ...

  8. vue2.0 之 douban (一)框架搭建 及 整体布局

    1.创建豆瓣项目 我们通过官方vue-cli初始化项目 vue init webpack douban 填写项目描述,作者,安装vue-router 初始化后,通过npm install安装依赖 cd ...

  9. Unity各版本差异

    Unity各版本差异 version unity 5.x 4.x  2017 差异 特点  首先放出unity的下载地址,然后再慢慢分析各个版本.再者unity可以多个版本共存,只要不放在同一目录下. ...

  10. 洛谷P4124 手机号码

    传送 这题也就是条件限制多了点,也没有别的,套板子就好了 注意这里没有前导零,所以第一位是从1开始填 看注释叭 #include<iostream> #include<cstdio& ...