前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【阿星的学习笔记(2)】使用Tensorflow实作卷积神经网络(CNN)

【阿星的学习笔记(2)】使用Tensorflow实作卷积神经网络(CNN)

作者头像
GPUS Lady
发布2018-04-02 14:08:02
6490
发布2018-04-02 14:08:02
举报
文章被收录于专栏:GPUS开发者GPUS开发者

Lady之前已经向各位介绍一个朋友阿星(Ashing)以及他的机器学习读书笔记!

阿星也是我们手撕深度学习算法微信群的热心群友!接下来,Lady我也会陆续分享这个微信群里大家讨论的话题。

卷积神经网络(Convolutional neural network,CNN),是一多层的神经网络架构,是以类神经网络实现的深度学习,在许多实际应用上取得优异的成绩,尤其在影像对象识别的领域上表现优异。

传统的多层感知器(Multilayer Perceptron,MLP)可以成功的用来做影像识别,如之前所介绍,可以用来做MNIST 手写数字辨识,但是由于多层感知器(Multilayer Perceptron,MLP)在神经元之间采用全连接的方式(Full connectivity),当使用在较高分辨率或是较高维度的影像或数据时,便容易发生维度灾难而造成过度适合(Overfitting)

例如,考虑MNIST的手写输入数据为28x28分辨率,考虑神经元全连接的方式 (Full connectivity),连接到第一个隐藏层神经元便需要28x28=784个权重(Weight)。如果考虑一RGB三信道色彩图像输入,如CIFAR-10为32x32x3的图像分辨率,连接到第一个隐藏层神经元便需32x32x3=3072个权重(Weight)。那么如果是200x200x3的图像分辨率,便需要120000个权重,而这只是连接到隐含层的第一个神经元而已,如果隐含层有多个神经元,那么连接权重的数量必然再倍数增加。

像这样子的网络架构,没有考虑到原始影像数据各像素(pixel)之间的远近,或是密集关系,只是一昧的将全部像素(pixel)当各个输入的特征值,连接到隐含层神经元,造成爆量增加的权重不仅是一种浪费,因为实际上不须这么多的权重,效果不仅没增加,只是增加了运算的负荷,而且很可能会造成过度适合(Overfitting)。而卷积神经网络(Convolutional neural network,CNN)被提出来后,可以有效的解决此一问题。

事实上卷积神经网络(Convolutional neural network,CNN)设计的目标就是用来处理以多数组型态表达的数据,如以RGB三信道表达的彩色图片。CNN和普通神经网络之间的一个实质差别在于,CNN是对原始图像直接做操作,而传统神经网络是人为的先对影像提取特征(例如灰阶化,二值化)才做操作。

CNN有三个主要的特点。

1.感知区域(Receptive field):可采用3维的图像数据(width,height,depth)与神经元连接方式,实际上也可以直接采用2维的图像数据,但隐含层内部的神经元只与原本图像的某一小块区域做链接。该区块我们称之为感知区域(Receptive field)

2.局部连结采样(Local connectivity):根据上述感知区域(Receptive field)的概念,CNN使用过滤器(filters)增强与该局部图形空间的相关性,然后堆栈许多这样子的层,可以达到非线性滤波的功能,且扩及全局,也就是允许网络架构从原图小区块的较好的特征值代表性,组合后变成大区块的特征值代表性。

3.共享权重(Shared weights):使用的过滤器(filters)是可以重复使用的,当在原始图像产生一特征图(Feature Map)时,其权重向量(weights vector)及偏误(bias)是共享的。这样可以确保 在该卷积层所使用的神经元会侦测相同的特征。并且即使图像位置或是有旋转的状态,仍然可以被侦测。

这三个特点使得CNN在图像辨识上有更好的效果。在实际操作上的三个基础分别是: 区域感知域(Local Receptive field),卷积(Convolutional ),池化(pooling)。

我们可以从下面图形化的实际操作来理解它的意思。

卷积层(Convolutional Layer )

下图1,2说明在卷积层的运作方式,假设原始影像为一32x32x3维度,我们可以任意给定一卷积核(filter),其卷积核的值即为权重(weight)。其大小可以为5x5x3,3为与原影像有一样的深度(RGB三信道),如果输入影像为一灰阶单信道色彩,那么卷积核大小5x5即可。卷积核大小3x3或5x5或7x7...等等可以自定义,通常为奇数维度。

接着与原图像相同的小区域计算点积,得到的一个值便是在新的feature Map的一个新元素值。卷积核会在原始的图像或者前一个图像(Map)按照Stride(步伐)的设定移动,直到扫描完全部图像区域,这样便会产生一个新的Feature Map。便是下图图3~图5所示,在这个步骤中产生单一新feature Map所使用的权重W,也就是卷积核是共享的,并且共享同一个偏误(bias),通常初始预设偏误(bias)可以为0。这样确保这一新的feature map侦测的是该原始图像同一特征。

这边要注意,上图3~5只是单纯说明当卷积操作时如何作点积取和,实际在CNN神经网络运算里,产生的新Feature Map里的单一元素便是连接到一个神经元做运算,故其运算应当如下公式,这就是一般神经网络向前传递的公式形式:

W便是kxk维卷积核,Xij为前一个图像的元素值,i,j为其index。

b为偏误(bias) 预设可以为0。

S()为一激励函数可以为Sgmoid或ReLu或其他函数,如下图7。

y为输出的值,便是产生一新feature Map上其中的一个元素值。

也就是说卷积层的每一个feature map是不同的卷积核在前一层图像(map)上作卷积并将对应元素累加后加一个偏误(bias),再使用激励函数如sigmod得到的。

另外要注意的是,卷积层要产生几个新的feature map个数是在网络架构初始化指定的,而要产生几个新的feature Map,便要使用相同数量的不同卷积核。例如下图8及图9所示,使用6个不同的卷积核便可产生6个feature Map。

而feature map的大小是由卷积核和上一层输入图像的大小决定的,假设上一层的图像大小是n*n、卷积核的大小是k*k,则该层的feature map大小是(n-k+1)*(n-k+1),比如上图3~5,从7*7的图像大小,产生3x3 feature map (3=7-5+1),当然这是在预设stride=1的情状下。

阅读原文

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档