CV笔记

什么是ResNet

ResNet解决了什么问题?

以前Deep NN的层数不能太高,原因:

BP反向传播带来梯度弥散问题。在经过梯度反传后,经过几层后反传的梯度会彻底消失,导致当网络层数增加后,梯度无法传到的层就好比没有经过训练一样。当然由于RELU、中心归一化层的出现使得网络的深度变大,但是也还是没有从根本上解决梯度弥散的问题。单纯的把layer叠起来深层网络的效果反而不如合适层数的较浅的网络效果好,这种情况称为网络退化。

ResNet 解决的就是这个问题,让以前十几层的NN,现在可以达到几百层了

怎么解决?

用残差来重构网络的映射,说白了就是把输入x再次引入到结果,这样堆叠层的权重会趋向于零,学习起来会简单,能更加方便逼近身份映射。

 

categorical_crossentropy 与 sparse_categorical_crossentropy 的区别

这两个都是用来做多分类的。

区别就是categorical_crossentropy 是用来做One-hot encoding的

e.g. [1, 0, 0]

       [0, 1, 0]

sparse_categorical_crossentropy 是用来做Integer encoding的

e.g.: 1

        2

        3

Keras 用错了会出现

Error when checking target: expected fc1000 to have shape (1000,) but got array with shape (1,)

错误

 

详情:https://blog.csdn.net/sxf1061926959/article/details/54973588

 

Batch size 就是一次放进去多少条训练数据

Expected more than 1 value per channel when training 的错误是因为在做Batch Normalization的时候 一次必须放进多条训练数据

 

Binary Cross Entropy

常用于二分类问题,当然也可以用于多分类问题,通常需要在网络的最后一层添加sigmoid进行配合使用,其期望输出值(target)需要进行one hot编码,另外BCELoss还可以用于多分类问题Multi-label classification.

Categorical cross-entropy

 

适用于多分类问题,并使用softmax作为输出层的激活函数的情况。



作者:Yohanna
链接:https://www.zhihu.com/question/36307214/answer/364963552
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

Tensorflow 会话

TensorFlow 使用 tf.Session 类来表示客户端程序(通常为 Python 程序,但也提供了其他语言的类似接口)与 C++ 运行时之间的连接。tf.Session 对象使我们能够访问本地机器中的设备和使用分布式 TensorFlow 运行时的远程设备。它还可缓存关于 tf.Graph 的信息,使您能够多次高效地运行同一计算。

使用 tf.Session.run 执行操作

tf.Session.run 方法是运行 tf.Operation 或评估 tf.Tensor 的主要机制。您可以将一个或多个 tf.Operation 或 tf.Tensor 对象传递到 tf.Session.run,TensorFlow 将执行计算结果所需的操作。

tf.Session.run 要求您指定一组 fetch,这些 fetch 可确定返回值,并且可能是 tf.Operationtf.Tensor 或类张量类型,例如 tf.Variable。这些 fetch 决定了必须执行哪些子图(属于整体 tf.Graph)以生成结果:该子图包含 fetch 列表中指定的所有操作,以及其输出用于计算 fetch 值的所有操作。

Session 对象创建时有三个可选参数: 
1.target,在不是分布式中使用Session对象时,该参数默认为空 
2.graph,指定了Session对象中加载的Graph对象,如果不指定的话默认加载当前默认的数据流图,但是如果有多个图,就需要传入加载的图对象 
3.config,Session对象的一些配置信息,CPU/GPU使用上的一些限制,或者一些优化设置

 

调参经验

作者:知乎用户
链接:https://www.zhihu.com/question/41631631/answer/94816420
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

  • 要做梯度归一化,即算出来的梯度除以minibatch size
  • clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
  • dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329
  • adam,adadelta等,在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。
  • 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。
  • rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
  • word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.
  • 尽量对数据做shuffle
  • LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
  • Batch Normalization据说可以提升效果,不过我没有尝试过,建议作为最后提升模型的手段,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
  • 如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: http://arxiv.org/abs/1505.00387
  • 来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。

作者:罗浩.ZJU
链接:https://www.zhihu.com/question/41631631/answer/94816420
来源:知乎

其实我发现现在深度学习越来越成熟,调参工作比以前少了很多,绝大多数情况自己设计的参数都不如教程和框架的默认参数好,不过有一些技巧我一直都在用的

(1)relu+bn。这套好基友组合是万精油,可以满足95%的情况,除非有些特殊情况会用identity,比如回归问题,比如resnet的shortcut支路,sigmoid什么的都快从我世界里消失了

(2)dropout 。分类问题用dropout ,只需要最后一层softmax 前用基本就可以了,能够防止过拟合,可能对accuracy提高不大,但是dropout 前面的那层如果是之后要使用的feature的话,性能会大大提升

(3)数据的shuffle 和augmentation 。这个没啥好说的,aug也不是瞎加,比如行人识别一般就不会加上下翻转的,因为不会碰到头朝下的异型种

(4)降学习率。随着网络训练的进行,学习率要逐渐降下来,如果你有tensorboard,你有可能发现,在学习率下降的一瞬间,网络会有个巨大的性能提升,同样的fine-tuning也要根据模型的性能设置合适的学习率,比如一个训练的已经非常好的模型你上来就1e-3的学习率,那之前就白训练了,就是说网络性能越好,学习率要越小

(5)tensorboard。以前不怎么用,用了之后发现太有帮助,帮助你监视网络的状态,来调整网络参数

(6)随时存档模型,要有validation 。这就跟打游戏一样存档,把每个epoch和其对应的validation 结果存下来,可以分析出开始overfitting的时间点,方便下次加载fine-tuning

(7)网络层数,参数量什么的都不是大问题,在性能不丢的情况下,减到最小

(8)batchsize通常影响没那么大,塞满卡就行,除了特殊的算法需要batch大一点

(9)输入减不减mean归一化在有了bn之后已经不那么重要了

上面那些都是大家所知道的常识,也是外行人觉得深度学习一直在做的就是这些很low的东西,其实网络设计上博大精深,这也远超过我的水平范畴,只说一些很简单的

(1)卷积核的分解。从最初的5×5分解为两个3×3,到后来的3×3分解为1×3和3×1,再到resnet的1×1,3×3,1×1,再xception的3×3 channel-wise conv+1×1,网络的计算量越来越小,层数越来越多,性能越来越好,这些都是设计网络时可以借鉴的

(2)不同尺寸的feature maps的concat,只用一层的feature map一把梭可能不如concat好,pspnet就是这种思想,这个思想很常用

(3)resnet的shortcut确实会很有用,重点在于shortcut支路一定要是identity,主路是什么conv都无所谓,这是我亲耳听resnet作者所述

(4)针对于metric learning,对feature加个classification 的约束通常可以提高性能加快收敛


作者:刘温如
链接:https://www.zhihu.com/question/41631631/answer/94935518
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

小白一枚,在这里总结一下我在试验中观察到的现象(必然有理解错误的地方):
1. Adam收敛速度的确要快一些,可是结果总是不如其他优化算法,如果很看重结果不在乎速度还是用其他的试试。
2. Dropout的放置位置以及大小非常重要,求大神能分享经验.....
3. Relu并不是一定比Tanh好,如果不太懂的话,用的不合适,可能会导致梯度消失?(不知道是不是网络结构问题,为什么一用relu梯度一会儿就变成Nan)
4. pretrain 的 Embedding在训练中不调优泛化能力要更好一些,调优的话参数会增加好多啊。

 

1,观察loss胜于观察准确率,loss设计要比较合理,对比训练集和验证集的loss
2,relu可以很好的防止梯度弥散的问题,当然最后一层激活函数尽量别用relu,如果分类则用softmax
3,BatchNorm 可以大大加快训练速度和模型的性能
4,Dropout防止过拟合,可以直接设置为0.5,一半一半,测试的时候把Dropout关掉
5,Loss选择,一般来说分类就是softmax,回归就是L2的loss,但是loss的错误范围(主要是回归)预测一个10000的值,模型输出为0
6,准确率是一个评测指标,但是训练过程中loss你会发现有些情况,准确率是突变的,原来一直是0,可能保持上千迭代,然后变1。而loss不会有那么诡异的发生,毕竟优化目标为loss
7,学习率设置得合理,太大loss爆炸,太小则没有反应
8,对不训练集和验证集的loss,判断过拟合,训练是否足够,是否需要Early Stop
--------------------- 
作者:googler_offer 
来源:CSDN 
原文:https://blog.csdn.net/googler_offer/article/details/79122925 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值