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生成IP段的方法
Jul 07 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python探索之自定义实现线程池
Oct 27 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
Python对excel文档的操作方法详解
Dec 10 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
python文本数据处理学习笔记详解
Jun 17 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
python线程信号量semaphore使用解析
Nov 30 Python
Python小白不正确的使用类变量实例
May 29 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在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
php中filter_input函数用法分析
2014/11/15 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
vue刷新和tab切换实例
2018/02/11 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
使用Python下载Bing图片(代码)
2013/11/07 Python
Python实现多线程下载文件的代码实例
2014/06/01 Python
python写xml文件的操作实例
2014/10/05 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
解读python如何实现决策树算法
2018/10/11 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
python中的print()输出
2019/04/12 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
Python Django路径配置实现过程解析
2020/11/05 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
个人求职信范例
2014/01/29 职场文书
运动会邀请函范文
2014/01/31 职场文书
小学教师师德感言
2014/02/10 职场文书
报关专员求职信范文
2014/02/22 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
Golang 结构体数据集合
2022/04/22 Golang