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根据距离和时长计算配速示例
Feb 16 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
Python中用Decorator来简化元编程的教程
Apr 13 Python
Python中的__slots__示例详解
Jul 06 Python
django启动uwsgi报错的解决方法
Apr 08 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
python 编码规范整理
May 05 Python
Django model select的多种用法详解
Jul 16 Python
python命名空间(namespace)简单介绍
Aug 10 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
Django重设Admin密码过程解析
Feb 10 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 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
关于时间计算的结总
2006/12/06 PHP
mysql5详细安装教程
2007/01/15 PHP
实用函数10
2007/11/08 PHP
PHP Document 代码注释规范
2009/04/13 PHP
php error_log 函数的使用
2009/04/13 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
Angularjs中ng-repeat的简单实例
2017/08/25 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
详解微信UnionID作用
2019/05/15 Javascript
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
python两个list[]相加的实现方法
2020/09/23 Python
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
人事主管的岗位职责
2013/11/16 职场文书
运动会标语
2014/06/21 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
遗失证明范文
2015/06/19 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA