深度学习 相关学习资料整理
置顶 2017年09月21日 14:33:43 FR-0912 阅读数:576 </div>
<div class="operating">
</div>
</div>
</div>
</div>
<article class="baidu_pl">
<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
<div class="article-copyright">
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17448289/article/details/78051703 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
<h1 id="1调参技巧"><a name="t0"></a>1、调参技巧</h1>
深度学习参数和架构设计技巧
Caffe 模型微调 的场景、问题、技巧以及解决方案
Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)
2 数据增强(data augmentation )
在深度学习中,有的时候训练集不够多,或者某一类数据较少,或者为了防止过拟合,让模型更加鲁棒性,data augmentation是一个不错的选择。
常见方法:
Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当);
PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering;
Random Scale:尺度变换;
Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换;
Horizontal/Vertical Flip:水平/垂直翻转;
Shift:平移变换;
Rotation/Reflection:旋转/仿射变换;
Noise:高斯噪声、模糊处理;
Label shuffle:类别不平衡数据的增广,参见海康威视ILSVRC2016的report;另外,文中提出了一种Supervised Data Augmentation方法,有兴趣的朋友的可以动手实验下。
3、ResNet
论文: Deep Residual Learning for Image Recognition
翻译:
1、[译] Deep Residual Learning for Image Recognition (ResNet) (翻译的比较好,推荐!)
2、 获奖无数的深度残差学习,清华学霸的又一次No.1 | CVPR2016 最佳论文
4、 GoogLeNet
论文地址:
- Inception[V1]: Going Deeper with Convolutions
- Inception[V2]: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- Inception[V3]: Rethinking the Inception Architecture for Computer Vision
- Inception[V4]: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
相关资料整理:
1、 Inception[V1]: Going Deeper with Convolutions
论文翻译
解读材料:
2、Inception[V2]: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
论文翻译 (不全)
解读材料:
《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现 (评价:自我感觉 这篇blog有点深奥,不是很容易懂。需要很好的数学功底和图像处理知识。)
Batch Normalization导读 (评价:这篇blog把BN的基础、本质讲的很到位。提及到了本质。)
论文笔记-Batch Normalization (评价:这篇blog是对BN全篇论文的总结,扣出了paper重点部分。)
3、Inception[V3]: Rethinking the Inception Architecture for Computer Vision
《Rethinking the Inception Architecture for Computer Vision》笔记 (评价:这篇blog是对V3论文的总结,扣出了paper重点部分,内容较全)
GoogLeNet系列解读 (评价:这篇blog是对V3论文的总结,扣出了paper部分重点。)
4、Inception[V4]:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
GoogLeNet:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning论文笔记 (评价: 总结的不错)
5、其他资料
Deep Learning-TensorFlow (13) CNN卷积神经网络_ GoogLeNet 之 Inception(V1-V4)
5、 通过网络结构估算caffemodel文件的大小
6、通过pre-trianed caffemodel文件大小推出自己任务训练得到的caffemodel文件大小
在Netscope 中画出这个网络的网络结构图,一般我们主要更改的是最后一个全连接层的分类类别数目,此网络分类类别数目是21841个类别,global_pool层输出1024个特征,而官方给的fint-tune模型是134.9M大,假设我们做二分类任务,则最终我们根据二分类任务训练得到的caffemodel大小为:134.9M-(1024*21841×4/1024/1024)+(1024*2×4/1024/1024)≈49.6M
7、深度学习中的损失函数总结以及Center Loss函数笔记
文章内总结如下:
1、一种新的loss函数,看起来效果不错,而且也更加符合认知,生成的模型鲁棒性可能更好.
2、本质是度量学习,经常应用在分类领域,原理简单,计算复杂度不大,经常能提升效果.
3、有点使用空间换取时间的意思.
4、属于一个trick.不一定适合所有场景.一般来说,如果同一类样本很类似如mnist手写数字,人脸数据,那么centerloss往往能够带来效果提升.而如果本身同一类样本就差异很大,如cifar100,那么则不一定.也可以理解成一个人的一堆脸取平均值仍然是他的脸,而一堆不同的狗取平均值则可能难以认出是什么.
5、参数设置:a一般取0.5,lambda则0.1-0.0001之间不等,需要实验调参.
8、VGG
论文翻译: VGG:VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION译文
9、DL需要Finetune的原因
摘自知乎:
AlexNet、Network in Network 、VGG、GoogLeNet、Resnet等CNN网络都是图片分类网络, 都是在imagenet上1.2 million数据训练出来的。由于从这些pretrained网络抽出来的deep feature有良好的generalization的能力,可以应用到其他不同的CV问题,而且比传统的hand-craft feature如SIFT,bag of word要好一大截,所以得到广泛应用。目前大部分的high-level vision相关的问题,都是利用基于CNN的方法了。花点时间去了解这几个核心分类网络的结构和发展,是挺有必要的。一般来说,某CNN网络在imagenet上面的分类结果越好,其deep feature的generalization能力越强。最近出现蛮多论文,里面在benchmark上面的比较是自己方法的核心网络换成resnet,然后去比别人基于vgg或者alexnet的方法,自然要好不少。所以对于某个CV的问题,选一个优秀的核心网络作为基础,然后fine-tune, 已经是套路,这点从ResNet那篇论文的citation的增长就可以看出来。
所以,fine-tune的原因一是训练AlexNet等网络需要imagenet, places等million级别的数据,一般的CV任务都没有这么多数据。二是因为pre-trained model本身的feature已经足够generalizable,可以立刻应用到另外一个CV任务。
10、caffe中的iteration,batch_size, epochs理解
深度学习中经常看到epoch、 iteration和batchsize,下面按自己的理解说说这三个的区别:
(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
(2)iteration:1个iteration等于使用batchsize个样本训练一次;
(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;
举个例子,训练集有1000个样本,batchsize=10,那么:训练完整个样本集需要:100次iteration,1次epoch。
就像lecun里说的一样,随机梯度下降不能像full batch那样明显的保证收敛。一般而言,根据你的GPU显存,设置为最大,而且一般要求是8的倍数(比如32,128),这样,GPU内部的并行运算效率最高
基于SGD的训练batch size不能取过大。过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。。具体的batch size的选取和训练集的样本数目相关。。举个例子,比如在3小时的语音识别库(大约108万个样本)训练DNN,通常batch 取128..而在300小时的库上会取1024..
batch_size设的大一些,收敛得快,也就是需要训练的次数少,准确率上升得也很稳定,但是实际使用起来精度不高。
batch_size设的小一些,收敛得慢,而且可能准确率来回震荡,所以还要把基础学习速率降低一些;但是实际使用起来精度较高。
接触到pooling主要是在用于图像处理的卷积神经网络中,但随着深层神经网络的发展,pooling相关技术在其他领域,其他结构的神经网络中也越来越受关注。
这个图是一个典型的卷积神经网络结构图,其中的卷积层是对图像的一个邻域进行卷积得到图像的邻域特征,亚采样层就是使用pooling技术将小邻域内的特征点整合得到新的特征。
pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此。pooling目的是为了保持某种不变性(旋转、平移、伸缩等),常用的有mean-pooling,max-pooling和Stochastic-pooling三种。
11、pooling层
mean-pooling,即对邻域内特征点只求平均,max-pooling,即对邻域内特征点取最大。根据相关理论,特征提取的误差主要来自两个方面:(1)邻域大小受限造成的估计值方差增大;(2)卷积层参数误差造成估计均值的偏移。
一般来说,mean-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。Stochastic-pooling则介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与mean-pooling近似,在局部意义上,则服从max-pooling的准则。
LeCun的“Learning Mid-Level Features For Recognition”对前两种pooling方法有比较详细的分析对比,如果有需要可以看下这篇论文。
A Theoretical Analysis of Feature Pooling in Visual Recognition
Learning Mid-Level Features For Recognition
Learning Mid-Level Features For Recognition
pooling原因一是仿照人的视觉系统进行降维(降采样),用更高层的抽象表示图像特征,这一部分内容从Hubel&wiesel视觉神经研究到Fukushima提出,再到LeCun的LeNet5首次采用并使用BP进行求解,是一条线上的内容,原始推动力其实就是仿生,仿照真正的神经网络构建人工网络。二LeCun在98年的文章中对这种降采样其实有一些回答,就是当我们在第一层卷积得到一些特征时,这些特征的组合是我们判断原始图像是什么的关键,因此特征的绝对位置已经不那么重要,其相对位置更重要,举个栗子:字符‘7’,手写的时候提取的特征可能是左上方一条横线特征,右上方一个弯曲特征,然后下方有个稍向左下偏的竖线特征,注意我们判断的时候用的左右,上下这些不精确的相对位置,而不是相差多少个像素这种绝对位置。使用相对位置的好处是对一些平移,卷曲,旋转更鲁棒,否则你的正确接受率可能很高,但错误拒绝率会同样高。
12、R-CNN系列
2014-RCNN-Rich feature hierarchies for accurate object detection and semantic segmentation 翻译
HOG特征
HOG特征
链接中,利用任意一种梯度算子,例如:sobel,laplacian等,对该patch进行卷积,计算得到每个像素点处的梯度方向和幅值。具体公式如下:
具体算法为:
13、nvidia
Ubuntu下有关显存的命令
nvidia-smi命令
nvidia-smi命令解读
nvidia-smi: Control Your GPUs
(图片来源:【Caffe实战与小数据深度学习】CNN的近期进展与实用技巧(下) )
Caffe当中目前支持单机多卡的分布式训练,但是基于同步模式,每一轮迭代都要进行梯度的交换。因此在多GPU服务器上就可能存在GPU之间的通讯瓶颈,如果GPU之间不支持P2P方式连接而采用socket连接,会极大影响GPU并行的加速比。Linux下可以采用nvidia-smi topo –m命令查看,如果两块显卡之间的桥接方式为SOC也就是socket连接,那么不推荐使用这两块显卡进行分布式训练。注意显卡的桥接方式由主板硬件决定,无法通过软件修改设置。
14、AlexNet
论文地址: ImageNet Classification with Deep Convolutional Neural Networks
论文翻译:AlexNet论文翻译与解读
15、Xavier
来自这篇论文《Understanding the difficulty of training deep feedforward neural networks》
具体内容请参考
CNN数值——xavier(上)
CNN数值——xavier(下)
论文大致翻译:Understanding the difficulty of training deep feedforward neural networks