TensorFlow实现简单的卷积神经网络_#### 1. 请用tensorflow编写实现一个卷积神经网络,并进行模型效果的可视化展示。-程序员宅基地

技术标签: CNN  深度学习  TensorFlow  

一、卷积神经网络简介

卷积神经网络(Convolutional Neural Network, CNN)最初是为了解决图像识别等问题设计的,当然其现在的应用不仅限于图像和视频,也可以用于时间序列信号,比如音频信号,文本数据等。早期的图像识别研究中,最大的挑战是如何组织特征,因为图像数据不像其他类型的数据那样可以通过人工理解来提取特征。我们需要借助SIFT、HoG等算法提取具有良好区分行的特征。在集合SVM机器学习算法进行图像识别。但是,他们的性能不是很好。而卷积神经网络提取的特征则可以达到更好的效果,同时它不需要将特征提取和分类训练两个过程分开。CNN作为一个深度学习架构被提出的最初诉求,是降低对图像数据预处理的要求,以及避免复杂的特征工程。CNN可以直接使用图像的原始像素作为输入,而不必先试用SIFT等算法提取特征,减轻了使用传统算法如SVM时必须要做的大量重复,繁琐的数据预处理工作。CNN的最大特点在于卷积的权值共享结构,可以大幅度减少神经网络的参数量,防止过拟合的同时又降低了神经网络模型的复杂度。

卷积神经网络的概念最早出自19世纪60年代科学家提出的感受野,根据对猫的视觉皮层的研究发现,每一个视觉神经元只会处理一小块区域的视觉图像,即感受野。20世纪80年代,日本科学家提出神经认知机的概念,可以算是卷积神经网络最初的实现原型。CNN也是首个成功地进行多层训练的网络结构,即LeCun的LeNet5.在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一个卷积操作只处理一小块图像,进行卷积变化后在传递到后面的网络,每一层卷积都会提取数据中最有效的特征。可以提取到图像最基础的特征。而后在进行组合和抽象形成更高级的特征。理论上对图像缩放,平移和旋转的不变性。卷积层的操作如下:

  1. 图像通过多个不同的卷积核的滤波,并加偏置,提取出局部特征,每个卷积核映射出一个新的2D图像。
  2. 将滤波结果输出,进行非线性激活函数处理。现在最常用的是ReLU,以前sigmoid函数比较多。
  3. 在对激活函数进行池化操作,目前常用最大池化,保留最显著的特征,提升模型畸变容忍能力。

这几个操作构成了最基本的卷积层,还有一个局部响应归一化(LRN)层,非常流行的还有Batch Normatization。

一个卷积层中可以有多个不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像中每一个像素都来自完全相同的卷积核,这就是卷积核的权值共享。作用是降低了模型的复杂度,减轻过拟合并减低计算量。图像在空间上是由组织结构的,每一个像素点在空间上和周围的像素点实际上是有紧密联系的,但是和太遥远的像素点就不一定有关系了。因此每一个神经元不需要接受全部的信息,只需要接受局部的像素点作为输入,而后将所有这些神经元收到的局部信息综合起来就可以得到全部的信息。这样我们就将全部链接改为局部连接。通过局部连接和权值共享,我们降低了模型的参数量,减少了计算量和过拟合的可能。因此,卷积的好处是,不管图像的尺寸如何,我们需要训练的权值数量只跟卷积核大小、卷积核数量有关,我们可以使用非常少的参数处理任意大小的图片。每一个卷积层提取的特征,在后面的层中都会抽象组合成更高阶的特征。而且多层抽象的卷积网络表达更强,效率更高,相比只使用一个隐含层提取全部高阶特征,反而可以节省大量参数。注意,网络的隐含节点并没有变,隐含节点的数量只与步长有关。

卷积神经网络的要点就是局部连接、权值共享和池化层中的降采样。其中,局部连接和权重共享降低了参数量,是训练复杂度大大下降,并减轻了过拟合。同时权值共享还赋予了卷积对平移的容忍性,而池化层降采样则进一步降低了输出参数量,并赋予模型对轻度形变的容忍性,提高了模型的泛化能力。

二、LeNet5简介

LeNet5诞生于1994年,是最早的深层卷积神经网络之一,推动了深度学习的发展。LeCun认为,可训练参数的卷积层是一种用少量参数在图像的多个位置上提取相似特征的有效方式,这和直接把每个像素作为多层神经网络的输入不同,像素不应该被使用在输入层,因为图像具有很强的空间相关性,而使用图像中的独立的像素直接作为输入则利用不到这些相关性。LeNet5的特性:

  1. 每个卷积层包含三个部分:卷积、池化和非线性激活函数
  2. 使用卷积提取空间特征
  3. 降采样的平均池化层
  4. 双曲正切(tanh)或S型(sigmoid)的激活函数
  5. MLP作为最后的分类器
  6. 层与层之间的稀疏连接减少计算复杂度

LeNet5的结构示例图:

它的输入图像为32\times 32的灰度值图像,后面有三个卷积层和一个全连接层和一个高斯连接层。第一个卷积层C1包含6个卷积核,卷积核尺寸为5\times 5,总共(5\times 5+ 1)=156个参数,后边是一个2\times 2的平均池化层S2来进行降采样。在之后是一个sigmoid激活函数用来非线性处理。而后是第二个卷积层C3,同样卷积核尺寸大小是5\times 5,使用了16个卷积核,对应16个特征图。注意这里的16个特征图不是全部连接到前面的6个特征图的输出的。有些只连接了其中几个特征图,这样增加了模型的多样性。下面的第二个池化层S4和第一个池化层S2一致。接下来的第三个卷积层C5有12个卷积核,卷积大小同样5\times 5,因为输入图像的大小刚好是5\times 5,因此构成了全连接,也可以算是全连接层。F6层是一个全连接层,拥有84个隐含节点,激活函数为sigmoid。最后一层有欧式径向基函数单元组成,它输出最后的分类结果。

三、TensorFlow实现简单的卷积网络

我们使用TensorFlow实现一个简单的卷积神经网络,使用的数据是MNIST。我们将构建两个卷积层加上一个全连接层的简单网络。网络构建的步骤为:

  1. 载入数据,使用的MNIST数据
  2. 定义权重和偏置初始化函数
  3. 定义卷积计算函数,池化计算函数
  4. 定义输入,输出,keep_prob占位符
  5. 第一层卷积
  6. 第二层卷积
  7. 全连接层,输出作为输入到softmax中得到结果
  8. 定义损失函数,开启优化器
  9. 开始训练,获取训练集的准确率
  10. 训练完之后,获取测试集的准确率。
# 载入数据集,创建默认的Session
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# 载入输入
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# 创建默认session
sess = tf.InteractiveSession()

# 权重初始,打破完全对称
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_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

# 定义输入和标签的占位符
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_2x2(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_2x2(h_conv2)

# 将h_poo2转化为1D,并连接全连接层。
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
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# 设置一个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 = 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, traing 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}))

结果:

这个CNN模型可以得到的准确率为99.2%,基本上可以满足对手写数字识别准确率的要求。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gyt15663668337/article/details/87965724

智能推荐

Unity 3d UI获取外部摄像头拍摄_unity 获取外接 摄像头-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏19次。Unity 3d UI获取外部摄像头拍摄3D环境下调用外部摄像头的方法网络上有很多,在此不过多说,本方法是在2D环境下利用UI来调用外部摄像头进行拍摄,总体而言,两种环境下所用到的核心方法是一样的。1、创建一个RawImagin,并命名为CameraPlay2、创建一个脚本,命名为PlaneManager,将脚本随便挂在一个物体上。脚本中的public RawImage rawImage;要记得在Inspector面板中把CameraPlay添上去using System.Collec_unity 获取外接 摄像头

CentOS下搭建SVN服务器_/root/.subversion/servers-程序员宅基地

文章浏览阅读186次。一,介绍SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。 ----百度百科二,安装SV官网下载: http://subversion.apache.or..._/root/.subversion/servers

API Demos(4) Preference,偏好设置_demos设置-程序员宅基地

文章浏览阅读357次。最近编辑于2018年4月30日一、引入Preference的方式1、Preference有两种界面展现形式:PreferenceActivity和PreferenceFragment。2、可以在PreferenceActivity或PreferenceFragment中以两种方式引入Preference:i、addPreferencesFromResource(R.xml.pref..._demos设置

漫反射及具体光源的照明_漫反射系数-程序员宅基地

文章浏览阅读4k次。光照(明暗模型)概述三维图形的真实感取决于能否成功地模拟明暗效应。明暗模型用以计算可见表面应该显示地亮度和菜色。通常涉及一个明暗模型需要考虑的主要问题是照明特性、表面特性和观察角度。照明特性 是指可见表面被照明的情况,主要有光源的数目和性质,环境光及阴影效应等。表面特性 主要是指表面对入射光线的反射、折射或透明的不同情形,还有表面的纹理及颜色等。观察角度 是指观察景物时观察者相对可见表面所在的位置。不同明暗模型的区别主要在于模拟方法。一般来说明暗模型可以分解为三个部分:漫射照明、具体光_漫反射系数

微软Win10自带代码编辑器《Code Writer》使用方法、介绍和常见问题_codewriter用来干嘛的-程序员宅基地

文章浏览阅读7.1w次,点赞2次,收藏6次。今天刚刚安装完win10发现,原来自带一款代码编辑器《Code Writer》,使用了一下发现,这个软件非常好用,界面简洁,常用的功能基本都有,感觉再也不用第三方代码编辑器了。一、Code Writer 介绍《Code Writer》是一款免费的文本和代码编辑器应用程序,具有主动语法高亮显示,可以在编辑文档时更新,并支持超过20种文件类型。选项卡式文档界面允许在打开的文档之_codewriter用来干嘛的

hbase的写和读,大合并和小合并_hbase大合并小合并区别-程序员宅基地

文章浏览阅读8.6k次。hbase写: 客户端向hbase服务器端发送写的请求时,hbase会同时进行两个动作,把记录写在WAL(write ahead log)日志文件中,每台服务器所有表都共享这个WAL文件。然后会写到memStore内存中,memStore是内存中的写入缓存区,如果memStore写满就刷新写到硬盘,生成HFile文件。当服务器宕机时memStore内存中的内容就没了,这时可以通过回放WAL日志文件_hbase大合并小合并区别

随便推点

关于win10的WiFi不见了解决的办法 个人发现的5个解决办法_windows10wifi不见了-程序员宅基地

文章浏览阅读3.2k次。关于win10的WiFi不见了在设置里设置任务栏哪些图标显示(我的是完全消失)在设备管理检查,WiFi无线网卡之类是否禁用或异常在网络设置使用[重置网络]功能(也没太大用处)在BIOS里误点设置禁用(这个很难察觉,怀疑就到BIOS重置一下设置)最后再放一个联想的无线网络修复工具pan.baidu.com/s/14zrT5Au5LOX9jFy9CpNpHg..._windows10wifi不见了

微服务学习笔记-程序员宅基地

文章浏览阅读489次。这里写目录标题前置思考与理解对什么是微服务的思考SOA与微服务的区别SOA架构特点微服务架构特点主要区别微服务的优点微服务缺点ZookeeperZookeeper节点(Znode)类型Watcher机制Zookeeper应用场景分布式锁Master选举注册中心Dubbo对通信方式的支持Dubbo集群容错模式负载均衡策略SPI扩展点Java SPIDubbo SPIDubbo集成SpringBoot的原理Nacos部署单机版部署编译包安装源码包安装Nacos高可用部署环境要求配置文件配置MySql数据库启动n_微服务学习笔记

ArcGIS(1)Excel 与 ArcGIS_join and relates-程序员宅基地

文章浏览阅读217次。将Excel数据导入到ArcGIS属性表 答: 加载excel对应的sheet ----> TOC面板右键 ----> "Join and Relates" ---->"Join"工具 ---->导出保存。 如何在ArcMap中将点图层的属性赋给面图层? 答: 用arctoolbox anaglist ----> overlay ---..._join and relates

MyBatis映射文件常用标签_mybatis用标签定义sql映射的文件叫什么(假设对应的表名叫sys-user)-程序员宅基地

文章浏览阅读2.7k次。SQL语句标签1.select<!--id表示sql语句的唯一标识,必须与接口的方法名一致才能找到--><!--parameterType传入sql语句的参数的全路径名或者别名--><!--resultMap定义出参,值为<resultMap>的id值-->&a_mybatis用标签定义sql映射的文件叫什么(假设对应的表名叫sys-user)

数据挖掘十大算法--K近邻算法_最近邻算法 案例-程序员宅基地

文章浏览阅读2.1w次,点赞11次,收藏39次。k-近邻算法是基于实例的学习方法中最基本的,先介绍基于实例学习的相关概念。一、基于实例的学习。1、已知一系列的训练样例,很多学习方法为目标函数建立起明确的一般化描述;但与此不同,基于实例的学习方法只是简单地把训练样例存储起来。从这些实例中泛化的工作被推迟到必须分类新的实例时。每当学习器遇到一个新的查询实例,它分析这个新实例与以前存储的实例的关系,并据此把一个目标函数值赋给新实例。2_最近邻算法 案例

linux c gdb 调试工具,Linux下C编程基础之:gdb调试器-程序员宅基地

文章浏览阅读85次。本文引用地址:http://www.eepw.com.cn/article/257150.htm调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好、更快地定位程序中的问题从而加快程序开发的进度,是大家都很关注的问题。就如读者熟知的Windows下的一些调试工具,如VisualStudio自带的设置断点、单步跟踪等,都受到了广大用户的赞赏。那么,在Linux下有什么很好的调试工具呢?gd..._在linux中,要使用gdb调试器调试c语言编制的程序必须首先要有goc编译器编译该

推荐文章

热门文章

相关标签