Tensorflow 学习入门(五) 卷积神经网络实现

本文介绍了卷积神经网络的基本概念,包括起源历史、特征提取、特征不变性和权值共享结构。重点讲解了CNN在图像识别中的应用,并详细阐述了卷积层、池化层的定义及参数设置。最后,通过Tensorflow实现了一个简单的卷积神经网络模型。
摘要由CSDN通过智能技术生成

基本概念

背景知识

卷积神经网络(英文Convolutional Neural Network,简称CNN(PS:和某媒体同名))。这个结构最初设计是为了解决图像识别一类的问题,不过现在CNN也被广泛应用于时间序列类信号如音频和文本数据等等。此外卷积神经网络也是首个成功进行多层训练的神经网络结构,即LeCun的LeNet5.

起源历史

卷积神经网络最早出自19世纪60年代提出的感受野(Recepive Field)。这个概念是当时科学家通过研究猫的视觉皮层细胞后发现每一个视觉神经元只会处理一小块区域的视觉图像(也就是感知野)。
而后到了20世纪80年代,日本科学家提出神经认知机(Neocognitron),这个被认作为卷积神经网络最初的实现原型。在神经认知机中包含两类神经元:一类是抽取特征的S-cells(S layer),另一类是用于抗形变的C-cells(C layer)。其中S-cell对应我们现在的卷积神经网络中的卷积核滤波操作,而C-cell则对应激活函数和最大池化(Max-Pooling)等操作。

特性

特征提取

概念

在图像识别的研究中,难度最大的就是有效地组织特征,因为图像数据和传统的数据不同无法通过总结规律来人工设定特征。以股票预测模型为例,可以定向提取交易价格波动、市盈率、市净率等金融概念(或因子),这种人工总结的方法就是特征工程。当然对着一堆灰度值或者RGB像素值是很难人为组织什么特征了。

传统方法

深度学习出现前,我们必须使用SIFT、HoG等算法提取具有良好区分性的特征而后运用SVM等机器学习算法来进行图像识别。

特征不变性

概念

这个特性应该说是图像处理所必需的,毕竟不能说吧一张照片旋转了就认不出照片里的人了。这个特性在SIFT算法中就已经实现了,具体现为提取的特征低于缩放、平移、旋转等畸变具有不变性以及泛化性。

权值共享结构

概念

在每一个卷基层中可以有多个不同的卷积核,而每一卷积核都对应一个滤波后映射出的新图像,同一个新图像中每一个像素都来自完全相同的卷积核,这就是卷积核的权值共享。换言之,每一个卷积操作所使用的的都是共享的固定权值。

作用与优势

这种处理本身就是一种低级特征逐级整合高级特征的处理,此外这种处理比起书中之前的神经网络结构还具有模型复杂度低、减轻过拟合、降低计算量的优势。(具体可以参考前面多层感知机的随机采样编码设计)
具体能优化多少杂度呢?因为我们之前用的仅仅是28x28的图片可能很难感觉到。假设我们处理的是1000x1000pixel的图片(即100w个像素),我们就需要处理的是一个维度为100w的数据,而当我们连接一个相同大小的隐含层则会产生100wx100w=一万亿个链接。光是一个全连接层(Fully connected Layers, 即我们之前所使用的普通权重模型),就会产生一万亿个权重去训练。很明显一般的硬件能力并不足以处理。经由局部连接处理后,隐含层节点不直接与像素点链接而是与局部像素节点(感受野)链接。当我们设定局部感受野大小为10x10,我们拥有100w个节点的隐含层只需要创建10x10x100w个连接就可以了。相比较普通的全连接链接数降低了一万倍。另外根据前面权值共享的定义,我们训练所需的参数也仅仅是100个。但这个好事也仅仅存在于仅有一个卷积核的情况下。卷积核是一个滤波工具(Filter,可以理解为过滤器),所得到的结果就是退一类特征的映射(例如点线)。一般来说第一层有100个卷积核已经足够,在这个情况下100(卷积核数量)x100(核内参数数量)也就是一万个参数(注意卷积核的数量增加不会导致连接数增加,运算中共用一个链接)。此外我们之前也提到过,隐含层的节点数是可以调整的,卷基层的隐含层节点数也是可以调整的,而这取决于模型的取样步长,当步长为1时,隐含层节点数与输入像素数一致,当步长为5时隐含节点数就会缩水25倍,可以说神经网络中的每一个细节的压力都得到了减轻。

具体实现

引入数据和库

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值