Tensorflow实现卷积神经网络的详细代码


Posted in Python onMay 24, 2018

本文实例为大家分享了Tensorflow实现卷积神经网络的具体代码,供大家参考,具体内容如下

1.概述

定义:

卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。它包括卷积层(alternating convolutional layer)和池层(pooling layer)。

卷积层(convolutional layer):

对输入数据应用若干过滤器,一个输入参数被用来做很多类型的提取。

池化层(Pooling Layer):

也叫子采样层,缩减数据的规模

2. 代码实现

首先要导入mnist数据,下载地址

训练数据:60000*784,训练标签:60000*10
测试数据:10000*784,测试标签:10000*10

#导入mnist数据
import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
# start tensorflow interactiveSession
import tensorflow as tf
sess = tf.InteractiveSession()

# weight initialization
#初始化时加入轻微噪声,来打破对称性,防止零梯度问题
#权重初始化
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)

# convolution卷积
#卷积使用1步长(stride size),0边距(padding size)的模板,
#padding='SAME'说明在
#保证输出和输入是同一个大小
def conv2d(x, W):
 return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
# pooling池化
#把特征图像区域的一部分求个均值或者最大值,用来代表这部分区域。
#如果是求均值就是mean pooling,求最大值就是max pooling。
#池化用简单传统的2x2大小的模板做max pooling
def max_pool_2x2(x):
 return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')


# 输入任意数量的图像,每一张图平铺成784维向量
x = tf.placeholder("float", [None, 784])
# target为10维标签向量
y_ = tf.placeholder("float", [None, 10])
# 权重是784*10,偏置值是[10]
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
# y=x*W+b
y = tf.nn.softmax(tf.matmul(x,W) + b)

# 第一个卷积层
# 权重是一个 [5, 5, 1, 32] 的张量,前两个维度是patch的大小,
# 接着是输入的通道数目,最后是输出的通道数目。
# 输出对应一个同样大小的偏置向量。
w_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
# 为了用这一层,我们把 x 变成一个4d向量,
# 第2、3维对应图片的宽高,最后一维代表颜色通道。
x_image = tf.reshape(x, [-1, 28, 28, 1])
'''
x_image 和权值向量进行卷积相乘,加上偏置,
使用ReLU激活函数,最后max pooling
'''
#h_conv1由于步长是1,输出单张图片大小不变是[28,28]
h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)
#h_pool1由于步长是2,输出单张图片大小减半[14,14]
h_pool1 = max_pool_2x2(h_conv1)

# 第二个卷积层
'''
为了构建一个更深的网络,我们会把几个类似的层堆叠起来。
第二层中,每个5x5的patch会得到64个特征。
'''
w_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])

#h_conv2由于步长是1,输出单张图片大小不变是[14,14]
h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)
#h_pool2由于步长是2,输出单张图片大小减半[7,7]
h_pool2 = max_pool_2x2(h_conv2)

# densely connected layer密集连接层
'''
现在,图片降维到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])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)

# dropout
'''
为了减少过拟合,我们在输出层之前加入dropout。我们用一个 placeholder 来代表一个神经元在dropout中被保留的概率。
这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout。 
TensorFlow的 操作会自动处理神经元输出值的scale。
所以用dropout的时候可以不用考虑scale。
'''
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# readout layer
#添加一个softmax层,就像前面的单层softmax regression一样
w_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, w_fc2) + b_fc2)
'''
我们会用更加复杂的ADAM优化器来做梯度最速下降,
在 feed_dict 中加入额外的参数keep_prob来控制dropout比例。
然后每100次迭代输出一次日志。
'''
# train and evaluate the model训练和评价模型
#计算交叉熵
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
#梯度下降求最小交叉熵
train_step = tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy)
#train_step = tf.train.AdagradOptimizer(1e-5).minimize(cross_entropy)
#检测我们的预测是否真实标签匹配
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
#把布尔值转换成浮点数,然后取平均值
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
#初始化变量
sess.run(tf.initialize_all_variables())
for i in range(20000):
 #随机抓取训练数据中的50个批处理数据点,然后我们用这些数据点作为参数替换 之前的占位符来运行train_step
 batch = mnist.train.next_batch(50)
 #每100次打印下
 if i%100 == 0:
  train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_:batch[1], keep_prob:1.0})
  print "step %d, train accuracy %g" %(i, train_accuracy)
 train_step.run(feed_dict={x:batch[0], y_:batch[1], keep_prob:0.5})

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

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

Python 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
python使用wxpython开发简单记事本的方法
May 20 Python
python妹子图简单爬虫实例
Jul 07 Python
Python基于PycURL实现POST的方法
Jul 25 Python
python逆向入门教程
Jan 15 Python
对Tensorflow中的矩阵运算函数详解
Jul 27 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 #Python
Tensorflow卷积神经网络实例进阶
May 24 #Python
Tensorflow卷积神经网络实例
May 24 #Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 #Python
TensorFlow实现卷积神经网络
May 24 #Python
tensorflow实现简单的卷积神经网络
May 24 #Python
tensorflow实现简单的卷积网络
May 24 #Python
You might like
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
Puppeteer使用示例详解
2019/06/20 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
什么是GWT的Module
2013/01/20 面试题
工商学院毕业生自荐信
2013/11/12 职场文书
计算机网络专业推荐信
2013/11/24 职场文书
总经理司机职责
2014/02/02 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
民间借贷被告代理词
2015/05/23 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL