Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
HuangQinJian committed Nov 7, 2018
2 parents 1e03a46 + eac7bdf commit cbb21fa
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 27 deletions.
62 changes: 46 additions & 16 deletions ch12_网络搭建及训练/第十二章_网络搭建及训练.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,31 @@
10.1 网络搭建有什么原则?
10.1.1新手原则。
# 第十二章 网络搭建及训练。
## 10.1 网络搭建有什么原则?

### 10.1.1新手原则。

刚入门的新手不建议直接上来就开始搭建网络模型。比较建议的学习顺序如下:
- 1.了解神经网络工作原理,熟悉基本概念及术语。
- 2.阅读经典网络模型论文+实现源码(深度学习框架视自己情况而定)。
- 3.找数据集动手跑一个网络,可以尝试更改已有的网络模型结构。
- 4.根据自己的项目需要设计网络。

10.1.2深度优先原则。
通常增加网络深度可以提高准确率,但同时会牺牲一些速度和内存。
### 10.1.2深度优先原则。

通常增加网络深度可以提高准确率,但同时会牺牲一些速度和内存。但深度不是盲目堆起来的,一定要在浅层网络有一定效果的基础上,增加深度。深度增加是为了增加模型的准确率,如果浅层都学不到东西,深了也没效果。

### 10.1.3卷积核size一般为奇数。

10.1.3卷积核size一般为奇数。
卷积核为奇数有以下好处:
- 1 保证锚点刚好在中间,方便以 central pixel为标准进行滑动卷积,避免了位置信息发生偏移 。
- 2 保证在填充(Padding)时,在图像之间添加额外的零层,图像的两边仍然对称。

10.1.4卷积核不是越大越好。
### 10.1.4卷积核不是越大越好。

AlexNet中用到了一些非常大的卷积核,比如11×11、5×5卷积核,之前人们的观念是,卷积核越大,感受野越大,看到的图片信息越多,因此获得的特征越好。但是大的卷积核会导致计算量的暴增,不利于模型深度的增加,计算性能也会降低。于是在VGG、Inception网络中,利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳,同时参数量(3×3×2+1=19<26=5×5×1+1)被降低,因此后来3×3卷积核被广泛应用在各种模型中。


10.2 有哪些经典的网络模型值得我们去学习的?
## 10.2 有哪些经典的网络模型值得我们去学习的?

提起经典的网络模型就不得不提起计算机视觉领域的经典比赛:ILSVRC .其全称是 ImageNet Large Scale Visual Recognition Challenge.正是因为ILSVRC 2012挑战赛上的AlexNet横空出世,使得全球范围内掀起了一波深度学习热潮。这一年也被称作“深度学习元年”。而在历年ILSVRC比赛中每次刷新比赛记录的那些神经网络也成为了人们心中的经典,成为学术界与工业届竞相学习与复现的对象,并在此基础上展开新的研究。


Expand All @@ -40,7 +47,7 @@ AlexNet中用到了一些非常大的卷积核,比如11×11、5×5卷积核,
>- 2 VGGNet
论文:[Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556)
代码实现:[tensorflow]https://github.com/tensorflow/tensorflow/blob/361a82d73a50a800510674b3aaa20e4845e56434/tensorflow/contrib/slim/python/slim/nets/vgg.py)
代码实现:[tensorflow](https://github.com/tensorflow/tensorflow/blob/361a82d73a50a800510674b3aaa20e4845e56434/tensorflow/contrib/slim/python/slim/nets/vgg.py)
主要特点:
>> - 1.网络结构更深。
>> - 2.普遍使用小卷积核。
Expand All @@ -64,35 +71,58 @@ AlexNet中用到了一些非常大的卷积核,比如11×11、5×5卷积核,
>> 提出了feature recalibration,通过引入 attention 重新加权,可以得到抑制无效特征,提升有效特征的权重,并很容易地和现有网络结合,提升现有网络性能,而计算量不会增加太多。
**CV领域网络结构演进历程:**
![CV领域网络结构演进历程](http://wx2.sinaimg.cn/mw690/005B3ViFly1fwthh0jw58j30q80aldgw.jpg)
![CV领域网络结构演进历程](./img/ch12/网络结构演进.png)

**ILSVRC挑战赛历年冠军:**
![ILSVRC挑战赛历年冠军](http://wx4.sinaimg.cn/mw690/005B3ViFly1fwswhzquw2j31810or78b.jpg)
![ILSVRC挑战赛历年冠军](./img/ch12/历年冠军.png)


此后,ILSVRC挑战赛的名次一直是衡量一个研究机构或企业技术水平的重要标尺。
ILSVRC 2017 已是最后一届举办.2018年起,将由WebVision竞赛(Challenge on Visual Understanding by Learning from Web Data)来接棒。因此,即使ILSVRC挑战赛停办了,但其对深度学习的深远影响和巨大贡献,将永载史册。

10.3 网络训练有哪些技巧吗?
10.3.1.合适的数据集。
## 10.3 网络训练有哪些技巧吗?

### 10.3.1.合适的数据集。

- 1 没有明显脏数据(可以极大避免Loss输出为NaN)。
- 2 样本数据分布均匀。

10.3.2.合适的预处理方法。
### 10.3.2.合适的预处理方法。

关于数据预处理,在Batch Normalization未出现之前预处理的主要做法是减去均值,然后除去方差。在Batch Normalization出现之后,减均值除方差的做法已经没有必要了。对应的预处理方法主要是数据筛查、数据增强等。

10.3.3.网络的初始化。
### 10.3.3.网络的初始化。

网络初始化最粗暴的做法是参数赋值为全0,这是绝对不可取的。因为如果所有的参数都是0,那么所有神经元的输出都将是相同的,那在back propagation的时候同一层内所有神经元的行为也是相同的,这可能会直接导致模型失效,无法收敛。吴恩达视频中介绍的方法是将网络权重初始化均值为0、方差为1符合的正态分布的随机数据。

10.3.4.小规模数据试练。
### 10.3.4.小规模数据试练。

在正式开始训练之前,可以先用小规模数据进行试练。原因如下:
- 1 可以验证自己的训练流程对否。
- 2 可以观察收敛速度,帮助调整学习速率。
- 3 查看GPU显存占用情况,最大化batch_size(前提是进行了batch normalization,只要显卡不爆,尽量挑大的)。

10.3.5.设置合理Learning Rate。
### 10.3.5.设置合理Learning Rate。

- 1 太大。Loss爆炸、输出NaN等。
- 2 太小。收敛速度过慢,训练时长大大延长。
- 3 可变的学习速率。比如当输出准确率到达某个阈值后,可以让Learning Rate减半继续训练。

### 10.3.6.损失函数

损失函数主要分为两大类:分类损失和回归损失
>1.回归损失:
>> - 1 均方误差(MSE 二次损失 L2损失)
它是我们的目标变量与预测值变量差值平方。
>> - 2 平均绝对误差(MAE L1损失)
它是我们的目标变量与预测值变量差值绝对值。
>关于MSE与MAE的比较。MSE更容易解决问题,但是MAE对于异常值更加鲁棒。更多关于MAE和MSE的性能,可以参考[L1vs.L2 Loss Function](https://rishy.github.io/ml/2015/07/28/l1-vs-l2-loss/)

>2.分类损失:
>> - 1 交叉熵损失函数。
是目前神经网络中最常用的分类目标损失函数。
>> - 2 合页损失函数
>>合页损失函数广泛在支持向量机中使用,有时也会在损失函数中使用。缺点:合页损失函数是对错误越大的样本施以更严重的惩罚,但是这样会导致损失函数对噪声敏感。

Original file line number Diff line number Diff line change
Expand Up @@ -77,19 +77,64 @@ Nvidia有面向个人用户(例如GTX系列)和企业用户(例如Tesla系
Nvidia一般每一两年发布一次新版本的GPU,例如2017年发布的是GTX 1000系列。每个系列中会有数个不同的型号,分别对应不同的性能。

## 15.6 软件环境搭建
深度学习其实就是指基于一套完整的软件系统来构建算法,训练模型如何搭建一套完整的软件系统,比如操作系统的选择?安装环境中遇到的问题等等,本节做一个简单的总结。
深度学习其实就是指基于一套完整的软件系统来构建算法,训练模型如何搭建一套完整的软件系统,比如操作系统的选择?安装环境中遇到的问题等等,本节做一个简单的总结。

### 15.6.1 操作系统选择?
针对硬件厂商来说,比如NVIDIA,对各个操作系统的支持都是比较好的 ,比如windows10,linux系列,但是由于linux系统对专业技术人员是非常友好的,所以目前几乎所有的深度学习系统构建都是基于linux的,比较常用的系统如ubuuntu系列,centos系列等等。
针对硬件厂商来说,比如NVIDIA,对各个操作系统的支持都是比较好的 ,比如windows系列,linux系列,但是由于linux系统对专业技术人员比较友好,所以目前几乎所有的深度学习系统构建都是基于linux的,比较常用的系统如ubuuntu系列,centos系列等等。
在构建系统的时候,如何选择合适的操作系是一个刚刚入门深度学习的工作者面临的问题,在这里给出几点建议:
(1)刚刚入门,熟悉windows系统,但是对linux和深度学习都不太熟,这个时候可以基于windows10等系统来做入门学习
(2)简单了解linux的使用,不太懂深度学习相关知识,可以直接基于linux系统来搭建框架,跑一些开源的项目,慢慢研究
(3)熟悉linux,毫无疑问,强烈推荐使用linux系统,安装软件简单,工作效率高
(1)刚刚入门,熟悉windows系统,但是对linux和深度学习都不太熟,这个时候可以基于windows系列系统来做入门学习
(2)简单了解linux的使用,不太懂深度学习相关知识,可以直接基于linux系统来搭建框架,跑一些开源的项目,慢慢深入研究学习
(3)熟悉linux,不熟悉深度学习理论,毫无疑问,强烈推荐使用linux系统,安装软件简单,工作效率高
总之一句话,如果不熟悉linux,就先慢慢熟悉,最终还是要回归到linux系统来构建深度学习系统

### 15.6.2 本机安装还是使用docker?
### 15.6.2 常用基础软件安装?
目前有众多深度学习框架可供大家使用,但是所有框架基本都有一个共同的特点,目前几乎都是基于nvidia的gpu来训练模型,要想更好的使用nvidia的gpu,cuda和cudnn就是必备的软件安装。
1,安装cuda
上文中有关于cuda的介绍,这里只是简单介绍基于linux系统安装cuda的具体步骤,可以根据自己的需要安装cuda8.0或者cuda9.0,这两种版本的安装步骤基本一致,这里以最常用的ubuntu 16.04 lts版本为例:
(1)官网下载,地址
cuda8.0 https://developer.nvidia.com/cuda-80-ga2-download-archive
cuda9.0 https://developer.nvidia.com/cuda-90-download-archive
进入网址之后选择对应的系统版本即可,如下图所示:
![cuda8.0](./img/ch15/cuda8.0.png)
![cuda9.0](./img/ch15/cuda9.0.png)

### 15.6.3 GPU驱动问题
(2)命令行中进入到cuda所在的位置,授予运行权限:
cuda8.0: sudo chmod +x cuda_8.0.61_375.26_linux.run
cuda9.0: sudo chmod +x cuda_9.0.176_384.81_linux.run

(3)执行命令安装cuda:
cuda8.0: sudo sh cuda_8.0.61_375.26_linux.run
cuda9.0: sudo sh cuda_9.0.176_384.81_linux.run
之后命令之后下面就是安装步骤,cuda8.0和cuda9.0几乎一致:
1) 首先出现cuda软件的版权说明,可以直接按q键跳过阅读

2) Do you accept the previously read EULA?
accept/decline/quit: **accept**

3) Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: **no**

4) Install the CUDA 9.0 Toolkit?
(y)es/(n)o/(q)uit: **yes**

5) Enter Toolkit Location
[ default is /usr/local/cuda-9.0 ]: 直接按enter键即可

6)Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: **yes**

7) Install the CUDA 9.0 Samples?
(y)es/(n)o/(q)uit: **yes**

以上步骤基本就是cuda的安装步骤。


2,安装cudnn
cudnn是nvidia的专门针对深度学习的加速库。。。

### 15.6.3 本机安装还是使用docker?

### 15.6.4 GPU驱动问题

## 15.7 框架选择

Expand All @@ -102,6 +147,13 @@ Nvidia一般每一两年发布一次新版本的GPU,例如2017年发布的是G
* Tensorflow

* PyTorch
pytorch是Facebook于2017年才推出的深度学习框架,相对于其它框架,算是比较晚的了,但是这个同时也是优势,在设计的时候就会避免很多之前框架的问题,所以一经推出,就收到大家极大的欢迎
优点:接口简洁且规范,和python无缝结合,代码设计优秀且易懂,社区非常活跃,官方修复bug及时
缺点: 目前模型在工业界部署相对其它框架稍有劣势,不过后续的pytorch1.0版本应该会有很大改善,和caffe2合并后,caffe2的优秀的模型部署能力可以弥补这个不足
相关资源链接:
(1)官网教程:https://pytorch.org/tutorials/
(2)基于pytorch的开源项目汇总:https://github.com/bharathgs/Awesome-pytorch-list
(3)

* Keras

Expand Down Expand Up @@ -158,7 +210,7 @@ mxnet的最知名的优点就是其对多GPU的支持和扩展性强,其优秀

* Tensorflow

* PyTorch
* PyTorch


### 15.8.2 是不是可以分布式训练?
Expand Down Expand Up @@ -234,9 +286,7 @@ keras是一种高层编程接口,其可以选择不同的后端,比如tensor
缺点: 封装的太好了导致不理解其技术细节

3,pytorch:
pytorch是Facebook于2017年才推出的深度学习框架,相对于其它框架,算是比较晚的了,但是这个同时也是优势,在设计的时候就会避免很多之前框架的问题,所以一经推出,就收到大家极大的欢迎
优点:接口简洁且规范,和python无缝结合,代码设计优秀且易懂,社区非常活跃,官方修复bug及时
缺点: 目前模型在工业界部署相对其它框架稍有劣势,不过后续的pytorch1.0版本应该会有很大改善,和caffe2合并后,caffe2的优秀的模型部署能力可以弥补这个不足


4,caffe2:
caffe2是在caffe之后的第二代版本,同属于Facebook。。。
Expand Down

0 comments on commit cbb21fa

Please sign in to comment.