tensorflow学习笔记之mnist的卷积神经网络实例


Posted in Python onApril 15, 2018

mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的。但是CNN层数要多一些,网络模型需要自己来构建。

程序比较复杂,我就分成几个部分来叙述。

首先,下载并加载数据:

import tensorflow as tf 
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)   #下载并加载mnist数据
x = tf.placeholder(tf.float32, [None, 784])            #输入的数据占位符
y_actual = tf.placeholder(tf.float32, shape=[None, 10])      #输入的标签占位符

定义四个函数,分别用于初始化权值W,初始化偏置项b, 构建卷积层和构建池化层。

#定义一个函数,用于初始化所有的权值 W
def weight_variable(shape):
 initial = tf.truncated_normal(shape, stddev=0.1)
 return tf.Variable(initial)

#定义一个函数,用于初始化所有的偏置项 b
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(x):
 return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')

接下来构建网络。整个网络由两个卷积层(包含激活层和池化层),一个全连接层,一个dropout层和一个softmax层组成。

#构建网络
x_image = tf.reshape(x, [-1,28,28,1])     #转换输入数据shape,以便于用于网络中
W_conv1 = weight_variable([5, 5, 1, 32])   
b_conv1 = bias_variable([32])    
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)   #第一个卷积层
h_pool1 = max_pool(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(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])       #reshape成向量
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)  #第一个全连接层

keep_prob = tf.placeholder("float") 
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)         #dropout层

W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_predict=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)  #softmax层

网络构建好后,就可以开始训练了。

cross_entropy = -tf.reduce_sum(y_actual*tf.log(y_predict))   #交叉熵
train_step = tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy)  #梯度下降法
correct_prediction = tf.equal(tf.argmax(y_predict,1), tf.argmax(y_actual,1))  
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))         #精确度计算
sess=tf.InteractiveSession()             
sess.run(tf.initialize_all_variables())
for i in range(20000):
 batch = mnist.train.next_batch(50)
 if i%100 == 0:         #训练100次,验证一次
  train_acc = accuracy.eval(feed_dict={x:batch[0], y_actual: batch[1], keep_prob: 1.0})
  print 'step %d, training accuracy %g'%(i,train_acc)
  train_step.run(feed_dict={x: batch[0], y_actual: batch[1], keep_prob: 0.5})

test_acc=accuracy.eval(feed_dict={x: mnist.test.images, y_actual: mnist.test.labels, keep_prob: 1.0})
print "test accuracy %g"%test_acc

Tensorflow依赖于一个高效的C++后端来进行计算。与后端的这个连接叫做session。一般而言,使用TensorFlow程序的流程是先创建一个图,然后在session中启动它。

这里,我们使用更加方便的InteractiveSession类。通过它,你可以更加灵活地构建你的代码。它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利,比如使用IPython。

训练20000次后,再进行测试,测试精度可以达到99%。

完整代码:

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 8 15:29:48 2016

@author: root
"""
import tensorflow as tf 
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)   #下载并加载mnist数据
x = tf.placeholder(tf.float32, [None, 784])            #输入的数据占位符
y_actual = tf.placeholder(tf.float32, shape=[None, 10])      #输入的标签占位符

#定义一个函数,用于初始化所有的权值 W
def weight_variable(shape):
 initial = tf.truncated_normal(shape, stddev=0.1)
 return tf.Variable(initial)

#定义一个函数,用于初始化所有的偏置项 b
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(x):
 return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')

#构建网络
x_image = tf.reshape(x, [-1,28,28,1])     #转换输入数据shape,以便于用于网络中
W_conv1 = weight_variable([5, 5, 1, 32])   
b_conv1 = bias_variable([32])    
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)   #第一个卷积层
h_pool1 = max_pool(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(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])       #reshape成向量
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)  #第一个全连接层

keep_prob = tf.placeholder("float") 
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)         #dropout层

W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_predict=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)  #softmax层

cross_entropy = -tf.reduce_sum(y_actual*tf.log(y_predict))   #交叉熵
train_step = tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy)  #梯度下降法
correct_prediction = tf.equal(tf.argmax(y_predict,1), tf.argmax(y_actual,1))  
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))         #精确度计算
sess=tf.InteractiveSession()             
sess.run(tf.initialize_all_variables())
for i in range(20000):
 batch = mnist.train.next_batch(50)
 if i%100 == 0:         #训练100次,验证一次
  train_acc = accuracy.eval(feed_dict={x:batch[0], y_actual: batch[1], keep_prob: 1.0})
  print('step',i,'training accuracy',train_acc)
  train_step.run(feed_dict={x: batch[0], y_actual: batch[1], keep_prob: 0.5})

test_acc=accuracy.eval(feed_dict={x: mnist.test.images, y_actual: mnist.test.labels, keep_prob: 1.0})
print("test accuracy",test_acc)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现二分查找算法实例
May 26 Python
Python实现的简单hangman游戏实例
Jun 28 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
Python实现多并发访问网站功能示例
Jun 19 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
Python数据库小程序源代码
Sep 15 Python
Python内置加密模块用法解析
Nov 25 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
Python yield的用法实例分析
Mar 06 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 #Python
Pytorch入门之mnist分类实例
Apr 14 #Python
pytorch构建网络模型的4种方法
Apr 13 #Python
Python输入二维数组方法
Apr 13 #Python
Python基于递归实现电话号码映射功能示例
Apr 13 #Python
Python的多维空数组赋值方法
Apr 13 #Python
python多维数组切片方法
Apr 13 #Python
You might like
由php的call_user_func传reference引发的思考
2010/07/23 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
yii上传文件或图片实例
2014/04/01 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
js获取Get值的方法
2016/09/29 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
原生js实现购物车功能
2020/09/23 Javascript
python处理二进制数据的方法
2015/06/03 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
linux安装python修改默认python版本方法
2019/03/31 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
电气工程师岗位职责
2014/01/01 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
求职简历的自我评价
2014/01/31 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
贷款委托书怎么写
2014/08/02 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
老人节标语大全
2014/10/08 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
公司与个人合作协议书
2016/03/19 职场文书
Python办公自动化解决world文件批量转换
2021/09/15 Python
SQL中的连接查询详解
2022/06/21 SQL Server
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers