面试基本知识
激活函数https://zhuanlan.zhihu.com/p/70810466
卷积后的输出层尺寸计算公式:
o
u
t
p
u
t
=
(
W
−
F
+
2
p
)
/
S
+
1
output = (W-F+2p)/S+1
output=(W−F+2p)/S+1
·输入图片大小W*W
·Filter大小F*F
·步长S
·Padding的像素数P
AlexNet:
1)首次使用GPU加速
2)使用ReLU激活函数
3)使用LRN局部响应归一化
4)使用Dropout,减少过拟合
Dropout是如何工作的?
以p=0.5为例子,训练的时候使得其中的50%的神经元不起作用,梯度也只流经剩余的50%的神经元;测试的时候所有的神经元都起作用,并且所有的神经元的权重都乘以p以保证稳定性。
VGG:
创新点:通过堆叠多个小卷积核来代替大尺度卷积核,可以减少训练参数,同时保证相同的感受野。
两个3 * 3的卷积核相当于一个5 * 5的卷积核,三个3 * 3的卷积核相当于一个7 * 7的卷积核
GoogLeNet:
1)inception结构(融合不同尺度的特征信息)
2)使用1 * 1卷积核进行降维以及映射处理
3)添加两个辅助分类器帮助训练
4)丢弃全连接层,使用平均池化层,减少了模型参数
inception结构:
传统的CNN,如AlexNet、VggNet都是串联结构;GooLeNet采用了一种并联结构:将特征矩阵同时输入到多个分支处理,将输出按深度进行拼接,得到最终输出。
作用:增加网络深度和宽度的同时减少参数
注意:各分支输出的深度得保持一致,才能够进行拼接
ResNet:
1)提出Residual结构(残差结构)
2)使用Batch Normalization加速训练(丢弃Dropout)
为什么要进行BN呢?
(1)在深度神经网络训练的过程中,通常以输入网络的每一个mini-batch进行训练,这样每个batch具有不同的分布,使模型训练起来特别困难。
(2)Internal Covariate Shift (ICS) 问题:在训练的过程中,激活函数会改变各层数据的分布,随着网络的加深,这种改变(差异)会越来越大,使模型训练起来特别困难,收敛速度很慢,会出现梯度消失的问题。
BN的主要思想:针对每个神经元,使数据在进入激活函数之前,沿着通道计算每个batch的均值、方差,‘强迫’数据保持均值为0,方差为1的正态分布,避免发生梯度消失。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 … 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。求通道 1 的方差也是同理。对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。
BN的使用位置:全连接层或卷积操作之后,激活函数之前。
BN算法过程:
- 沿着通道计算每个batch的均值 μ
- 沿着通道计算每个batch的方差
- 做归一化
- 加入缩放和平移变量γ和β
其中E是一个很小的正值,比如 10^-8。加入缩放和平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。
BN的作用:
(1)允许较大的学习率;
(2)减弱对初始化的强依赖性
(3)保持隐藏层中数值的均值、方差不变,让数值更稳定,为后面网络提供坚实的基础;
(4)有轻微的正则化作用(相当于给隐藏层加入噪声,类似Dropout)
BN存在的问题:
(1)每次是在一个batch上计算均值、方差,如果batch size太小,则计算的均值、方差不足以代表整个数据分布。
(2)batch size太大:会超过内存容量;需要跑更多的epoch,导致总训练时间变长;会直接固定梯度下降的方向,导致很难更新。
R-CNN:
1)使用Selective Search方法,对一张图像生成1000~2000个候选区域
2)对每一个候选区域,使用深度网络提取特征
3)特征送入每一类的SVM分类器,判断是否属于该类
4)使用回归器精细修正候选框的位置
Fast R-CNN:
1)使用Selective Search方法,对一张图像生成1000~2000个候选区域
2)将图像输入到网络得到特征图,并将SS算法生成的候选框投影到特征图上获取得到相应的特征矩阵
3)每个特征矩阵通过ROI pooling层缩放到7 * 7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
Faster R-CNN:
1)将图像输入到网络得到相应的特征图
2)使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
3)将每个特征矩阵通过ROI pooling层缩放到7 * 7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
Non-Maximum-Suppression(非极大值抑制):
当两个box空间位置非常接近,就以score更高的那个作为基准,看IOU即重合度如何,如果与其重合度超过阈值,就抑制score更小的box,因为没有必要输出两个接近的box,只保留score大的就可以了。
应用:在目标检测过程中,(Faster-RCNN / YOLOv2)采用NMS来消除冗余的boxes,最终只留下最好的较少的box。
过程:
1 将各组box按照score降序排列
2 从score最大值开始,置为当前box,保存idex,然后依次遍历后面的box,计算与当前box的IOU值,若大于阈值,则抑制,不会输出
3 完成一轮遍历后,继续选择下一个非抑制的box作为当前box,重复步骤2
4 返回没有被抑制的index即符合条件的box
代码:
写计算box iou的程序代码。
# a, b is in (minx, miny, maxx, maxy)
# 核心原理是先检查左上角和右下角边界是否导致iou为0,然后再进行计算。应该很熟练的掌握,不能出错。
def box_iou(a, b):
left = max(a[0], b[0])
top = max(a[1], b[1])
right = min(a[2], b[2])
bottom = min(a[3], b[3])
if left >= right or top >= bottom: return 0
else:
inter = (right-left)*(bottom-top)
calc_area = lambda x: (x[2]-x[0])*(x[3]-x[1])
a_area = calc_area(a)
b_area = calc_area(b)
iou = inter / float(a_area+b_area-inter)
return iou
a = [1, 1, 5, 5]
b = [4, 4, 7, 7]
print (box_iou(a, b))