文章目录
- 传统神经网络结构
- 卷积神经网络结构
- 输入的区域大小
- 计算特征值
- 卷积结果计算公式
- 卷积参数共享
- 池化层
- 最大池化
- 特征图变化
- 经典网络
传统神经网络结构
传统神经网络(左边的图2D的)可以叫wx+b
、全连接层
、FC
、MLP
、多层感知机
、多个线性层堆在一起
,这些别称都指的是传统神经网络
传统神经网络输入数据是结构化的,就是一个数据几个特征,再来一个样本几个特征,一个人有身高体重,第二个人有身高体重等这些例子,都适合传统神经网络去做
下图介绍:
左图是2D的,传统神经网络,圆圈代表神经元,线段加箭头代表权重
第一层是输入层(红色),中间层是隐藏层(蓝色),右边一层是输出层(绿色);
右图是3D的,卷积神经网络
那么问题来了,传统神经网络适不适合做图像数据呢?
假设中间隐藏层像上面的左图一样,第一个隐藏层神经元数量假设有128个,第二个隐藏层神经元数量假设有256个,那么输入的图像数据假设是长300,宽300,每个点有rgb3种像素值,总共图像数据输入像素值有300x300x3为27万个像素点,那构建第一个权重矩阵(就是输入层和第一个隐藏层之间连线的权重)的w1=[27w x 128]的一个矩阵,如果我们用全连接去做,会导致输入参数太多,所以传统神经网络是有一个缺陷:不能很好地去处理我们的图像数据
那为什么卷积能做图像数据呢?
利用一种新型方式让参数量尽可能的变小
卷积神经网络结构
跟之前传统神经网络不一样,它是3D的,第一层输入的是图像数据或者说是视频数据
卷积神经网路,那么卷积做了一件什么事?
图像数据像素数据太大了,我们不要一个个的去计算,我们将输入的图像数据切分成多个区域(就好比如说问全校学生校长这个人人品怎么样,全校学生人数太多,我们分组将每个班级派一名代表来进行询问)比如说假设
原始图像是一个16x16的,那么每一块给它切分成4x4,这样切成16块,计算出这16块区域的特征值就行了,不需要再去计算原来16x16那么大的数据量了。那么我们要做一件事,就是要知道每一块区域的特征是什么,计算出这一块区域的特征得到一个值就是特征值,计算出这16块区域的特征值就行了
输入的区域大小
filter叫做滤波器,去看每一块区域具有什么样的特征,它前面的5x5x3代表一个5x5(分别是H和W)的一个区域(问25个人的意见得出1条总意见),3代表RGB(也可以叫做channel),所以5x5x3代表一块5x5区域的像素值
那么5x5可以换成3x3吗,答案是可以的,3x3是最常见的一件事,那为什么我们这么喜欢3x3呢?因为我们要将每一个区域都算一下特征,区域越多,特征越多;区域越少,特征越少,这是第一点,希望区域稍微多一点,所以用较小的卷积核去做,这样可以做的比较细致。还有一个原因,大家都采用显卡去跑模型,显卡叫做n卡或英伟达显卡,当我们用英伟达显卡的时候,我们要看看人家硬件上对什么支持性最好,速度最快,就是这种3x3的,所以后续我们的卷积即使是1x1的也要给它变成3x3的
,因为这样它的速度比较快
每个区域得到一个特征点,每个特征点组合在一起得到一张特征图
为什么右边会有两个板子(两个特征图)呢?
同样的位置,我用相同的方式还是用5x5x3的一个卷积核去计算,能算出来另外一个特征值,但是针对输入的这一块的x是不变的 ,w是权重值,蓝色有一组权重值,绿色有一组权重值,这两种权重值是不一样的
相同的输入在两组不同的权重值上得到两种不同的特征值
,所以说右边有两个板子,是因为最同一种区域提取得到了两种不同的特征
计算特征值
卷积层涉及的参数:
这里假设每个区域取两种卷积核
卷积核尺寸
:下图是3x3的卷积核大小
padding边缘填充
:由于卷积计算和分区域,而导致边界区域没有计算到,进行边界填充0值,这样原来的边界就变成中间了,参与运算就多了,加一圈(为什么填充0,因为0乘任何数都得0,只做占位不影响结果)
卷积核个数
:卷积核个数是越多越好还是越少越好,相对来说理论上是希望越多越好,一般来说256个,512个,1024个(例如下图的W0是第一个卷积核,W1是第二个卷积核),但是同一层当中,大小规格要一样(不能W0是3x3而W1是5x5的,不能这样)
内积(每个颜色通道计算出来的卷积值)+偏置=算出特征值Output Volume
偏置b0,b1是随机数
内积
:每个颜色的通道值(左边蓝色方框圈起来的九个)乘以对应的卷积核的值(右边红色方框圈起来的九个)然后再相加(例如第一个R通道的第一个方框计算:0x1+0x1+0x1+0x(-1)+1x(-1)+1x0+0x(-1)+1x1+1x0=0)3个颜色通道的内积和+偏置b0=算出的特征值(例如第一块区域的第一种卷积W0计算出来的:0+2+0+1=3)
滑动窗口步长
:例如下图的每计算完一块特征区域,就向右移动2个单元格,但是这只是在这个例子中,不一定所有的都是移动2个单元格,但是单元格移动是越小越好,越小的话特征值是越丰富的,步长stride=1,尽量等于1,最小为1
假设我知道某个区域很重要,能让卷积卷多次吗?–>不能,人为不能让同块区域卷积卷多次
只做一次卷积就可以了吗?如何让卷积做的个数多一些,能让特征更丰富,特征提取的更多一些?------>做多次(多层)卷积
第一次卷积–>第二次卷积–>第三次卷积,也就是说卷积是分层的做的
就好比如我是浅层,只需要考虑我自己,镇长是中层,需要考虑整个镇上的人,市长是深层,需要考虑所有镇市的人,所以说越深层考虑的东西越多越全局(理论上),这也就是我们为什么叫做深度学习
卷积当中一定是越深层的网络越好吗?不一定,越深层的网络,比如说物体检测,就适合大模型的,可能检测不到小目标(比如市长考虑不到我晚上吃什么吃的开不开心,就不会考虑小目标的这些东西)所以不同网络结构不同设计要选合适的就行
卷积结果计算公式
H1:输入的特征图大小
H2:输出的特征图大小
FH:卷积核大小
2P:2倍的padding边界填充
为什么要加上2倍的padding呢?上下左右长宽各2倍
S:stride步长,步长(向右滑动的距离)越大特征越小,步长越小特征越多
例如:(32-5+2x1)/1+1=32
卷积完之后长宽可以不变(大部分当中是这样的)
为什么要乘以10?因为有10个特征图(10个filter)
为什么要加1?因为有两块板子(两种特征值)
卷积参数共享
权重参数共享
为什么传统的神经网络做的不好?因为传统的神经网络结构当中参数太多,训练也难,计算也慢,也没法实时,而在卷积网络结构当中,各个位置上的权重都是相同的,所以我们叫做权重参数共享
10个卷积核得到10个特征图,10个特征图每个进行微调,需要10个偏置(偏置就是对特征图做微调的
)
上面是32x32x3的输入图像,那换成256x256x3的输入图像还是用上面的10个5x5x3的filter来进行卷积,此时参数会不会变多呢?不会,权重参数和你的输入图像大小没有关系,只要卷积核不变权重参数就是不变的共享的
池化层
什么叫做池化?池化过程是将输入图像平均划分成若干个矩形区域
,用来做筛选的(一群人中将好人筛选出来),筛选最好的特征,不好的特征给它不要,自己定池化的大小,4个里面选最好的还是8个里面选最好的,这种自己去定,反正池化的目标就是,把好的留下来,不好的给它扔出去,对卷积神经网络进行池化处理可以降低卷积操作输出特征图的大小。池化层缩小了卷积神经网络的规模,能够使卷积神经网络训练的权重数量得到明显下降。
卷积完得出特征值最大的
64怎么来的?有64种特征(假设一个人有身高体重年龄学历等等有64种特征全取)
H变成原来的一半,224变成112;W变成原来的一半,224变成112,特征的位置变少了,速度就会变快,做了一个浓缩,下一层卷积的参数量变少了,模型训练起来相对容易一些,所以池化这个东西还是要去用的
池化我们经常也会叫它下采样
,什么叫做下采样呢?输入的H和W变成了原来的二分之一,就叫做下采样
那能不能H和W都变成原来的四分之一呢,是可以的,但是这样做是不好的,因为一次筛选的太多了,会少掉很多信息(就好比如说我们竞赛,是32强决胜出16强再决胜出8强再4强…,如果一下子从32强决胜出4强就会很不好了)要一步步去做,一次就各减少二分之一
最大池化
最大池化是将池化区域的像素点取最大值
(像第一块红色区域的最大池化就是6),这种方式得到的特征图对纹理特征信息更加敏感;
平均池化则是对池化区域内的图像取平均值
(比如下面第一块区域取平均值就是(1+1+5+6)/4 ),这种方式得到的特征信息对背景信息更加敏感,但是我们一般不用平均池化,而用最大池化
平均池化一般用在:要获得一个全局向量;要在输出层之前;想要用向量去算其他什么东西;要整合向量;要做分类
全连接层是帮我们做结果的一个输出的,预测值的,但是不太适合提特征
卷积神经网络有七层网络,带权重参数都算一层,不用管为什么,大家公认的
池化当中没有权重参数,只是筛选需要的数值
输入数据要做一个标准化操作,让其均衡化一些,数据要符合一些规律和分布,然后让模型去学这个分布这个规律,那卷积层会不会把这些规律这些分布给破坏掉呢?有可能
这边有一个参数BN,这个参数的作用就是将一些训练的特别偏离特征的值给微调一些,让它尽可能的和我们要的数据靠拢,卷积+BN也可以合并成卷积
卷积当中的参数一开始是哪来的?一开始是随机初始化的
特征图变化
转换拉长成向量,向量做全连接然后输出
经典网络
了解一下
2012年当年还是树模型的时代,是SVM的年代,2012年Alexnet利用CNN夺得了图像分类比赛的一个冠军,所以说2012年是卷积神经网络崛起的一年
层数不是越多越好,例如如下图的56层的容错率比20层的还要高