02 神经网络到卷积神经网络的转变

卷积核CNN介绍

1. 提出背景

既然我们已经有了神经网络这么优秀的模型,为什么又要引入卷积核这个概念,卷积又是在干什么呢?它为什么和神经网络有着密不可分的联系。

众所周知,深度学习的一个热门领域为视觉处理,即对于图像数据的处理。我们随机在网上找到一张小猫图片cat.jpg,利用python工具,我们来查看该图片的一些信息。

import numpy as np
import torch
import cv2 as cv
from torchvision import transforms
cat = cv.imread('./cat.jpg')
cat_data = transforms.ToTensor()(cat)
print(cat_data.size())

输出:torch.Size([3, 800, 800])
含义:800x800的像素,总共有三个通道即(rgb)

通过以上的输出可以看出,一张图片的数据量可以达到3*800*800=1920000,数据量达到了百万级别。而这仅仅是输入的数据量,还没有考虑中间神经网络的层数和隐藏神经元,我们大致设置一个神经网络如下:

在这里插入图片描述

我们只设置了一层隐藏层,且隐藏层只有5个神经元,我们来计算一下这种情况需要学习的参数量:

输入 → \rightarrow 隐藏层:1920000*5 = 9600000(960万)

隐藏层 → \rightarrow 输出:5*1 = 5

总共需要的参数量达到960万,但是,如果仔细想想,面对复杂问题时,我们需要的隐藏层和神经元绝对不止这小,网络层数可以达到10层以上,隐藏层的神经元个数也会极大增加,到那时,我们的参数量甚至达到上亿的规模。

一张图片要经过一个上亿的参数神经网络,我们要训练的图片可不只是一张,按照这样的模型,就算可以表现的很好,但我们可能需要使用超级计算机才能完成一个简单的猫狗识别问题。

所以,通过神经网络来处理图片数据,最大的问题就是数据量的爆炸,这也是为什么神经网络在刚刚提出时风靡一时,但是随着人们不断叠加网络层数,反而无法获得想要的结果而陷入了停滞----此时,CNN登场来解决这个问题

2. CNN的思想

首先,我们给出课本上关于CNN特点的定义:

  • 权重(参数)共享
  • 下采样
  • 局部感知

接下来,我们一一解释这一概念:

卷积

首先,我们来看看卷积究竟是怎么回事,之后再解释这么设置的目的:

在这里插入图片描述

在上图中,我们将左边的5x5矩阵看作我们输入图片(r,g,b)中的其中一个通道,左边图片上的
[ 0 1 2 2 2 0 0 1 2 ] \begin{bmatrix} 0 & 1 & 2 \\ 2 & 2 & 0 \\ 0 & 1 & 2 \end{bmatrix} 020121202

是我们的卷积核,它不停的移动,每移动到一个新的位置,就与对应像素进行点积(对应位置乘积,不是矩阵乘法),之后求和。eg: 对于图片的左上角的3x3像素
[ 3 3 2 0 0 1 3 1 2 ] \left [ \begin{matrix} 3 & 3 & 2 \\ 0 & 0 & 1 \\ 3 & 1 & 2 \end{matrix} \right] 303301212 我们使用卷积核进行点乘 [ 3 3 2 0 0 1 3 1 2 ] [ 0 1 2 2 2 0 0 1 2 ] = 12 \left [ \begin{matrix} 3 & 3 & 2 \\ 0 & 0 & 1 \\ 3 & 1 & 2 \end{matrix} \right] \left[ \begin{matrix} 0 & 1 & 2 \\ 2 & 2 & 0 \\ 0 & 1 & 2 \end{matrix} \right] = 12 303301212 020121202 =12,可以看出,正好就是我们左边绿色图所对应的第一个位置。

到这里,你可能已经有点感觉,卷积核和对应的像素点乘,不就类似于神经元中的输入像素 x 1 x_1 x1与隐藏神经元的连接参数 w w w相乘吗,右边的12输出不就相当于以下过程吗:
在这里插入图片描述

卷积核其实就是神经网络中对应的神经元的连接参数,但不同的是在进行连接每一个神经元时,我们不再采用全连接,而是指使用卷积核3x3=9大小的连接参数生成一个隐层神经元,我们可以将卷积和神经网络各层进行对应如下:

在这里插入图片描述

(1)权重共享

有了以上对卷积核和卷积的直观认识,我们来看权重共享(参数共享)

通过上面一个卷积核对一个通道进行卷积,生成右边绿色图片我们可以发现一个特点,在对整张图片进行卷积时,卷积核是不变的,右边绿色图片的每一个输出,都是同一个卷积核在不同位置点乘生成的结果。即一个通道,共享了一个卷积核的参数,我们在学习时,只需要学习对应卷积核的9个参数即可。

因此,我们在训练时,只需要考虑卷积核的大小核个数,任意大小图片数据,都不会改变我们需要学习的卷积核参数,共享了参数,从而大大减小了参数量。

参数量的减小,可以使得我们设置更大更深的网络,学习到更多图像数据的信息。

(2)下采样

池化层的本质是一个下采样,因为数据经过卷积之后维度越来越高,而且特征图没有多大改变,在连续多个卷积之后,会产生一个很大的参数量,不仅会大大的增加网络训练的难度,还容易造成过拟合的现象,所以通常会在卷积层之后放一个池化层对数据进行压缩,降低维度,减少参数量。具体操作是将一个像素点与它周围的数据点进行聚合统计,缩减特征图的尺寸,然后对其相邻的区域取均值或最大值,进一步减少参数量。通过池化操作,提取的特征对光线等因素的适应能力也有所增强。池化操作能够对上一层的特征图进行融合,因为相邻区域的参数具有较强的关联性,还能够防止发生过拟合现象。常用的池化操作主要有两种:最大池化(max-pooling) 和平均池化(mean-pooling)。

以max pooling为例,我们指定池化核的大小(2x2),通过这种方式,我们又可以进一步缩小特征图大小,从而减小参数量。

在这里插入图片描述

接下来,我们介绍最大池化核平均池化的更多作用:

最大池化:因为它会返回范围内的最大值,所以他会起到信号增强的作用,在网络的前几层使用max pooling可以起到剔除不重要信息的作用(因为只有信号强的像素点被选中)

平均池化:他会返回一个范围内的平均值,获取全局上下文信息,综合考虑特征图的信息

(3)局部感知

每个卷积核可以识别不同的模式

局部感知,就是每个卷积核只能感知到局部的信息,每次卷积一次也只会用到3x3大小的像素点,这里的局部感知是与神经网络对比的,因为使用全连接的神经网络,会在生成每个隐层神经元时使用全部的像素点(即全局信息)。

局部感知的一个优点就是可以通过使用每个卷积核,只关注一个特定模式的提取,如猫的识别中,一个3x3的卷积核可以识别到猫的耳朵,我们再设置其他的卷积核来提取猫尾巴,猫爪等信息。

3. CNN终极

通过上述的学习,我们思考这样的一个问题,如果我们每层只使用一个卷积核,是否可行呢?

显然,一个卷积核的在学习后固定,一个固定的参数它大概率只能学习到特定的模式,如猫的识别中,一个3x3的卷积核可以识别到猫的耳朵,但是猫的其他部位呢?

因此,我们在一层的卷积中,可以设置多个卷积核完成不同的模式识别任务(识别猫耳朵的卷积核,识别猫尾巴的卷积核以及识别猫爪的卷积核等)

当我们真正在使用CNN时,又会遇到以下问题:

padding 是什么,

卷积核的通道怎么确定呢

卷积核的数量怎么确定呢

(1) padding

引入背景:

通过卷积的过程,我们会发现,在卷积核移动时,图像内部的像素点会在卷积核的移动过程中被覆盖到多次,但是边缘的信息在移动中只会被覆盖到一次,这就带来一个问题:对于外部信息的关注度小于内部信息,当图像发生移位,即猫不位于图像正中时,CNN对于位置敏感的这一缺点就会暴露。

方法:

在图像周围填充一圈0

作用:

使得卷积的时候原图像的边缘信息可以被卷积核多次覆盖

解决卷积核位置敏感性的特点,使其具有平移不变性

(2) 卷积核的通道数

在我们上面的讲解中,默认图像只有一个通道,因此,卷积核也只使用了一个通道。

如果我们使用rgb三通道图像,卷积核的通道应该如何设置,每个卷积核处理后的输出又是什么呢?

卷积核的通道设置,我们要根据输入特征图的通道进行设置,即输入为(channel, w, h)大小的特征图,那么我们的卷积核就要设置为(channel, 3, 3)大小,只有这样,我们才可以对整个特征图进行对应。

一个(channel, w ,h )的特征图经给一个(channel , 3, 3)卷积后,输出的特征图通道为多大呢?

是1,大家看到这里可能会有不理解,1通道的卷积核卷积1通道的特征图,得到1通道的输出;channle个卷积核卷积channel个通道的特征图,输出为什么不为channle个通道呢?

这是因为我们会把卷积得到的channel个特征图进行相加,因此,无论通道为多大,经过一个卷积核的卷积,生成的特征图都只会是1通道大小。

(3) 卷积核的数量

有的同学会说,不对吧,为什么在一些资料中我们会发现输出的特征图不只一个通道呢

在这里插入图片描述

这是因为,我们在每一层网络中,可以设置多个卷积核,比如n个(channel, 3, 3)的卷积核,它的输出就是会变为n个1通道特征图的拼接,即n个通道。

综合:

下面这张图片,是很多初学者的噩梦,经过上面的讲解后,希望你可以更好理解这副图:

图像的大小:(7,7,3),其中77是图像在进行了padding=1的填充后形成的图像大小,3是通道数,即最左侧的三个图像

卷积核的大小:(3,3,3),前两个维度为(3,3),是卷积核的大小,第三个维度是3通道,他与我们的图像大小维度统一。我们可以看出,3个通道的卷积核不同,因为每个通道代表不同的颜色rgb,通过不同的卷积核发现不同的信息。

卷积核的个数: 通过上面的标识可以看出,本实验设置了两个(3,3,3)的卷积核Filter W0核Filter W1,因此最后的输出是两个特征图(即左边的绿色个数)

我们来总结一下各个数量的对应关系:

**卷积核的通道与输入通道队对应:**7x7x3的输入 ----> 卷积核的通道要与输入对应即3通道

**卷积核的大小决定输出特征图的大小:**卷积核的大小为3x3 ,通过计算,经过一轮卷积后7x7变为3x3大小

在这里插入图片描述

**卷积核的个数决定了输入特征图的通道:**设置了两个(3,3,3)的卷积,所以产生了两个通道的特征图,即(3,3,2)

下面我们举例来计算其中的一个特征输出,即第一个绿色输出的第一个元素6的计算(它通过第一个卷积核Filter W0卷积得来):

在这里插入图片描述

通过卷积核的3通道分别于输入的三个通道卷积,我们可以得到下的结果(注意最后还有一个偏置b=1的引入):

在这里插入图片描述

通过上述的讲解,我们的卷积核CNN知识算的上基本圆满。所以当别人说CNN网络时,不要认为它是什么特殊的网络架构,只要是用到了CNN卷积核,我们都可以算作是CNN卷积神经网络。

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值