面试考的都是深度学习很基本的知识点,但是都理解的不透彻,借着这个机会查漏补缺。
1. 有哪些数据增强的方法
空间几何变换:裁剪,翻转,旋转,缩放,仿射变换,视觉变换(四点透视变换)
像素颜色变换:噪声,模糊,HSV对比度变换,RGB颜色扰动,随机擦除,超像素法,转换,边界检测,锐化与浮雕
多样本合成类:
SMOTE(Synthetic Minority Over-sampling Technique),通过人工合成新样本来处理样本不平衡问题,提升分类器性能。
SamplePairing方法,从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。
mixup是基于邻域风险最小化(VRM)原则的数据增强方法,使用线性插值得到新样本数据。
总结:mixup、SMOTE、SamplePairing三者思路上有相同之处,都是试图将离散样本点连续化来拟合真实样本分布,但所增加的样本点在特征空间中仍位于已知小样本点所围成的区域内。
2. 如何解决样本不平衡问题
数据层面:数据重采样和产生新数据型(SMOTE)。
模型层面:
代价敏感学习,为少数类样本赋予更大的权值
组合集成方法,将多数类数据随机分成少数类数据的量N份,每一份与全部的少数类数据一起训练成为一个分类器,最后再组合。
评价指标:F值,G-Mean,ROC曲线和AUC
3. 还有什么方式可以解决梯度消失问题(BN,LSTM)
BN层解决梯度消失:随着网络加深,数据整体分布逐渐往激活函数的取值区间的上下限两端靠近(sigmoid的饱和区域),导致后向传播时低层神经网络的梯度消失。而BN把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非饱和区。
4. Dropout的原理和倒置随机失活
让某个神经元以概率p,停止工作。比如dropout比率选择0.4,那么这一层神经元经过drop后,1000个神经元中会有大约400个的值被置为0。
经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对余下的神经元输出进行rescale(扩大倍数),也就是乘以1/(1-p)
。(如果你在训练的时候,经过置0后,没有进行rescale,那么你在测试的时候,就需要对权重进行rescale。)
在训练的时候直接将dropout后留下的权重扩大 1/1-p 倍,称为inverted dropout,该操作可以使结果的scale保持不变,而在预测的时候也不用做额外的操作了,更方便一些。
5. Relu永久死亡神经单元
它在输入为负的区段导数恒为零,而使得它对异常值特别敏感。这种异常值会产生很大的梯度,使得参数更新之后导致 ReLU 永久关闭,而杀死神经元。
6. 用softmax做分类函数
假如现在要对1w甚至10w类做分类会出现什么问题?-过拟合,怎么解决,面试官让自己想(不能使用softmax,使用三元组损失)
假如不用交叉熵函数,改用MSE会有什么问题呢?MSE不会收敛。第一、交叉熵函数计算loss是一个凸优化问题,MSE计算loss输出曲线是波动的,有很多局部极值点,变成一个非凸优化问题,不好收敛;第二、sigmod激活函数和mse一起使用时会出现梯度消失
7. 计算卷积/反卷积的感受野
7.1 感受野计算
*最后一层(卷积层或池化层)输出特征图感受野的大小等于卷积核的大小。
*第i层卷积层的感受野
7.2 空洞卷积感受野
stride=1
时,相邻的神经元其感受野重合度很高,如果卷积核连续的遍历,就有了冗余。相比之下,空洞卷积,每隔几个选一个参与卷积运算,保证了各个感受野交集的最小化。
空洞卷积核的dialate
属性定义为卷积核的元素间距,如dialate=2
是每隔一个像素位置应用一个卷积元素,dialate=1
就是普通的无孔卷积。
对于stride=k,dialate=d
的空洞卷积,计算等价卷积作用大小,代入感受野计算公式。
空洞卷积的优点在于不增加参数的情况下加大感受野。
7. 3 反卷积感受野
网上没有找到详细的资料。这个有点作用https://blog.csdn.net/jiachen0212/article/details/78548667。把反卷积看成stride<1的卷积。
8. 分类损失函数
9. 分割模型
9.1 DeepLab系列
- DeepLab V1: AFully Connected CRFs
-
Deeplab V2: astrous spatial pyramid pooling
v1提出了空洞卷积和感受野的计算方法,并且用CRFs进行领域锐化。
v2就是加了ASPP 空洞卷积的空间金字塔。不同dilation的卷积并行操作,然后归一尺寸后求和,仿照R-CNN,效果很好。
9.2 FPN
FPN提出了一种可有效在单一图片视图下生成对其的多维度特征表达的方法,从而实现对不同尺寸目标的检测。
9.3 DenseNet
DenseNet则是通过特征图重用的方式来探索网络的潜能。让网络的每一层的输入变成所有前面层的叠加(concat),然后把它的特征图传递给所有接下来的网络层。传统的CNN如果有L层则有L个连接,而DenseNet如果有L层,则有1/2 L(L+1)个连接。
10. CRFs
层层上采样部分,直接用bilinear interpolation(双线性插值)恢复到原状,(因为deconv逆置卷积没什么卵用),然后进行CRFs通过邻域之间的锐化,得到最终分割结果。
11. Kmeans的改进
- Kmeans++:对Kmeans聚类中心的随机初始化做改进。基于已有的n个聚类中心选择第n+1个聚类中心。使的距离前n个中心更远的点有更高概率成为新的中心。
- ISODATA:聚类中心数目k改进为非固定。当属于某个类别的样本数过少时把这个类别去除,当属于某个类别的样本数过多、分散程度较大时把这个类别分为两个子类别。
ISODATA有分裂与合并两个操作。当某一类所属样本数目过多或者样本分散程度较大时,进行分裂操作。当两个类中心距离接近时,进行合并操作。
12. Python中深拷贝,浅拷贝和赋值
赋值:建立对象的引用,而不改变对象本身(存储位置)
浅拷贝:只复制最外层
深拷贝:全部复制
一个不太恰当的比喻,两兄弟
a,b
和1000家产value
。
赋值:a=value,b=a
,兄弟还没分家,这1000属于共同财产。无论任何一方花钱或者赚钱,都会使另一方受到影响。
浅拷贝:a=value,b=copy.copy(a)
,半分家状态,兄弟各有300私房钱,剩下400为共同财产。私房钱部分各自独立,二者互不干扰。
深拷贝:a=value,b=copy.deepcopy(a)
,完全分家,各有500。可能一个成为穷光蛋,一个成为富翁。
可变对象和不可变对象:
不可变对象(值的不可变)包括int,float,long,str,tuple等。对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被引用就等待垃圾回收。另外,不可变的类型可以计算hash值,作为字典的key。
可变对象包括list,set,dict等。可变类型数据对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的内存地址会保持不变,但区域会变长或者变短。
其他链接:从存储位置理解深拷贝浅拷贝
13. Python中0.35/0.05等于多少
十进制转二进制:整数部分用除2取余,小数部分乘2取整,直到小数部分为0。
发现0.05转二进制后是一个循环小数,没办法保存,最后的结果为6.9999。