深度学习之卷积神经网络(六)

本文介绍了卷积神经网络(CNN)的基本结构和工作原理,包括输入层、卷积层、激励层、池化层,以及在深度学习中的应用。通过数学推导和代码实现,阐述了卷积和池化的计算过程,并讨论了TensorFlow在CNN中的使用。
摘要由CSDN通过智能技术生成

对于图片的识别来说,全连接网络无疑节点数太多了,对于一个28*28的图片,输入节点数就达到784个,更别说一个更大的图片。所以为了实现计算的简化以及性能的优化处理这就提出了卷积神经网络。
##卷积神经网络
卷积神经网络CNN的结构一般包含这几个层:

1.输入层(input):用于数据的输入
2.卷积层(convolution):使用卷积核进行特征提取和特征映射
3.激励层:由于卷积也是一种线性运算,因此需要增加非线性映射
4.池化层(Max Pooling):进行下采样,对特征图稀疏处理,减少数据运算量。
5.全连接层(Fully-connexted):通常在CNN的尾部进行重新拟合,减少特征信息的损失
6.输出层(output):用于输出结果

当然中间还可以使用一些其他的功能层:
1.归一化层(Batch Normalization):在CNN中对特征的归一化
2.切分层:对某些(图片)数据的进行分区域的单独学习
3.融合层:对独立进行特征学习的分支进行融合

image.png

CNN层次结构

image.png

输入层

在CNN的输入层中,(图片)数据输入的格式 与 全连接神经网络的输入格式(一维向量)不太一样。CNN的输入层的输入格式保留了图片本身的结构。

对于黑白的 28×28 的图片,CNN的输入是一个 28×28 的的二维神经元,如下图所示
image.png

对于RGB格式的28×28图片,CNN的输入则是一个 3×28×28 的三维神经元(RGB中的每一个颜色通道都有一个 28×28 的矩阵),如下图所示:
image.png

卷积层

假设输入的是一个 28×28 的的二维神经元,我们定义5×5 的 一个 local receptive fields(感受视野),即 隐藏层的神经元与输入层的5×5个神经元相连,这个5*5的区域就称之为Local Receptive Fields,如下图所示:
image.png

可类似看作:隐藏层中的神经元 具有一个固定大小的感受视野去感受上一层的部分特征。在全连接神经网络中,隐藏层中的神经元的感受视野足够大乃至可以看到上一层的所有特征。

而在卷积神经网络中,隐藏层中的神经元的感受视野比较小,只能看到上一次的部分特征,上一层的其他特征可以通过平移感受视野来得到同一层的其他神经元,由同一层其他神经元来看:
image.png

其计算过程用以下动画表示:
2121.gif
对于生成的隐藏层来说,其上的值用a表示,x表示输入,w表示权值:
image.png

例如,对Convolved Feature图左上角元素来说,其卷积计算方法为:
image.png

其中relu为激活函数。

激活函数

Relu函数的定义是:
hanshu
函数的图形表示:
image.png
函数的优势有很多,不在多说。

这是单步的情况下的推导,当我们把步数调到2时:
image.png
image.png
image.png
image.png
结果就是丢掉了步数为1时候的中间项。
由此我们可以总结出,通过input image和权重filter来推出隐藏层即Convolved Feature map的值的公式:
image.png

其中d表示卷积的通道数目。
用动画表示:
2121.gif

当然对于这样的式子并不满足,这时就想到用数学来优化它。

数学推导

数学中的卷积:
image.png
特点:
image.png

离散卷积

举个例子,丢骰子时加起来要等于4的概率是多少?
用卷积公式表示就是:
image.png
这只是一维的表示。下面来看二维的离散:
二维离散的卷积:
image.png
在二维的离散计算结果表示:
1111111.gif
我们可以看出数学上的卷积公式和我们使用的Convolved Feature map的值的计算的方式的差别:
数学上:
image.png
而我们使用的方式是:
a0,0x0,0+a0,1x0,1+a1,0x1,0+a1,1x1,1

所以还需要将数学上的额卷积公式进行变换,已达到我们需要的效果。
即:
首先,我们把矩阵A翻转180度,然后再交换A和B的位置(即把B放在左边而把A放在右边。卷积满足交换率,这个操作不会导致结果变化)。
表现为:
image.png
这样就直接使用向量计算来满足我们的需要了。_

用个动画展示:
1111111.gif

池化层

接下来就到了池化层。
池化层(Pooling)层主要的作用是下采样,通过去掉卷积层(Convolved Feature map)中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。
image.png
简单地讲就是去一定范围的最大值。
举个例子:
后可将 3 个 24×24 的 feature map 下采样得到 3 个 12×12 的特征矩阵:
image.png

除了Max Pooing之外,常用的还有Mean Pooling——取各样本的平均值。

经过几轮的这种卷积、池化操作,将最后取得的特征传递给一个全连接网络,这就实现了一个CNN网络的向前传播。

image.png
当然,为了训练权值,我们还需要用到向后传播。

向后传播

对于向后传播,我们使用的依旧是梯度下降的方式。
先从池化层说起。

池化层

在网络中池化层并没有涉及到学习的功能,所以只是将误差进行传递即可。

对于Max Pooing

因为Max Pooing的向前传播,就是取得局部的最大值,所以误差传递,也只是将这个误差传递给局部的最大值的位置,其他位置为0。

对于Mean Pooling

因为Mean Pooling的向前传播,就是取得局部的平均值,所以误差传递,就是将下一层的误差项的值会平均分配到上一层对应区块中的所有神经元。

卷积层

误差传递

image.png
用net表示第L行神经元的加权输入。
具体推导过程请看【零基础入门深度学习(4) - 卷积神经网络】一文,不得不说大神写的很详细。感谢大神的分享。

梯度

根据反向梯度的法则,我们需要求得w变化最小值。
image.png

推导过程同上。

也就是偏置项的梯度就是卷积层所有误差项之和。

代码实现

代码使用tensorflow工具。
简单介绍一下tensorflow:

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
TensorFlow可被用于语音识别或图像识别等多项机器学习和深度学习领域,对2011年开发的深度学习基础架构DistBelief进行了各方面的改进,它可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。TensorFlow将完全开源,任何人都可以用。

不得不说这个工具的强大。

首先需要安装anaconda。Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。下载过程自行百度,不在多说。

具体解释代码注释已经详细解释,也不多说了。
model.py(CNN模型类)

# -*- ecoding:utf-8 -*-

import tensorflow as tf

class model():
	def __init__(self):
		#创建图片节点(占位符模式)形状为784 列
		self.x_image = tf.placeholder(tf.float32, [None, 784])
		#创建期望输出值节点(占位符模式)形状为 10 列
		self.ylabel = tf.placeholder(tf.float32, [None, 10])
		#重新分配排列(-1为自动计算排列值) 图像输入为 (宽 28 高 28 通道 1  -1位图片数量)
		self.x = tf.reshape(self.x_image, [-1,28,28,1])
		#first layer
		#命名域
		with tf.name_scope('conv1'):
			#truncated_normal生成截断正态分布随机数  标准差为0.1
			#创建变量卷积层权值 filter为( 高 5 宽 5 通道数 1 卷积核个数 32)
			self.W_conv1 = tf.Variable(tf.truncated_normal([5,5,1,32], stddev=0.1))
			#创建常数偏移量
			self.b_conv1 = tf.Variable(tf.constant(0.1, shape=[32]))

			#Converlution
			#进行卷积 tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
			#strides 步长(卷积时在图像每一维的步长,这是一个一维的向量,长度4)
			#padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式
			#use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true
			self.h_conv1 = tf.nn.conv2d(self.x, self.W
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值