滑动窗口步长(stride):步长较小,提取的粒度更细,得到的特征更加丰富。一般为1。
卷积核尺寸:选择区域的大小,卷积核尺寸越小,粒度越细。一般为3*3。
边缘填充(padding):越往边界的点,能够计算的次数越少,越接近中间的点,计算次数越多,为了使得边界的点计算次数多,引入padding,弥补边界信息缺失的问题(边界提取特征不充分问题),使得网络能够更加公平的对待边界特征。padding=1,矩阵外围填充一圈0。一般补0,不会对最终结果产生影响。
卷积核个数:得到特征图的数量。
现阶段用的pooling基本都是max pooling,效果比平均池化效果更好。
每一个卷积层后都有一个RELU函数,是一个组合,2次卷积,一次池化,
带参数计算的才能算一层,卷积层要内积加上偏置常数b,带参数。relu层不带参数计算,激活层通通不带参数计算。卷积层和全连接层需要带参数计算,因为全连接层也有权重参数矩阵。
上图是一个7层神经网络。
通过不断卷积池化,卷积池化,最终得到一个特征图,特征图是一个立体的,我们怎么对其进行分类任务呢?怎么把特征图转化为5个概率的特征值呢。卷积池化步骤仅仅只是做特征提取的,当你想得到一个结果,还得靠全连接层。
全连接层的矩阵大小:【10240,5】,把全连接层的10240个特征转化为5个类别的概率值。所以最终在pooling层和FC层之间有一个拉长得到操作,将一个三维的特征图拉长成为一个特征向量。
12年夺冠的网络,问题:11*11的filter,大刀阔斧的提取特征
14年的网络,D版本是主流的版本,VGG所有的卷积大小3*3,VGG网络层数要更优秀一点的,卷积核大小比较小。经过了每个pooling之后,体积变成原来的4分之一,会损失信息,但是在下一次卷积过程中特征图数量翻倍。用特征图的个数去弥补长宽的损失。
我之前做过过一个表情分类的实验,用这个VGG和Alexnet对比,对于同样的一个任务,十分类任务上,VGG的效果基本上要比Alexnet要高15%左右。Alexnet训练8小时,VGG大概要训练3天左右。
为什么VGG要用16层网络?
在深度学习中,深度学习,深度学习,用更深的网络去提取原始数据当中的特征,是这么理解的吧,那应该是层数越多越好吧,是这样的一个事儿吗。之前碰到一个问题,VGG为什么用到16层,为什么不是17,20。因为在实验当中发现一个事儿,这个事儿挺奇怪的,就是16层的网络要比30层网络,继续堆叠就是重复的加这些卷积和池化,16层的时候比30效果好。当时就挺奇怪的,因为深度学习,从本质上理解,应该是越深越好,但是当时好像14年发现一件事,大家认为深度学习是不是到这儿就到此为止了,或者说升到20层就拉到了,这件事儿不能再往下做了。当时大家挺遗憾的,就是深度学习理论情况下,能达到一个更高的一个点,但是实际上没有达到这样一个情况。
解释:因为随着所有卷积层在增加的时候,你不一定所有的卷积层做的效果都好吧,因为它是之前的特征的基础上再去提取特征的,你再继续提取特征,你百分百敢保证就比之前好吗。所以啊,我的层数不能再多了,大概固定到这个局限了。
但是后面15年的时候,有这么个事儿。15年出了一个Resnet,
曲线图表示错误率,越低越好。第一个曲线图,56层和20层比较,20层加到56层,新增加的36层肯定有学的不好的,所以这36层把整个成绩拉下来了。
那我的想法就是:我既要把这个层数堆叠起来,还不能让那些比较差的影响效果,那怎么办呢?
图中红色划线,两条路,同等映射。
简而言之,就是能够促进网络的层留下,影响效果的丢弃。因为一旦层加入来了,就必须得有,不能丢了,所以针对这个问题,提出了resnet。意思就是说,虽然我加入了一层,但我不能丢弃,我把他的权重参数设为0,相当于我不用他。
核心思路:我们这个网络的一个出发点,就是有保底,我们网络学习之后,至少不会比原来差。
上图中的错误率曲线,第一个图是之前的网络(eg:vgg),层数越多反而错误率越多,第二个图是Resnet,层数越多错误率越低。