目录
1 神经网络
我们先来看神经网络,大致分为下面几个过程
- 有一批数据
- 网络前向传播,获取损失函数
- 之后反向传播,计算梯度(权重对损失函数的影响)
- 最后使用梯度更新参数
神经网络就是通过前面四个步骤不停的循环,这个就是训练的过程
2 卷积神经网络应用场景
卷积神经网络有下面几个应用场景
- 第一个是Classification,这个是分类任务,检测出那个图像是猫,那个图像是够
- 第二个是Retrieval,这个是检索,功能类似于以图搜图
- 第三个是Detection,这个是检测,与分类任务有关系,它包含两个过程分类和回归
- 第四个是Segmentaion,这个是分割,我们把图中的元素分离出来
目标检测常见于自动驾驶领域
我们在人工智能领域更多的是使用GPU,如果条件不允许CPU也行,GPU的运算速度要高于CPU,GPU中有一个参数叫显存,显存越大我们同时运行的模型就可以越多,一次传入的数据(batch)就可以越多
卷积神经网络可以提取特征,下面这个图是人脸检测
下面这个图是姿态检测
手写文字识别
计算机描述图像,这个单独CNN就完不成了,这个是CNN+LSTM(记忆神经网络)
画风迁移
3 卷积神经网络介绍
我们用神经网络与卷积神经网络做个对比,左侧是神经网络,右侧的卷积神经网络
我们可以看出来,左边是平面的,右边是立体的,卷积神经网络中有深度(depth)这个概念
4 卷积
卷积的作用是特征提取,我们下图这个粉色的板子是要提取的图像,蓝色的板子是卷积核,卷积核的深度一定要与提取的图像深度一致,现在它们都是3,这个3不一定是图的通道数,也可以是其他整形数值
卷积核提取图像特征后的结果我们称它为特征图像,我们一个图像可以使用多个卷积核来提取图像,下面这个图就是使用两个卷积核提取图像,得到了两个特征图像,特征图像也是我们卷积层的输出结果,这个28是在32这个图像中提取出来的大小,一会儿说一下怎么算的
我们在得到的特征图像中还可以进行卷积操作,处理方式与在原图中处理方式相同
在下面这个图中第一层我们用了6个卷积核,第二层我们用了10个卷积核
我们拿一张实际的图像看一下效果,我们每一次卷积就会使特征更加明晰,直到卷积的最后一层,我们利用特征图像进行分类(或者回归任务等)
4.1 卷积计算方式
下面是卷积的计算,我们输入图像大小为7*7*3,对应我们左侧蓝色的三张图,这这三张图分别的三个通道
我们使用了两个卷积核(Filter),分别是W0与W1,大小都为3*3*3
- 在神经网络训练的过程中卷积核中的值是与偏置(b)不断更新的
改变卷积核这个是反向传播时的事儿,前向传播时不变,我们先计算一次卷积,卷积是卷积核矩阵与相应的图像矩阵做乘法,我们首先算图中左上角的3*3矩阵
- 第一层
图像
卷积核
0*1 + 0*1 + 0*1 +0*-1 + 1*-1 + 1*0 + 0*-1 +1*1 +1*0 = 0
- 第二层
图像
卷积核
0*-1 + 0*-1 +0*1 + 0*-1 +0*1 + 1*0 + 0*-1 + 2*1 +2*0 = 2
- 第三层
图像
卷积核
0*-1 + 0*0 + 0*-1 + 0*0 + 2*0 + 2*0 + 0*-1 + 0*-1 +0*-1 = 0
现在我们得出了三个w,分别是w0=0.w1=2.w2=0,此时卷积的结果还需要加上偏置(b)
也就是说,我们现在的结果是3
计算完第一个值之后我们的窗口需要进行滑动,卷积滑动的步长是人为设置的,这个根据图像的需要应人为做出调整,我们当前卷积滑动的步长为2,步长选择的越大,我们最终得到的结果就越小,我们选择步长是越小越好,但是步长越小带来的问题是运算量加大,我们考虑到效率问题一般不让步长为1
计算的方式与上面的计算方式相同
计算完之后继续进行滑动
再往后就该换行了,这样处理,先红框,再橘黄,之后黄框,浅绿框,绿框,青框,这样第一个卷积核的卷积结果就出来了
我们注意到这里有pad的标志
我们先看下面这张图,我们下面这张图中有1和2两个像素点,像素点1的值在我们卷积的过程中只使用过一次,像素点2的值在我们卷积的过程中使用过两次,这样就使2的值对结果的影响要更大些,现在我们想减弱这种影响,所以我们引入pad(填充周边)
我们现在pad=1,所以我们在周围填上一圈0,填充的值我是不管它影响的,下面这个图蓝色背景的实际上是原本图像的值,周围一圈灰色背景的0是被填充的值
加0的原因是可以让机器不对该值进行学习,因为0乘任何数还是0
上面就是卷积运算的过程,我们可以通过下面公式算出卷积结果的大小
- 结果的高
- Ho 结果的高
- Hi 输入图像的高
- Hf 卷积核的高
- P 填充的大小(pad)
- S 步长
- 结果的宽
- Wo 结果的宽
- Wi 输入图像的宽
- Wf 卷积核的宽
- P 填充的大小(pad)
- S 步长
我们举个例子,我们的图像大小为(32,32),卷积核为(5,5),P = 0,S = 1,我们得到的卷积结果为(28,28)
这里注意一点,我们的每一层选用的卷积核的宽高需要保持一致,不能我在相同的一层,第一个卷积核是(3,3)的,第二个是(5,5)的
上面这个图的6是卷积核的个数,与其他值没有关系
4.2 权重一致
全连接:就是全都连接上了,下面这个图就是全连接
如果我们少了其中的一条线就不叫全连接了
我们做的卷积就是第二列的其中的一个神经元,我们的第二列就是卷积层
我们上面这个图的红的举例,比如说这一层的卷积核是5*5*3,那么它在反向转播的过程中有可能更改5*5*3+1个参数
因为每一层的值都得改,还有偏置(这个是最后加的那个1)
上面这个一个的,我们算出来一个神经元的参数是76个,我们这一行用了三个卷积核,那么就是76*3,228个
这个是要更改的参数,之后我们再看运算次数,比如我传入(32,32,3)大小的图像,使用(5,5,3)的10个卷积核进行卷积,那么运算次数为32*32*3*(5*5*3+1)*10=2334720次,这里我们仅仅使用了(32,32)大小的图像,一般来讲我们都会使用(500,500)这种大小的图像,这样运算次数需要再乘400倍左右,这样就会导致运算过于漫长
这里我们就使用到了卷积神经网络的权重共享,输入图像的所有像素点在同一卷积层权重一致,如果权重一致的话,我们只需要运算(5*5*3+1)*10=760次,这样就极大的提高了运算的效率
5 池化
卷积神经网络除了卷积层还有池化层
池化是特征浓缩的过程,有两种池化方式,一种是mean方式,一种是max方式,我们先说max池化
池化有一个池化核,这个只表示范围,没有参数
我们用(3,3)的池化核池化下面这个矩阵
我们得到了2这个值来代替原来的矩阵,也就是原来是一个矩阵,现在是一个数了
再说mean方式,这个就是取矩阵中的均值代替矩阵中的所有值,那我们再以这个图举例
它得到了4/9这个数
下面这个图是一个卷积神经网络,RELU是激活函数,一般来讲每次卷积之后都会加上激活函数