[TOC] # 视频地址 https://share.weiyun.com/14885e04050da9f53f7670532acb782c http://pan.baidu.com/s/1skDzV5N http://cloud.video.taobao.com/play/u/144304055/p/1/e/6/t/1/50010974167.mp4 # ppt地址 http://www.zifuture.com/fs/10.tutorial/2.jibenjieshao.pptx # 深度学习 深度学习Deep Learning,简称DL,又称DNN,即深度神经网络Deep Natural Networks。 在此之前有BP神经网络,即Back Propgation,反向传播神经网络。 通常我们会认为,BP或者其他隐层少的网络属于浅层神经网络,而隐层很多的网络称之为DNN,这里的多是没有具体定义的,如图所示即是。 而DNN又是个比较宽泛的词,DNN里面又包括有CNN卷积神经网络、RNN循环神经网络、LSTM长短期记忆网络、GANs对抗网络等几大类型,本文我们默认DL指CNN即可,相关意义可以查询百度。 * 浅层神经网络 ![](https://box.kancloud.cn/fc630eaf4c7e2b62f15b2e93a862f46b_414x276.png) * 深层神经网络 ![](https://box.kancloud.cn/f9c6630683aac8585c2f3e7823da2afc_658x346.png) # CNN ![](https://box.kancloud.cn/700718ce5f07cc96fbb4d1abb4f2b655_907x435.png) # GPU GPU:图形处理单元,即显卡。以前GPU多为了加速显示帧率等,最近被用在超级计算上,以支持大量密集运算的需求,比如DL的训练过程就是。而显卡又分为三类,即Intel出的集成显卡、AMD系列、NVIDIA系列,被简称集显、A卡、N卡对于DL的GPU支持,必须是N卡,而且还要能够支持CUDA,因为旧版的显卡是不能支持CUDA的,可以下载GPU-Z查看型号和支持情况 显存:显卡的内存,由于DL的计算同时也需要消耗很大的显存空间,所以这个指标也影响着DL的训练和使用。GPU-Z里面查看的Memory Size即是显存大小,而Sensors里面的GPU Load是显卡使用率 对于使用CPU训练,会特别慢,使用GPU训练一般会比CPU快10-30倍甚至更多,所以使用GPU训练是很必要的事情。但是目前很长时间内,GPU的训练一直都是困扰很多人的问题,因为坑太多了,这里我们就详细讲讲关于GPU的那点事~ CUDA:NVIDIA出的一个GPU加速开发工具包,用来做GPU加速开发的支持,CUDA有版本的区分,所以CC库的编译和使用也就依赖着编译时候的版本,目前CC库提供有CUDA8.0、CUDA7.5的编译版本,那么对于使用GPU的你而言必须下载安装对应的CUDA版本和对应的CC版本才行。记得安装完CUDA后,在环境变量里面加入CUDA的目录,否则会提示找不到dll。 CUDA下载地址: CUDA7.5:http://download.pchome.net/development/c/download-194360.html CUDA8.0:https://developer.nvidia.com/cuda-downloads CUDA是不支持Win32的,也就是说,CC框架也不能支持Win32下的GPU相关操作 # Protocol buffer 称为protobuf,简称PB,是由google开发的一套数据交互的协议栈库,他是一个库,也提供一种协议语法,语法结构跟JSON很相似。你可以使用任何语言解析编码为protobuf格式的协议数据或者文件,我们后期训练使用的模型和网络定义,全部是以protobuf的格式存储的。 * 协议约定文件 ![](https://box.kancloud.cn/e3365970fda32e0b07515ab4ddf6747b_710x348.png) * 协议数据文件 ![](https://box.kancloud.cn/4780a2cdf5565111c6db750ee500d08a_283x347.png) caffe主要采用google protobuf格式描述网络配置文件,定义DL的各个层参数、训练时候的超参数和二进制的模型权重,所以caffe的训练是不需要写任何代码来实现的,只有调用caffe模型实现任务的时候需要写代码,主要完成训练任务的是caffe.exe程序 相关资料: http://blog.csdn.net/menuconfig/article/details/12837173 # LMDB lmdb是openLDAP项目开发的嵌入式(作为一个库嵌入到宿主程序)存储引擎。其主要特性有: 参考:http://www.jianshu.com/p/yzFf8j 在CC中,lmdb是为了加速训练的需要,所以把图片文件通过convert_imageset.exe程序存放到一个lmdb数据库中,然后caffe.exe则读取该lmdb的数据作为训练数据,lmdb一般是在一个文件夹里面,有data.mdb和lock.mdb,如下图: ![](https://box.kancloud.cn/d5b701b4cc21adb98827dd72737e37d2_178x113.png) # 数据集 这里我们指训练时候指定的数据集,有train数据集、val数据集、test数据集 通常我们会把train和val数据集制作为lmdb数据库,即: ![](https://box.kancloud.cn/4ac07e33fa23281b280dc6bc3aa2ec47_92x44.png) 而test数据集,我们只需要保持label-test.txt就好了 |这三个数据集的意义是|| |-|-| train|用来训练的数据集,推荐占全部样本比重95% val|用来训练时候做验证的数据集,推荐占全部样本比重4% test|用来自己写代码测试训练结果模型的数据集,推荐占比1% 这三个数据集是完全不重叠的,就是说,他们之间是没有重复的图片文件。 # LOSS ## 损失、误差 神经网络的训练,是通过正向传播求loss,然后回传loss调整权重完成的。loss就是当前训练进展的主要指标,当loss足够小的时候,表示网络基本训练完成。至于多小,取决于当前任务,一般是0.01以下 # 学习率 ## lr learningrate,学习率 神经网络的训练,是通过正向传播求loss,然后回传loss调整权重完成的。这时候调整权重是根据loss计算然后乘以学习率,就是最终的调整量,所以学习率是控制调整强度的值,也是学习力度的控制,一般我们会给0.01、0.001等值去训练。学习率控制不好,会导致训练过程失败(即loss不下降或者精度不能达标) ![](https://box.kancloud.cn/f572045da397a6d9366f3dc3b423fc75_629x394.png) # 过拟合、欠拟合 ![](https://box.kancloud.cn/fb9aa7afd0901d40858a815e208b0e78_690x347.png) 图1欠拟合 图2完美 图3 过拟合 | 说明|| |-|-| |欠拟合|学习的还不够,表达能力不够好 |过拟合|学习过头了,等于把样本全背下来记下来了,而没有学习应该学的知识,对新样本而言,泛化能力不好。泛化能力即扩展|能力,在新样本上表现的效果的能力 |中间这个|就是我们想要的数据表达模型被正确学习到的时候,这时候模型泛化能力最好,效果最好 # 迭代 指数据传入网络后进行一次前向运算的过程,称为一次迭代 # Batch ## 批次 训练时候,通常会一次一批样本去训练他,综合起来调整loss。这时候迭代一次是用了一批图片 # 数据集转换 ![](https://box.kancloud.cn/687600519eb0eec7769598db4f6342e3_1697x533.png) # 训练 ![](https://box.kancloud.cn/13928f57f121e7f53ded94ba0a1aa12d_1590x901.png) # 迁移学习 ## finetune 又叫模型微调,利用已经训练好的模型,初始化一个新的训练任务。就是说,新任务根据这个旧模型开始学习,这样的学习就有一个很好的起点,就会很快得到好的结果。比如我们会在大数据集上训练一个模型(ImageNet数据集),然后新的小任务数据集上识别的时候,基于该模型去训练,将会很容易得到好的效果。若不这么做,我们新的训练任务通常需要非常大量的样本才能得到好效果。所以这个技术非常有用和关键。称做微调,是因为做迁移学习的时候学习率会比从头训练的学习率要低,表示根据已有模型以低的学习率来微调模型权重,训练新的任务。形象的说,一个模型因为见过很复杂的数据,那么他能够通过微微的调整来适应小的新数据,而且做到很好的效果。 主要的就是--weights这个参数指定的模型 # 暂停恢复 ## resume 训练过程允许中断然后调整参数,然后使用保存的快照继续训练,就是所谓的resume 主要是--snapshot参数指定的solverstate快照实现继续训练 # 使用模型 ![](https://box.kancloud.cn/b52b040a0d69af161ac784f995378aa3_1856x786.png)