CNN中的小tips

1)为什么使用两个3*3的卷积核而不是用5*5的卷积核呢?

  • 加深网络深度;
  • 减少所求解的参数个数。
    例如我们共有20个3*3的卷积核,将其分为两层,然后有20个5*5的卷积核,将其保持一层,经过两层3*3或者一层5*5之后得到的大小一致,那么为什么我们在卷积核个数相同的情况下更喜欢采用两层3*3而不是一层5*5呢,答案就在与在加深网络深度的同时还可以减少计算的网络参数!

    两层3*3卷积核计算的参数,最大值在第二张图片第一层取11,第二层取9的时候,得到的参数为1188个
    这里写图片描述
    这里写图片描述

一层1*1卷积核计算的参数,共需计算1500个参数
这里写图片描述
2)1*1卷积核的作用有哪些?
①用于提升卷积层通道个数或者降低通道数!!!
②实现跨通道的交互和信息整合!!!
3)防止过拟合的方法
方法:regulization(L1,L2),weight-decay(等价于L2-regulization),batch-normalization,
pooling层,cross-validation,验证集的设置,数据shuffle
early stop(早停法),data expending(数据扩增)
,GoogLenet中的多个softmax预测(大量的Inception module)等等!

若数据都以相同顺序进入网络会
使得随后的epoch影响很小。shuffle是用于打乱数据在矩阵中的排列顺序,提高后续
epoch的训练效果。
4)解决不收敛问题
描述:什么是网络的不收敛问题???
原因:
方法:

5)为什么我们需要对数据进行shuffle???
y原因:
1)浅层分析:由于我们在SGD或者batch_GD(mini-batch_GD指的一般是样本数量小于10的),若数据都以相同的顺序进入网络会使得随后的epoch影响很小,shuffle用于打乱数据在矩阵中的排列顺序,提高后续epoch的训练效果—-YJango《超智能体》;
2)深层分析:为了防止出现有规律的数据,导致网络过拟合或者不收敛!
z方式:
permutation(排列,置换)
numpy.random.permutation(X)
z注意这时候置换的只是它的排列顺序,需要原始样本的换还要在做变换,看一个例子:

x=[11,21,32,43,55]
ri=np.random.permutation(len(x))
print(ri)

结果:
[1,2,0,3,4]
注意这个结果是不断变换的,需要注意的仅仅只是它所代表的含义(对原始的顺序打乱输出新的顺序)
6)inf数据和nan数据
描述:inf指的是该数据是无穷(无穷大或者无穷小),而nan指的是not a number,表明这个数据不是一个数;
原因:
1)梯度爆炸,导致训练的过程脱离了原来的轨迹,最后导致loss值过大不能用浮点数来表示,因而出现nan;
2)训练集中脏数据的出现,即log(y|w,x)当得到的y无限趋近于0(注意这儿的0指的是数值,而不是第0类)的时候,得到的数据将为nan(交叉熵损失函数中log(y_pred),当y_pred==0时就出现NAN,或者反向传播的过程中,当y_pred为0的时候,会出现除0问题);
3)错误的学习率策略和参数设置,学习率由于策略原因导致学习率不是一个正确的数,而是nan或者inf,学习率乘以参数将致使所有的参数都为nan!

参考:在卷积神经网络训练过程中loss出现NaN的原因以及可以采取的方法

7)梯度,导数,偏导数,方向导数各是什么???

8)BGD,SGD,MBGD的区别和需要注意的东东???
BGD:对原始网络,在一个epoch中,将每个样本送入网络进行求解梯度,然后将所有梯度进行求和取平均,然后利用所有样本的平均梯度进行梯度下降算法来更新网络权重,即一个epoch对原始网络更新一遍,不断迭代求解最优化,优点:每次更新网络权重的时候,都保证了网络朝着最优化的方向下降,即每次对网络权重的更新的时候都是朝着整体最优的方向进行优化;缺点:每一次对网络的参数更新需要用到所有的训练样本,如果训练数据非常多的话,将是非常的耗时的操作,把整个训练集载入模型中计算,时间花费和内存开销非常大,无法用于实际中大数据集和大模型的场景。—(引用:知乎[Hulu机器学习问题与解答系列 | 十七:随机梯度下降算法之经典变种](https://www.zhihu.com/search?type=content&q=SGD%E5%92%8CGD%E5%92%8Cbatch-Gradient%20Descent)
SGD:对网络,送入一个样本进行训练之后便更新一遍网络,如果共有n个样本,则在一个epoch中将更新n-1遍网络,优点:对于网络权重的更新操作并没有那么耗时,将非常快!缺点:噪音相较BGD较多,使得SGD并不是每次对网络的更新并不是朝着整体最优方向,大体朝着整体最优的方向移动,容易陷入局部最优!但是由于每步接受的信息量有限,对梯度的估计常常出现偏差,造成目标函数曲线收敛得很不稳定,伴有剧烈波动,甚至有时出现不收敛的情况。—(引用:知乎[Hulu机器学习问题与解答系列 | 十七:随机梯度下降算法之经典变种](https://www.zhihu.com/search?type=content&q=SGD%E5%92%8CGD%E5%92%8Cbatch-Gradient%20Descent)!)
MBGD:结合了BGD和SGD两者的优点,进行折衷之后,我们设计出了一种利用小批量梯度下降算法(MBGD),这样在一次epoch中,将更新网络权重n/mini_batch_size次网络,保证了算法的训练过程比较快,同时可以解决sgd的准确性不足问题,需要注意的是这儿mini_batch_size的设置是十分重要的,在设置的时候需要谨慎谨慎哈!

具体这一块的内容请参考:详解梯度下降法的三种形式BGD、SGD以及MBGD

目前常用的优化算法是MBGD(这个普遍被称之为SGD,但是这种优化算法并不是一直适用的,有时候会出现失效的情况,为什么他们会失效呢,解释如下:
1)鞍点:对梯度的微小变化不容易觉察,导致停滞,无法收敛!
2)山谷:容易在山壁之间震荡,造成收敛不稳定和收敛速度慢的问题。

由于这些算法会失效,那么我们应该怎样避免这种问题呢?聪明的前辈又提出了变种算法:
①Momentum
②AdaGrad
③Adam

----------------------------------

这一部分的可作了解即可
④Nesterov Accelerated Gradient
⑤AdaDelta和RMSProp
⑥AdaMax
⑦Nadam

9)深度学习中的预训练(pre-training)
一文看懂深度学习:怎样用预训练模型搞懂深度学习
10)深度学习中的微调(fine-tuning)
11)空洞卷积
背景:pooling减小图像尺寸增大感受野,upsampling扩大图像尺寸,先缩小后放大的过程中,定有一些信息损失掉了,如何解决呢—空洞卷积!
空洞卷积:①空洞卷积的感受野和空洞的间隔呈指数级增长,可以在不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息;②减小运算参数,加快计算。

11)全连接层的作用:
全连接层的作用是什么?
未完待续。。。。。
12)损失函数综述
损失函数:损失函数表明用该参数(w,b)进行预测所得到的输出与预期的输出之间不符合程度和损失的衡量,如果从根本来解释的话,损失函数是关于参数w和b的多元函数,定量的可以看做挑选出来的参数性能度量,注意二者呈负相关!
损失函数可以看作为一个将W和b作为输入,然后得到得分,定量估计W和b的好坏,是一种衡量损失与错误程度的函数!!!损失函数是一种衡量参数对于网络吻合程度的度量,即从w和b的期望空间中选择一个预期损失最小的w和b,使我们的任务,既然损失函数于错误程度呈正相关,损失函数越小,意味着错误程度越小,因此,挑选出的参数越合适!!!
损失函数综述
1)SVM loss(hinge loss):SVM loss关注的是最后得到的输出层的得分,没有进行softmax激活,只需要关注数据的预期类的预测值在一个安全范围内大于其他错误类的得分即可,并没有整整在意这些输出的含义代表的是什么;
2)softmax loss(Multiple logistic regression),实在最后的输出层之后加上一个softmax层,将所有的输出压缩到0~1之间,即数值其实与概率有关,而且由于分母固定,所以仅仅与分子有关,分子又与输出有关,所以输出和概率呈正相关,对每个数据而言,因为它已经发生了,所以它的预期概率应该为1,其他类别的概率为0,我们希望我们softmax之后的输出能够吻合这种关系,该数据的预期类输出概率应尽可能接近1,其他输出概率应该接近于0,(注意这是交叉熵损失的最大似然解释),即我们预测的概率分布逼近于原始概率分布;
这里写图片描述
13)为什么采用更小的卷积核((2012)VGGNet中采用的卷积核为3*3,而(2014)AlexNet采用的卷积核是7*7)?
①更少的参数量级;
②更深的网络架构;
③更多的非线性;
④可以保持和大的卷积核相同的感受野(3个3*3的卷积核和1个7*7的卷积核的感受野相同!)

14)epoch,batch,iterations
epoch指的是将所有数据送入网络训练了一遍;然鹅由于所有数据是非常非常多的嘞,一次全部送入训练会电脑会懵逼的,因此,需要将所有数据分为多个batch进行训练,batch sizes就是iterations,即一次epoch中执行了iterations的batch,我们知道必须多个epoch进行训练,才可以使得网络最终收敛,同时epoch越大,越容易过拟合,那么如何从数学上来理解为什么需要多个epoch的原因呢?

训练的时候,发现随着epoch增大到后期,好多次iterations的loss值通常一致,或者只有少许差异(即几乎没法下降了),而下一次epoch开启的时候,除了前期的几次跳动之外,后面稳定下来之后,我们会发现loss值又能继续下降,这是什么原因呢?主要在于每次epoch中对数据进行了打乱,多次epoch的原因之一在于可以跳出局部极小点,原因之二在于可以通过多次epoch来近似地代替原始的loss,显然一个epoch中的iterations迭代的部分loss函数已经和所有数据的loss函数有了很大的偏差,有些以偏概全之嫌疑,所以通过多个epoch来消除这种误差!!!
更多资料:
吴恩达计算机视觉:12堂课学习心得

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值