网络实现程序如下

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data # 用于设置将记录哪些消息的阈值
old_v = tf.logging.get_verbosity()
# 设置日志反馈模式
tf.logging.set_verbosity(tf.logging.ERROR) mnist = input_data.read_data_sets("MNIST_data", one_hot=True) # 定义每次训练批次为100
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) # 定义卷积函数,其中x是输入,W是权重,
# strides表示步长,或者说是滑动速率,包含长宽方向
# 的步长。padding表示补齐数据。 目前有两种补齐方式,
# 一种是SAME,表示补齐操作后(在原始图像周围补充0),实
# 际卷积中,参与计算的原始图像数据都会参与。一种是VALID,
# 补齐操作后,进行卷积过程中,原始图片中右边或者底部
# 的像素数据可能出现丢弃的情况。
def conv2d(x, W):
# 步长为1
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') # 这步定义函数进行池化操作,在卷积运算中,是一种数据下采样的操作,
# 降低数据量,聚类数据的有效手段。常见的池化操作包含最大值池化和均值池化。
# 这里的2*2池化,就是每4个值中取一个,池化操作的数据区域边缘不重叠。
# 函数原型:def max_pool(value, ksize, strides, padding, data_format="NHWC", name=None)。
# 默认NHWC,表示4维数据,[batch,height,width,channels].
# 下面函数中的ksize,strides中,每次处理都是一张图片,对应的处理数据是一个通道
# (例如,只是黑白图片)。长宽都是2,表明是2*2的 池化区域,也反应出下采样的速度。
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],
padding='SAME') x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10]) # 将输入tensor进行形状调整,调整成为一个28*28的图片,
# 因为输入的时候x是一个[None,784],有与reshape的输入项shape
# 是[-1,28,28,1],后续三个维度数据28,28,1相乘后得到784,
# 所以,-1值在reshape函数中的特殊含义就可以映射程None。即输入图片的数量batch。
x_image = tf.reshape(x, [-1, 28, 28, 1]) # 初始化第一层卷积的权重和偏执值
# 5*5的采样窗口(卷积核),1个输入通道,输出32个通道(第二个卷积层有32个卷积核)
W_conv1 = weight_variable([5, 5, 1, 32])
# 偏置量定义,偏置的维度是32
b_conv1 = bias_variable([32])
# 将2维卷积的值加上一个偏置后的tensor,进行relu激活函数操作
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1) # 初始化第二层卷积的权重和偏执值
# 5*5的采样窗口,32个输入通道,64个输出通道
W_conv2 = weight_variable([5, 5, 32, 64])
# 偏置量定义,偏置的维度是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])
# 进行矩阵乘,加偏置后进行relu激活
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) # 对第二层卷积经过relu后的结果,基于tensor值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]) # 计算输出
# 最后,添加一个softmax层,就像前面的单层softmax regression一样。
# softmax是一个多选择分类函数,其作用和sigmoid这个二值
# 分类作用地位一样,在我们这个例子里面,softmax输出是10个(对应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_v2(labels=y,
logits=prediction))
# 使用AdamOptimizer进行优化
# 此函数是Adam优化算法:是一个寻找全局最优点的优化算法,引入了二次方梯度校正。
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # 记录预测值和标签值对比结果
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
# 求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) with tf.Session() as sess:
sess.run(tf.global_variables_initializer()) for epoch in range(21):
# 程序循环训练21次,
for batch in range(n_batch):
# 程序循环一次训练n_bath批次数据
# 每批次100个图片数据
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# 此步主要是用来训练W和bias用的。基于似然估计函数进行梯度下降,
# 收敛后,就等于W和bias都训练好了,keep_prob=0.7表示70%的数据参与
# 计算,防止过拟合和减少计算量
sess.run(train_step, feed_dict={x: batch_xs,
y: batch_ys,
keep_prob: 0.7})
# 用训练好的模型(权重W,偏执值b)对测试图片和测试标签值以及
# 给定的keep_prob进行feed操作,进行计算测试识别率。keep_prob=1.0
# 表示所有的数据都参与运算
acc = sess.run(accuracy, feed_dict={x: mnist.test.images,
y: mnist.test.labels,
keep_prob: 1.0})
print("Iter "+str(epoch)+", Testing Accuracy= "+str(acc))

CNN算法解决MNIST数据集识别问题的更多相关文章

  1. 一个简单的TensorFlow可视化MNIST数据集识别程序

    下面是TensorFlow可视化MNIST数据集识别程序,可视化内容是,TensorFlow计算图,表(loss, 直方图, 标准差(stddev)) # -*- coding: utf-8 -*- ...

  2. 6.keras-基于CNN网络的Mnist数据集分类

    keras-基于CNN网络的Mnist数据集分类 1.数据的载入和预处理 import numpy as np from keras.datasets import mnist from keras. ...

  3. 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速

    这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pyto ...

  4. 机器学习与Tensorflow(3)—— 机器学习及MNIST数据集分类优化

    一.二次代价函数 1. 形式: 其中,C为代价函数,X表示样本,Y表示实际值,a表示输出值,n为样本总数 2. 利用梯度下降法调整权值参数大小,推导过程如下图所示: 根据结果可得,权重w和偏置b的梯度 ...

  5. 卷积神经网络CNN识别MNIST数据集

    这次我们将建立一个卷积神经网络,它可以把MNIST手写字符的识别准确率提升到99%,读者可能需要一些卷积神经网络的基础知识才能更好的理解本节的内容. 程序的开头是导入TensorFlow: impor ...

  6. RNN入门(一)识别MNIST数据集

    RNN介绍   在读本文之前,读者应该对全连接神经网络(Fully Connected Neural Network, FCNN)和卷积神经网络( Convolutional Neural Netwo ...

  7. 【转载】用Scikit-Learn构建K-近邻算法,分类MNIST数据集

    原帖地址:https://www.jiqizhixin.com/articles/2018-04-03-5 K 近邻算法,简称 K-NN.在如今深度学习盛行的时代,这个经典的机器学习算法经常被轻视.本 ...

  8. 用CNN及MLP等方法识别minist数据集

    用CNN及MLP等方法识别minist数据集 2017年02月13日 21:13:09 hnsywangxin 阅读数:1124更多 个人分类: 深度学习.keras.tensorflow.cnn   ...

  9. Caffe系列4——基于Caffe的MNIST数据集训练与测试(手把手教你使用Lenet识别手写字体)

    基于Caffe的MNIST数据集训练与测试 原创:转载请注明https://www.cnblogs.com/xiaoboge/p/10688926.html  摘要 在前面的博文中,我详细介绍了Caf ...

随机推荐

  1. 服务主机superFetch占用磁盘过多

    有用户升级到Win10系统后,发现系统运行不快,查看任务管理器中正在运行的进程,然后查看到有一个名称为“服务主机:本地系统(网络受限)”的进程的磁盘占用率很高.如果想要解决这个问题,那么不妨参考下面介 ...

  2. Spring 获取bean 几种方式

    转载自: http://www.cnblogs.com/luoluoshidafu/p/5659574.html 1.读取xml文件的方式,这种在初学入门的时候比较适用 . ApplicationCo ...

  3. 执行多条SQL语句,实现数据库事务(不可传入Sql参数)

    执行多条SQL语句,实现数据库事务(不可传入Sql参数) http://blog.csdn.net/hanxuemin12345/article/details/9980371

  4. mongodb突然出现不是内外部命令或可执行

    可能因为晚上突然停电,电脑突然关机,给mongoDB造成影响,第二天出现了: 通过百度搜索与尝试:https://blog.csdn.net/hh12211221/article/details/78 ...

  5. Vue父子组件生命过程

    加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-& ...

  6. appium 移动端自动化测试一

    最近公司决定使用appium为主体框架做一个移动端得自动化测试系统,我会陆续记录项目得进展. 1.首先是appium环境得搭建, 需要安装appium-server ,appium-desktop, ...

  7. 2018-2019-2 20175126谢文航 实验二《Java面向对象程序设计》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1751 班 姓名:谢文航 学号:20175126 指导教师:娄嘉鹏 实验日期:2019年4月17日 实验时间:--- 实验序号:实验二 实验名称:Ja ...

  8. L2-028 秀恩爱分得快(模拟)

    古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K.任意两个人如果同 ...

  9. django xadmin后台页面实现二级联动

    思路 先找到控件id ,这样就可以监听change事件 然后把自己写的js加入xadmin中 添加url和view,接受ajax请求和发送数据 第一步:找到联动上下级的ID 在浏览器中通过F12查看 ...

  10. koa中间件

    koa是Express的下一代基于node的web框架  目前有1.x和2.0两个版本 1. Express Express是第一代最流行的web框架  它对node.js的http进行了封装 Exp ...