深度学习 面试总结

防止过拟合和欠拟合的方法

防止过拟合的方法:数据增强,正则化(也就是权重衰减),BN,降低模型复杂度,Dropout。
欠拟合:增加模型复杂度,减少正则化参数

RNN/LSTM总结

RNN/LSTM总结

还是蛮好记的~~

卷积的两大特性: 局部连接(先局部后整体)、参数共享(减少参数、平移不变性)~~其实就是共享卷积核

Dropout: 原理是集成学习(bagging),每个节点都有一定的概率被选择,N个节点相当于2**N个模型的集成。共享大部分参数,小部分参数不同。 ~~~~作用是增强泛化能力,防止过拟合(减弱全体神经元的关联性)。

BN:原理就是在每层神经网络的输入之前归一化,每一个batch的同一个channel归一化。作用是:增强网络的泛化能力,防止过拟合,加快训练和收敛的速度。

防止过拟合的方法:数据增强,正则化(也就是权重衰减),BN,降低模型复杂度,Dropout。

Inception

在这里插入图片描述
inceptionv1:引入稀疏特性和将全连接层转换成稀疏连接
在这里插入图片描述
inceptionv3:
55可以换成两个33–
在这里插入图片描述

靠后面的33和55可以转换为13+31/15+51
在这里插入图片描述

Inceptionv4:
加入short-cut的思想,最简单看模块A:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

ResNext 与 Resnet
Resnet就不用说了,残差连接。
ResNext是对残差块结构的一个小改进。对瓶颈结构缩小了瓶颈比,并将中间的普通卷积改成分组卷积。可以在不提高参数量的前提下,提高准确率,同时减小了超参数的数量。

下面是Resnet的残差块,相比,ResNext就是针对右边的残差块,第一个通道输出增大为128,然后分组卷积(33),再11输出。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

BN的作用–BN针对的是送入下一层网络的输入X

1、加快网络的训练和收敛的速度(如果每一层的分布都不同,每次迭代都要拟合不同的数据分布,必然不利于收敛),增强泛化能力 — 如果训练集和测试机的分布不同,泛化能力就降低了。通过批量归一化可以避免。
2、控制梯度爆炸, 防止梯度消失(在sigmoid激活函数里,参数越大,梯度越接近于0.)
在这里插入图片描述

3、防止过拟合
确保网络中的各层即使参数发生了变化,输入和输出的数据分布也不会发生较大变化,从而避免内部协变量偏移现象。训练更加稳定,对初始值不再那么敏感,有利于使用较大的学习率来加速收敛。
在这里插入图片描述
一般把BN放在激活层之前,可以避免BN破坏非线性激活的分布,使得数据点不会落在非线性激活的饱和区域,比如SIGMOID,所以避免了梯度消失。

什么是全局平均池化,作用

目的:替代全连接层
效果:减少参数数量,减少计算量,减少过拟合。~~全连接层参数量相对多得多,全剧平均池化参数为0,只有计算量。
举例:下图是四分类,全连接层得到四个神经元;而全局平均池化是得到四个特征图,对整个特征图进行求平均,再送入softmax层得到输出。
意义:对整个网络从结构上做正则化防止过拟合,剔除了全连接层黑箱子操作的特征,直接赋予了每个channel实际的类别意义
在这里插入图片描述

SPP空间金字塔池化

分成1个格子、四个格子、16个格子,再分别对格子进行池化。
在这里插入图片描述
(1)直接对整个区域池化,每层得到一个点,共256个点,构成一个1x256的向量

(2)将区域划分成2x2的格子,每个格子池化,得到一个1x256的向量,共2x2=4个格子,最终得到4个1x256的向量

(3)将区域划分成4x4的格子,每个格子池化,得到一个1x256的向量,共4x4=16个格子,最终得到16个1x256的向量

将三种划分方式池化得到的结果进行拼接,得到(1+4+16)256=21256的特征。

SE

SE-layer 注意力模块,如下图所示,SE-layer(Squeeze-Excitation)
首先对卷积得到的特征图进行 Squeeze 操作(Global pooling:由hwc2 ===> 11c2),得到 channel 级的全局特征,然后对全局特征进行 Excitation 操作,学习各个 channel 间的关系,也得到不同channel 的权重,最后乘以原来的特征图得到最终特征。本质上,SE 模块是在channel 维度上做 attention 或者 gating 操作,这种注意力机制让模型可以更加关注信息量最大的 channel 特征,而抑制那些不重要的 channel 特征。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1) # 因为每个像素都乘以这个y,所以等同于HW内每个都相同,直接expand_as
        return x * y.expand_as(x)

猜你喜欢

转载自blog.csdn.net/caihuanqia/article/details/113816057