给定卷积神经网络输入,卷积核大小,padding,步长,求输出的shape?
推荐下我自己创建的Python学习交流群960410445,这是Python学习交流的地方,不管你是小白还是大牛,小编都欢迎,不定期分享干货,包括我整理的一份适合零基础学习Python的资料和入门教程。
各个激活函数的优缺点
Sigmod
优点
1、输出值0-1(很重大的优点)
2、其余的和其他众多激活函数比起来,感觉没有什么优点,方便入门理解
缺点
1、容易梯度消失
2、x的可变值区域太小,极其容易陷入级值的状况(-0.9~0.9)
3、指数exp计算复杂
Tanh
优点
和sigmod比起来,是零均值化处理。(零均值化可以加快模型的收敛)
缺点
和sigmod一样的缺点
Relu
优点
计算复杂度低(只有一个if>0判断,大于0则激活值为1),部分区域线性递增,没有幂运算与指数运算
缺点
x小于0时无法产生激活值
训练到后期可能权重参数更新太大
Leakly ReLu
优点
相对于relu来说,激活值必然可以产生
缺点
Relu的其他缺点一概继承下来了
ELU
优点
相对于Leaky relu来说,激活值更平滑
缺点
其他的Leaky relu的缺点一并继承下来了。
如何选择激活函数?
Relu-小心设置learning
rate(因为x>0的情况下,导数均为1),最好是设置一个比较小的值。
不要使用sigmod(缺点太多,计算复杂)
如何初始化CNN?(理论)
不要全部把超参数设置为0(单层网络可以)
容易梯度消失
如何初始化CNN?(实践)
Xavier-tanh(不太适合relu)
fan_in输出通道数
Fan_out输出通道数
代码Np.randon.rand(fan_in,fan_out)/np.sqrt(fan_in/2)
如何分析初始化参数结果好坏?
查看初始化后各层的激活值分布
是否在固定的,稳定的,同一个区间的均匀分布
比较好的初始化结果
均值为0,方差为0.02
如tanh,relu函数
什么叫梯度消失,梯度爆炸
当网络层数过多时,前面层由于求导过程乘积运算,出现weight与bias变得异常大与异常小的情况
左下角的内容清楚的说明了梯度爆炸和梯度消失的场景
BN是什么,为什么能提高收敛速度
批归一化是什么?
标准化处理,特征缩放的一个方式,将数据规整到一定范围内。
如上图所示,BN步骤主要分为4步:
求每一个训练批次数据的均值
求每一个训练批次数据的方差
使用求得的均值和方差对该批次的训练数据做归一化,获得0-1分布。其中εε是为了避免除数为0时所使用的微小正数。
尺度变换和偏移:将xixi乘以γγ调整数值大小,再加上ββ增加偏移后得到yiyi,这里的γγ是尺度因子,ββ是平移因子。这一步是BN的精髓,由于归一化后的xixi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:γγ,ββ。 γγ和ββ是在训练时网络自己学习得到的。
为什么能提高收敛速度?
解决internal covariate shift问题。
特征没有消失,而是归一到一定范围内,加快学习速度
因为最终都是映射到归一化范围内,所以前一层的权重调整对后一层的影响程度都会降低,不用重新适应新的分布,从而让模型学的更快,避免完全从头学习
Tips
BN不用于输入层和输出层(经验论)
BN(实践)
每次batch传入时都做BN
各个优化器的优缺点
优化器分两种
固定学习率的优化算法
SGD随机梯度下降
优点
只随机采样一个样本来计算梯度,加快学习效率,并且避免了普通GD一次性参数更新的坏处(导致模型无法收敛)
缺点
选择合适的学习率较为困难
Momentum动量
优点
动量梯度下降,动力火车,惯性火车,这一次梯度下降的值,会影响下一次梯度下降的值,相对于简单的梯度下降来说,Momentum动量带有延续性相对于简单的梯度下降来说,
减少梯度震荡
缺点
和SGD一样,选择合适的学习率较为困难
自适应学习率的优化算法
Adagrad
优点
更新参数时,会针对原梯度值乘上一个变量,即其所有梯度历史平均值总和的平方根(如上图)
这样在训练初期,分母较小,学习率较大,学习比较快,后期时,学习会逐渐减慢
缺点
从训练开始就积累梯度方差会导致有效学习率过早和过量的减小
只能解决凸问题,当应用于非凸函数训练神经网络时,学习可能会到达一个局部是凸碗的区域
RMSProp
优点
能够解决凸问题
由累计平方梯度变成和平均梯度
缺点
缺少Momentum动量元素
Adam(结合了动量和RMSProp,通用方案)
结合了Momentum和RMSProp的优点
手画一下LSTM
梯度裁剪
介绍一下残差网络
ResNet 基于VGG没解决深层网络下出现性能[梯度消失,导致学不到东西]与效率下降[反向传播运算成本大]的问题,优化出来的一个新的神经网络结构,如图所示,两条路一起走,最终线性激活输入值f(x)+x,然后将f(x)+x传递给激活函数[假设为relu]。那么在反向传播的时候,后面层的梯度更加“无损”的直接传递到前面层,前面层的参数因此也能继续更新。
为什么残差网络会有效果?
□ 先验证明《深层网络效果会比浅层网络好》
只要有理想的训练方式,更深的网络肯定会比较浅的网络效果要好。证明过程也很简单:假设在一种网络A的后面添加几层形成新的网络B,如果增加的层级只是对A的输出做了个恒等映射(identity mapping),即A的输出经过新增的层级变成B的输出后没有发生变化,这样网络A和网络B的错误率就是相等的,也就证明了加深后的网络不会比加深前的网络效果差。
当层数比较多时,容易导致模型学不到东西,甚至出现反效果,然而deep layers又确实是能使模型效果变好的,所以出现残差网络。
效率不影响,层数增加,可以低成本高效率的学到更多非线性的特征。
解决梯度弥漫问题
如上所说,关键点在于反向传播的时候,梯度可以沿着shortcut无损进行回传,避免梯度弥漫问题。
解决模型退化问题
避免了过渡训练后,导致模型准确率反而降低的情况。paper中称为degration。经过实验后发现确实能解决这个问题。
本人对于这个问题的确切原因并不清楚,但是猜测这个原因很可能是由于梯度消失以及众多其他原因所造成的。
Q:既然说中间层是不必要的,那么为什么不直接把这些层去掉呢?可事实上,ResNet的结果比浅层网络的结果好的多,这应该怎么解释呢?
加入中间层主要是为了说明会产生退化的效果。 ResNet效果好是因为解决了退化问题,,梯度爆炸/梯度弥散,调节了网络结构,简化了反向传播求导运算的流程。这和砍掉深一点的层是不一样的思想
风格转换的原理
图像风格转换
由风格特征与内容特征共同计算得出
风格特征
风格的抽象度(越往后层,加入了越多内容的元素,更加具像)
内容特征
内容的相似度(越往后层,加入了越多风格的元素,和原图越不像)
## 怎么解决过拟合
简化模型
正则化(包含dropout)
数据增强
集成学习
早停
减少特征数或使用较少的特征组合
## 怎么解决欠拟合
增加特征数或者使用较多的特征组合
减小正则权重
增加模型复杂度
使用boosting集成学习
如何提高学习算法性能的指导方针
->低可拟合偏差
更大的模型,更深的层
更好的优化器方案
探索更合适的超参数
->低方差
找寻更多的数据
正则化,dropout
对抗神经网络
探索更合适的超参数
->清晰的正交化方案
……
思路逻辑清晰的调试
数据预处理一般步骤有哪些?
指定原始数据的文件列表 -> 创建文件列表队列 ->
从文件中读取数据 -> 数据预处理 -> 整理成batch
作为神经网络输入
如何用指标和方案去评判一个优秀的模型?
train/Validation/Test 准确率/召回率
方差
偏差
CNN模型加速与压缩汇总
1. 合理设计模型2. 权值剪枝(编程稀疏矩阵)
3. 权值量化(聚类)
4. 二值化(BWN,XNorNet)
5. 霍夫曼编码
6. 奇异值分解(projection层)
7. 1×1卷积的恰当使用减少通道量
8. 卷积分解为deepwise Conv和pointwise
Conv可大幅度减小计算量和参数量1/(Dk^2)
9. Group Conv(可节省1/g计算量)
10. Channel Shuffle
11. 蒸馏法
12. 低秩分解
13. 模型裁剪
# 怎么选择超参数
神经网路中的超参数主要包括1. 学习率 η,
2. 正则化参数 λ,
3. 神经网络的层数 L
4. 每一个隐层中神经元的个数 j
5. 学习的回合数Epoch
6. 小批量数据 minibatch 的大小
由神经网络的机理进行选择
7. 输出神经元的编码方式
8. 代价函数的选择
9. 权重初始化的方法
10. 神经元激活函数的种类
11 . 宽泛策略的核心在于简化和监控
12. 参加训练模型数据的规模