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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
对于Python的Django框架部署的一些建议
Apr 09 Python
浅谈Python中函数的参数传递
Jun 21 Python
python中的lambda表达式用法详解
Jun 22 Python
Python使用剪切板的方法
Jun 06 Python
深入浅析Python中的yield关键字
Jan 24 Python
Python处理命令行参数模块optpars用法实例分析
May 31 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
python模拟实现斗地主发牌
Jan 07 Python
Django 实现对已存在的model进行更改
Mar 28 Python
python实现过滤敏感词
May 08 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 PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
python中使用%与.format格式化文本方法解析
2017/12/27 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
python实现俄罗斯方块游戏
2020/03/25 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
深入了解Python在HDA中的应用
2019/09/05 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
python 瀑布线指标编写实例
2020/06/03 Python
使用python实现学生信息管理系统
2021/02/25 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
学校十一活动方案
2014/02/01 职场文书
电台实习生求职信
2014/02/25 职场文书
挂职自我鉴定
2014/02/26 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python