Tensorflow卷积神经网络实例


Posted in Python onMay 24, 2018

CNN最大的特点在于卷积的权值共享结构,可以大幅减少神经网络的参数量,防止过拟合的同时又降低了神经网络模型的复杂度。在CNN中,第一个卷积层会直接接受图像像素级的输入,每一个卷积操作只处理一小块图像,进行卷积变化后再传到后面的网络,每一层卷积都会提取数据中最有效的特征。这种方法可以提取到图像中最基础的特征,比如不同方向的边或者拐角,而后再进行组合和抽象形成更高阶的特征。

一般的卷积神经网络由多个卷积层构成,每个卷积层中通常会进行如下几个操作:

  • 图像通过多个不同的卷积核的滤波,并加偏置(bias),特取出局部特征,每个卷积核会映射出一个新的2D图像。
  • 将前面卷积核的滤波输出结果,进行非线性的激活函数处理。目前最常见的是使用ReLU函数,而以前Sigmoid函数用得比较多。
  • 对激活函数的结果再进行池化操作(即降采样,比如将2*2的图片将为1*1的图片),目前一般是使用最大池化,保留最显著的特征,并提升模型的畸变容忍能力。

总结一下,CNN的要点是局部连接(local Connection)、权值共享(Weight Sharing)和池化层(Pooling)中的降采样(Down-Sampling)。

本文将使用Tensorflow实现一个简单的卷积神经网络,使用的数据集是MNIST,网络结构:两个卷积层加一个全连接层。

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

# 载入MNIST数据集,并创建默认的Interactive Session。
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess = tf.InteractiveSession()

# 创建权重和偏置,以便重复使用。我们需要给权重制造一些随机的噪声来打破完全对称,比如截断的正态分布噪声,标准差设为0.1
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)

# 创建卷积层、池化层,以便重复使用
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')

# 定义输入的placeholder
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
x_image = tf.reshape(x, [-1, 28, 28, 1])

# 定义第一个卷积层
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)

# 定义全连接层。由于第二个卷积层输出的tensor是7*7*64,我们使用tf.reshape函数对其进行变形
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层。通过一个placeholder传入keep_prob比率来控制的。在训练时,我们随机丢弃一部分节点
# 的数据来减轻过拟合,预测时则保留全部数据来追求最好的预测性能。
keep_prob = tf.placeholder(dtype=tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# 最后我们将Dropout层的输出连接一个Softmax层,得到最后的概率输出
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)

# 定义损失函数为cross entropy和优化器
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

# 定义评测准确率的操作
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 下面开始训练
tf.global_variables_initializer().run()
for i in range(20000):
 batch = mnist.train.next_batch(50)
 if i % 100 == 0:
  train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
  print("Step %d, training 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}))

# 载入MNIST数据集,并创建默认的Interactive Session。
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess = tf.InteractiveSession()

# 创建权重和偏置,以便重复使用。我们需要给权重制造一些随机的噪声来打破完全对称,比如截断的正态分布噪声,标准差设为0.1
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)

# 创建卷积层、池化层,以便重复使用
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')

# 定义输入的placeholder
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
x_image = tf.reshape(x, [-1, 28, 28, 1])

# 定义第一个卷积层
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)

# 定义全连接层。由于第二个卷积层输出的tensor是7*7*64,我们使用tf.reshape函数对其进行变形
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层。通过一个placeholder传入keep_prob比率来控制的。在训练时,我们随机丢弃一部分节点
# 的数据来减轻过拟合,预测时则保留全部数据来追求最好的预测性能。
keep_prob = tf.placeholder(dtype=tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# 最后我们将Dropout层的输出连接一个Softmax层,得到最后的概率输出
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)

# 定义损失函数为cross entropy和优化器
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

# 定义评测准确率的操作
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 下面开始训练
tf.global_variables_initializer().run()
for i in range(20000):
 batch = mnist.train.next_batch(50)
 if i % 100 == 0:
  train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
  print("Step %d, training 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}))

运行结果:

Tensorflow卷积神经网络实例

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

Python 相关文章推荐
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
Python3多线程基础知识点
Feb 19 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python 实现绘制整齐的表格
Nov 18 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
python使用turtle库绘制奥运五环
Feb 24 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 #Python
TensorFlow实现卷积神经网络
May 24 #Python
tensorflow实现简单的卷积神经网络
May 24 #Python
tensorflow实现简单的卷积网络
May 24 #Python
解决pandas 作图无法显示中文的问题
May 24 #Python
TensorFlow实现简单卷积神经网络
May 24 #Python
解决matplotlib库show()方法不显示图片的问题
May 24 #Python
You might like
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
刷新时清空文本框内容的js代码
2007/04/23 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
JavaScript中的比较操作符>、=、
2014/12/31 Javascript
Node.js实现数据推送
2016/04/14 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
Python中的文件和目录操作实现代码
2011/03/13 Python
Python实现股市信息下载的方法
2015/06/15 Python
详解Django框架中的视图级缓存
2015/07/23 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
python+mongodb数据抓取详细介绍
2017/10/25 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
super()与this()的区别
2016/01/17 面试题
雪山饭庄的创业计划书范文
2014/01/18 职场文书
社区务虚会发言材料
2014/10/20 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
房地产项目合作意向书
2015/05/08 职场文书
死亡诗社观后感
2015/06/05 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
古诗之感恩老师
2019/10/24 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server