2019-09-28 13:49:29 OpenSceneGraph 阅读数 213
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39732 人正在学习 去看看 唐宇迪

无论是基于局部颜色扩展的着色方法,还是基于颜色传递的着色方法,都是具有一定的局限性,而将深度学习的思想应用于图像着色中,可以对于传统着色方法的局限性有针对性的进行改进。利用深度神经网络和彩色图像数据集训练出模型,便可根据模型来着色其他黑白图像,无须人为因素或其他因素影响。

基于深度学习的图像着色方法大致为以下四个步骤:

制作数据集:大部分的深度学习算法都需要海量的数据集作为数据驱动,通过算法来学习海量数据中的特征,图像着色也不例外,需要大量的彩色图像作为方法的驱动力,并且数据集的质量会直接影响到最终得出的深度学习的模型的质量。因此制作数据集为流程的第一步,需要海量、颜色分明、高质量的彩色图像。

网络设计:随着深度学习技术的发展,神经网络的设计方法也越来越多。例如深度神经网络(Deep Neural Network, DNN)、卷积神经网络(Convolutional Neural Network, CNN)、残差神经网络(Residual Neural Network, resNet)、循环神经网络(Recurrent Neural Networks, RNN)、密集神经网络(Dense neural network,DNN)等其他神经网络,而基于卷积神经网络(CNN)又演变出的其他神经网络,例如残差神经网络(Residual Neural Network, ResNet)和深度卷积对抗生成网络(Deep Convolutional Generative Adversarial Networks)DCGANs。除了神经网络的设计方式之外,网络深度、卷积核大小、卷积步长、激活函数、残差块设计等都会给神经网络提取特征的能力造成不同的影响。

网络学习:数据集是网络的驱动力,网络是数据的载体,网络的目的就是为了学习出数据集中研发者想要的特征,有关图像的深度学习算法是对图像的大量矩阵运算,因此硬件设备也制约着网络学习的时间长短程度。

得出模型:根据事先预定的损失函数范围和训练的次数,在损失和训练次数都达到既定的范围之后,可以得到着色图像的深度学习模型,并且可以用此模型来为其他图像着色,图像的着色质量和模型的质量息息相关,因此排除了人为因素的影响。根据此模型,可以做成 web 接口供外部网络访问,也可以做成批量着色系统用于工业生产。如果对此模型不满意,还可以将次模型用于微调(Fine-Tuning)或者迁移学习(Transfer Learning)。 

卷积神经网络:卷积神经网络是由人工神经网络演变而来,目前已经广泛的应用在图像识别、音频处理和自然语言处理等重要领域中。卷积神经网络中的权值是共享的,相比于多层感知器和深度信念网络来说,它的网络参数较少,降低了学习过程中的成本。卷积神经网络在处理图像时,具有平移不变性、倾斜不变性、缩放不变性及其他形式形变的不变性。卷积神经网络一般由数据输入层(Input layer)、卷积层(Convolution layer)、池化层(Pooling layer)、全连接层(Fully Connection layer)及输出层(Output layer)构成,这也决定了卷积神经网络良好的特性。开始训练时,网络从输入层输入二维图像,卷积层主要对图像进行卷积操作,提取图像的特征,为了减少参数和计算量,池化层会对提取的特征进行降维,全连接层在分类任务中起到“分类器”的作用,而输出层是由网络目的和结构所决定的。卷积神经网络的卷积层和池化层的操作一般是为了对图像的特征进行提取和映射,在进行特征提取时,卷积核会将上一层的特征图全部卷积一次,因此上一层的每个位置都是被同样的卷积核卷积过的,所以权重也是一样的,因此卷积神经网络中的卷积核不会与前一层的神经单元全部连接,参数也自然而然的大大减少。近年来,在 ILSVRC(ImageNet  Large  Scale  Visual  Recognition  Competition),ImageNet等大规模图像识别挑战赛上,出现了 AlexNet、VGG、GoogleNet、ResNet 等一大批基于卷积神经网络的优秀网络,并将 Top5 的错误率已经降到 5%以下,这足以说明卷积神经网络的有效性。 

深度学习根据训练数据是否拥有标记信息,学习任务可大致划分为监督学习和无监督学习两类,分类和回归是前者的代表,而聚类则是后者的代表。基于深度学习的灰度图像着色算法属于有监督学习,利用现有的大量彩色图像作为参照进行训练,实现最终着色。基于密集神经网络的灰度图像着色算法研究,引入密集神经网络,利用其信息提取率和特征利用率高的特性,结合分类指导及损失优化,使输出彩色图像的细节特征更为丰富、轮廓更为清晰,进而达到更好的着色效果。

基于对抗生成网络:生成对抗结构网络由 Goodfellow等人提出,启发自博弈论中的二人零和博弈,网络的整个训练过程是处在对抗和博弈的交替中进行的。生成对抗网络(Generative Adversarial Networks,  GAN)属于无监督学习网络,由一个生成器和一个判别器组成,生成器的参数更新都由判别器指导。故其包含了两个部分,生成网络和判别网络。生成网络负责捕捉样本的数据分布,判别网络负责区别真实的样本数据和生成的样本数据。生成网络G 和判别网络D 实际上是在优化二元极小极大博弈(minimax two-player game)问题。 

基于残差神经网络:深度卷积神经网络的提出引发了图像分类方法的一系列突破,网络的表达能力随网络深度的增加而增加。但是由于神经网络的反向传播需要各层之间的梯度信息,因此随着神经网络层数的加深,会逐渐出现梯度为零的情况,这从根本上妨碍了网络的收敛。虽然这些问题已有一定的解决方案,如规范初始化和引入中值规范化层或 BN 层,来解决多层网络梯度消失问题,但是另一个“退化”的问题也紧接着暴露出来。何凯明的实验证明,时间复杂度相同的网络结构,深度较深的网络性能会有相对的提升。但是,卷积神经网络也不是层数越多性能就越好,层数加深后,训练网络时计算能力会加大,训练成本相应提升。如图所示,随着网络层数的增加,其性能不但没有提升,反而出现了显著的退化。

残差神经网络(resnet)的出现很好的解决了以上问题,卷积神经网络学习的是无参考的函数,用少数的几个隐含层拟合出网络最终所期望的实际函数映射关系,而残差神经网学习的是其残差函数映射,这种方式显著地改进了卷积神经网络的网络结构,它可以将多层网络组合起来,拟合成一个残差函数。残差神经网络训练速度更快,训练成本更小,更重要的是,随着网络层数的加深,网络的性能会得到显著的提升。经实验证明,这样的残差结构在提取图像特征方面是有显著效果的,在 ILSVRC2015 大赛上,ResNet 成功的将 ImageNet 分类的 top-5 error 降到了 3.57%。 

基于深度学习的图像着色算法研究与实现_成梓锐

2017-04-21 12:18:35 WZZ18191171661 阅读数 1493
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39732 人正在学习 去看看 唐宇迪

随着“大数据时代”的到来和计算能力的提升,深度学习成为了一种很火的新科技。已经成功的应用到了很多个领域中。包括“计算机视觉”“语音识别”“自然语言处理”等。为了进行高效的开发一个深度学习系统,许多大型科技公司都推出了自己的深度学习框架。而且,最近这段时间接二连三的有新的“深度学习”框架推出。自己感觉有必要做一个总结,来收集一下这些深度学习框架。

但是,在此同时,我有一个问题,真的需要这么多的深度学习框架吗?在科技领域为什么看不到合作呢?众多的深度学习框架,企业和个人如何选择一个适合自己的框架呢?

以下,我将围绕着几个问题展开整篇博客的内容。

1、前言

首先,让我们看一下,当前都有哪些深度学习框架?我会列出相应的链接,方便大家的访问。(我会不断地更新这个列表)

1.Tensorflow – https://www.tensorflow.org/
github – https://github.com/tensorflow/tensorflow

2.Caffe – http://caffe.berkeleyvision.org/
github – https://github.com/BVLC/caffe

3.Theano – http://deeplearning.net/software/theano/install.html
github – https://github.com/Theano/Theano

4.keras – https://keras.io/
github – https://github.com/fchollet/keras

5.Torch – http://torch.ch/
github – https://github.com/torch/torch7

6.Lasagne – http://lasagne.readthedocs.io/en/latest/
github – https://github.com/Lasagne/Lasagne

7.MXNet – http://mxnet.io/
github – https://github.com/dmlc/mxnet

8.DIGITS – https://developer.nvidia.com/digits
github – https://github.com/NVIDIA/DIGITS

9.CNTK – https://cntk.codeplex.com/
github – https://github.com/Microsoft/CNTK

10.PaddlePaddle – http://www.paddlepaddle.org/
github – https://github.com/PaddlePaddle/Paddle

11.Deeplearning4j – https://github.com/deeplearning4j/
deeplearning4j

12.tensorlayer – http://tensorlayer.readthedocs.io/en/latest/
github – https://github.com/zsdonghao/tensorlayer

13.TFLearn – http://tflearn.org/tutorials/
githu – https://github.com/tflearn/tflearn

14.caffe2 – https://caffe2.ai/
github – https://github.com/caffe2/caffe2

15.pytorch – http://pytorch.org/
github – https://github.com/pytorch/pytorch

16.Leaf – http://autumnai.com/leaf/book/
github – https://github.com/autumnai/leaf

17.Chainer – http://chainer.org/
github – https://github.com/pfnet/chainer

18.DSSTNE
github – https://github.com/amznlabs/amazon-dsstne

19.Neon
github – https://github.com/NervanaSystems/neon

2、性能分析

接下来,让我们简单的比较一下它们的性能,能存在总会有理由的,它们都有自己的特点。
以下的表格是一个有关于各个深度学习框架的一个对比:

这里写图片描述

注:
1.从这个表格我们可以看出,当前比较受欢迎的深度学习框架包括:tensorflow、caffe、keras、CNTK、MXNet、Torch、Theano。工业界中常用的包括:tensorflow、caffe、CNTK、MXNet、Torch。学术界常用的包括:keras、theano。

2.这个表格中的部分数据来自于互联网,可能存在着一定的误差吗,但是总的来说具有一定的参考价值。

3、问题探讨

通过上面的表格,我们会发现有很多的深度学习框架。那么,我们该如何选择一个适合自己的深度学习框架呢?你需要根据你自己的实际需要选择合适的框架。需要考虑的主要因素包括:开发语言、硬件平台、操作系统等

> a. 开发语言
> 通过上面的表格我们可以总结出深度学习支持的开发语言包括:
>Python/C++/R/Julia/Scala/Go/Javascript/Perl/Matlab
>/Lua/Cuda/JAVA/Rust等。但是最常用的两种开发语言是:Python和C++。主要的原因如下所示:
> 
> 1) python非常简单,很容易上手,但是运行的效率比较低,因此常用来快速的搭建深度学习中的网络模型。
> 2)C++的语法众多,需要自己分配并处理内容,开发代码冗长,但是运行效率很高,因此常用来作为深度学习中的终端引擎来使用。
> 如果你自己不熟悉Python或者C++,你可以使用的框架就非常的有限;
> 如果你熟悉Python或者C++,你几乎可以使用任何一种深度学习框架;
> 如果你是一名JAVA爱好者,你更可能会选择利用Deeplearning来进行开发。
> 
> 因此,开发语言是一个限制你使用深度学习框架的一个关键因素。你需要根据你自己的实际情况选择。
> 
> b. 硬件平台
> 通过上面这个表格,我们可以总结出当前的深度学习框架支持的硬件平台包括:CPU、GPU、Andriod、IOS、FPGA、ARM等多种平台。
> 如果你的电脑不支持GPU,你就只能选择其他的平台;
> 如果你自己擅长GPU,你可以使用的框架就很多;
> 如果你的项目制定的硬件是FPGA,你能使用的框架就会受到限制。
> 
> 因此,这也是一个限制你使用框架的关键因素。你需要根据自己的需要以及项目的需要去进行选择。
> 
> c. 操作系统
> 当前,这些框架支持的系统主要包括:Linux、Mac、Windows。几乎包括了所有的操作系统。但是对应不同的框架所支持的操作系统有很多不同。
> 如果你熟悉Linux系统,那么你几乎可以使用任何一个框架。
> 如果你想在Windows下使用这些框架,那么你就会受到很大的限制。同时会出现很多莫名其妙的问题。
> 
> 因此,你需要选择一个合适的操作系统,这可能会影响你的开发进程和使用的框架的数目。
> 
> d. 分布式系统
> 分布式系统可以将一个很大的任务分割开来,在不同的主机上进行运行,这可以大大的提高训练的速率,加快整个开发的过程。这对于大模型的训练具有至关重要的作用。当前对分布式系统有很好的支持的框架包括:tensorflow、CNTK、MXNet、Torch、Caffe。都有强大的后台。
> 如果你训练的数据量很少,你可以选择使用单片CPU或者单片GPU;
> 如果你训练的数据量较大,你可以选择使用多块CPU或者多块GPU;
> 如果你训练的数据量很大,你就需要使用到云服务器或者一个分布式系统集群。
>
> 因此,这也是一个影响你选择框架的一个因素。
> 总之,你需要综合考虑多个因素选择一个合适的深度学习框架。

  1. 这里我想要提出一个问题!!
> 我的问题是:为什么不能将这些框架整合起来,做一个大的框架,支持所有的系统,支持所有的语言,支持所有的平台,最重要的是只要一个?
> 这里的框架水平不一,但是它们的存在是由理由的。它们或多或少的都有自己的优势,何必单干呢。深度学习已经是一个趋势,应该建立一个国际组织,负责制定一个标准,收集他们的长处,做一个高性能的框架,这样不是更高效嘛。使用者也不再需要纠结使用哪一种框架。开发商也不需要进行独自的开发,维护。同时可以让更多的爱好者来共同维护它。这可能需要时间吧!希望这个愿望可以实现!

注意事项
[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注。
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
**[4] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!**
2018-10-12 16:04:15 dss875914213 阅读数 1075
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39732 人正在学习 去看看 唐宇迪

本章内容:

  1. 基本概念的定义
  2. 机器学习发展的时间线
  3. 深度学习日益流行的关键因素及其未来潜力

1.1 人工智能、机器学习与深度学习

1.1.1 人工智能

人工智能定义:努力将通过由人类完成的智力任务自动化。

硬编码规则

符号主义人工智能(symbolic AI)  专家系统(expert system)

机器学习(machine learning)

1.1.2 机器学习

新的编程范式:输入数据和这些数据中预期得到的答案,输出规则。

机器学习与数理统计密切相关。

机器学习工程导向,理论较少。

1.1.3 从数据中学习表示

三个要素进行机器学习

  1. 输入数据点
  2. 预期输出的示例
  3. 衡量算法效果好坏的方法

深度学习和机器学习核心问题:有意义地变换数据。表征数据或将数据编码

机器学习中的学习:寻找更好数据表示的自动搜索过程。坐标变换、线性投影、平移、非线性操作。

机器学习的技术定义:在预先定义好的可能性空间中,利用反馈信号的指引来寻找输入数据的有用表示。

1.1.4 深度学习之“深度”

深度学习的深度指:一系列连续的表示层。

别称:分层表示学习(layered representations learning) ,层级表示学习(hierarchical representations learning)

浅层学习(shallow learning):其他机器学习,仅有一两层数据。

将深度网络看作多级信息蒸馏操作:信息穿过连续的过滤器,其纯度越来越高。

深度学习技术定义:学习数据表示的多级方法。

1.1.5 用三张图理解深度学习的工作原理

权重,参数化(parameterize),参数(parameter),学习

损失函数(loss function),目标任务(objective function)

基本技巧:利用距离值作为反馈信号来对权重值进行微调。

优化器(optimizer),反向传播(backpropagation)

训练循环(training loop)

1.1.6 深度学习已经取得的进展

在视觉和听觉等感知问题取得很好的成果。

取得的突破

  1. 接近人类水平的图像分类
  2. 接近人类水平的语音识别
  3. 接近人类水平的手写文字转录
  4. 更好的机器翻译
  5. 更好的文本到语言转换
  6. 数字助理
  7. 接近人类水平的自动驾驶
  8. 更好的广告定向投放
  9. 更好的网络搜素结果
  10. 能够回答用自然语言提问的问题
  11. 在围棋上战胜人类

1.1.7 不要相信短期炒股

短期技术不能医用,可能投资资金会停止。

之前已经经历了2次人工智能冬天。

1.1.8 人工智能的未来

短期期望可能不切实际,但长远来看前景是光明的。

目前技术只是生活的陪衬。


1.2 深度学习之前:机器学习简史

1.2.1 概率模型(probabilistic modeling)

例:

朴素贝叶斯算法,假设:数据特征独立。

logistic回归:是分类算法。数据科学家首先会用这个算法,以便初步熟悉手头分类任务。

1.2.2 早期神经网络

1989年,卷积与反向传播算法相结合。

1.2.3 核方法(kernel method)

支持向量机(SVM,support vector machine):决策边界(decision boundary)

SVM通过两步来寻找决策边界

  1. 将数据映射到一个新的高维表示
  2. 让超平面与每个类别最近的数据点之间的距离最大化  间隔最大化(maximizing the margin)

核技巧(kernel trick)

核函数(kernel function)

需要先做:特征工程

SVM难扩展到大型数据集

1.2.4 决策树(decision tree)、随机森林与梯度提升机

随机森林(random forest):建立许多决策树,然后将他们的输出集成在一起。

梯度提升机(gradient boosting machine):目前处理非感知数据最好的算法。

1.2.5 回到神经网络

计算机视觉

图像分类挑战赛(ImageNet):2015:96.4%

1.2.6 深度学习有何不同

不需要设计特征工程

深度学习:模型可以在同一时间共同学习所有表示层,并不是依次连续学习(贪婪学习)

基本特征:

  1. 通过渐进的、逐层的方式形成越来越复杂的表示
  2. 对中间这些渐进的表示共同进行学习

1.2.7 机器学习现状

Kaggle

XGBoost

Keras


1.3 为什么是深度学习,为什么是现在

深度学习用于机器视觉,关键思想:卷积神经网络和反向传播。

长短期记忆(LSTM,long short-term memory)

主要推动力

  1. 硬件
  2. 数据集和基准
  3. 算法上的改进

1.3.1 硬件

深度学习网络主要由许多小矩阵乘法组成,具有高度并行化。

GPU,TPU

CUDA

1.3.2 数据

深度学习是蒸汽机车,数据是煤炭。

Flickr网络生成图像标签

YouTube视频

维基百科:自然语言处理

1.3.3 算法

之前,随着层数增加,神经网路反馈信号消失。

改进

  1. 激活函数(activation function)
  2. 权重初始化方案(weight-initialization scheme)
  3. 优化方案(optimization scheme)
  4. 批标准化、残差连接和深度可分离卷积

1.3.4 新的投资热潮

钱:1900万$   到   3.94亿$不包括Google公司内部的现金流

1.3.5 深度学习的大众化

之前C++和CUDA

现在Python  Theano  Tensorflow  Keras

1.3.6 这种趋势会持续吗

深度学习核心概念

  1. 简单
  2. 可扩展性
  3. 多功能与可复用

科学发展S形曲线。


 

2018-11-19 20:58:47 Harpoon_fly 阅读数 185
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39732 人正在学习 去看看 唐宇迪

为什么深度学习会兴起?(Why is Deep Learning taking off?)

本节视频主要讲了推动深度学习变得如此热门的主要因素。包括数据规模、计算量及算法的创新。(3个重点概念!请背书!)

深度学习和神经网络之前的基础技术理念已经存在大概几十年了,为什么它们现在才突然流行起来呢?对啊,为什么?看过我之前文章:人工智能的冷落与兴起,那么你就会了解发展历程了,但是这个深度学习为什么会独引爆全场呢?

本节课程主要讲述一些使得深度学习变得如此热门的主要驱动因素,这将会帮助你在你的组织机构内发现最好的时机来应用这些东西。

在过去的几年里,很多人都问为什么深度学习能够如此有效。当回答这个问题时,通常给他们画个图,在水平轴上画一个形状,在此绘制出所有任务的数据量,而在垂直轴上,画出机器学习算法的性能。比如说准确率体现在垃圾邮件过滤或者广告点击预测,或者是神经网络在自动驾驶汽车时判断位置的准确性,根据图像可以发现,如果你把一个传统机器学习算法的性能画出来,作为数据量的一个函数,你可能得到一个弯曲的线,就像图中这样,它的性能一开始在增加更多数据时会上升,但是一段变化后它的性能就会像一个高原一样。假设你的水平轴拉的很长很长,它们不知道如何处理规模巨大的数据,而过去十年的社会里,遇到的很多问题只有相对较少的数据量。

图片描述(最多50字)

大量的数据

多亏数字化社会的来临,现在的数据量都非常巨大,我们花了很多时间活动在这些数字的领域,比如在电脑网站上、在手机软件上以及其它数字化的服务,它们都能创建数据,同时便宜的相机被配置到移动电话,还有加速仪及各类各样的传感器,同时在物联网领域我们也收集到了越来越多的数据(对哎,什么是物联网?有兴趣么?去查下就清楚了)。仅仅在过去的20年里对于很多应用,我们便收集到了大量的数据,远超过机器学习算法能够高效发挥它们优势的规模。

神经网络计算量

神经网络展现出的是,如果你训练一个小型的神经网络,那么这个性能可能会像下图黄色曲线表示那样;如果你训练一个稍微大一点的神经网络,比如说一个中等规模的神经网络(下图蓝色曲线),它在某些数据上面的性能也会更好一些;如果你训练一个非常大的神经网络,它就会变成下图绿色曲线那样,并且保持变得越来越好。

因此可以注意到两点:如果你想要获得较高的性能体现,那么你有两个条件要完成,

第一个是你需要训练一个规模足够大的神经网络,以发挥数据规模量巨大的优点,

另外你需要能画到轴的这个位置,所以你需要很多的数据。

因此我们经常说规模一直在推动深度学习的进步,这里的规模指的也同时是神经网络的规模,我们需要一个带有许多隐藏单元的神经网络,也有许多的参数及关联性,就如同需要大规模的数据一样。事实上如今最可靠的方法来在神经网络上获得更好的性能,往往就是要么训练一个更大的神经网络,要么投入更多的数据,这只能在一定程度上起作用,因为最终你耗尽了数据,或者最终你的网络是如此大规模导致将要用太久的时间去训练,但是仅仅提升规模的的确确地让我们在深度学习的世界中摸索了很多时间。为了使这个图更加从技术上讲更精确一点,我在轴下面已经写明的数据量,这儿加上一个标签(label)量,通过添加这个标签量,也就是指在训练样本时,我们同时输入和标签,接下来引入一点符号,使用小写的字母表示训练集的规模,或者说训练样本的数量,这个小写字母就横轴结合其他一些细节到这个图像中。

在这里插入图片描述

在这个小的训练集中,各种算法的优先级事实上定义的也不是很明确,所以如果你没有大量的训练集,那效果会取决于你的特征工程能力,那将决定最终的性能。假设有些人训练出了一个SVM(支持向量机)表现的更接近正确特征,然而有些人训练的规模大一些,可能在这个小的训练集中SVM算法可以做的更好。

因此你知道在这个图形区域的左边,各种算法之间的优先级并不是定义的很明确,最终的性能更多的是取决于你在用工程选择特征方面的能力以及算法处理方面的一些细节,只是在某些大数据规模非常庞大的训练集,也就是在右边这个会非常的大时,我们能更加持续地看到更大的由神经网络控制的其它方法,因此如果你的任何某个朋友问你为什么神经网络这么流行,我会鼓励你也替他们画这样一个图形。

所以可以这么说,(划重点)在深度学习萌芽的初期,数据的规模以及计算量,局限在我们对于训练一个特别大的神经网络的能力,无论是在CPU还是GPU上面,那都使得我们取得了巨大的进步。但是渐渐地,尤其是在最近这几年,我们也见证了算法方面的极大创新。许多算法方面的创新,一直是在尝试着使得神经网络运行的更快。

算法的创新

作为一个具体的例子,神经网络方面的一个巨大突破是从sigmoid函数转换到一个ReLU函数,这个函数我们在之前的课程里提到过。

在这里插入图片描述

如果你无法理解刚才我说的某个细节,也不需要担心,可以知道的一个使用sigmoid函数和机器学习问题是,在这个区域(左右两侧靠近边缘),也就是这个sigmoid函数的梯度会接近零,所以学习的速度会变得非常缓慢,因为当你实现梯度下降以及梯度接近零的时候,参数会更新的很慢,所以学习的速率也会变的很慢,

在这里插入图片描述

而通过改变这个被叫做激活函数的东西,神经网络换用这一个函数,叫做ReLU的函数(修正线性单元),ReLU它的梯度对于所有输入的负值都是零,因此梯度更加不会趋向逐渐减少到零。而这里的梯度,这条线的斜率在这左边是零,仅仅通过将Sigmod函数转换成ReLU函数,便能够使得一个叫做梯度下降(gradient descent)的算法运行的更快,这就是一个或许相对比较简单的算法创新的例子。

但是根本上算法创新所带来的影响,实际上是对计算带来的优化,所以有很多像这样的例子,我们通过改变算法,使得代码运行的更快,这也使得我们能够训练规模更大的神经网络,或者是多端口的网络。即使我们从所有的数据中拥有了大规模的神经网络,快速计算显得更加重要的另一个原因是,训练你的神经网络的过程,很多时候是凭借直觉的,往往你对神经网络架构有了一个想法,于是你尝试写代码实现你的想法,然后让你运行一个试验环境来告诉你,你的神经网络效果有多好,通过参考这个结果再返回去修改你的神经网络里面的一些细节,然后你不断的重复上面的操作,当你的神经网络需要很长时间去训练,需要很长时间重复这一循环,在这里就有很大的区别,根据你的生产效率去构建更高效的神经网络。当你能够有一个想法,试一试,看效果如何。

在10分钟内,或者也许要花上一整天,如果你训练你的神经网络用了一个月的时间,有时候发生这样的事情,也是值得的,因为你很快得到了一个结果。在10分钟内或者一天内,你应该尝试更多的想法,那极有可能使得你的神经网络在你的应用方面工作的更好、更快的计算,在提高速度方面真的有帮助,那样你就能更快地得到你的实验结果。这也同时帮助了神经网络的实验人员和有关项目的研究人员在深度学习的工作中迭代的更快,也能够更快的改进你的想法,所有这些都使得整个深度学习的研究社群变的如此繁荣,包括令人难以置信地发明新的算法和取得不间断的进步,这些都是开拓者在做的事情,这些力量使得深度学习不断壮大。

下图也就是一般的实现思路,有想法 到 写代码实现 到 实验验证,得到结果,然后改进想法,循环往复。。。(运气好的话,可以很快实现的)

在这里插入图片描述

好消息是这些力量目前也正常不断的奏效,使得深度学习越来越好。研究表明我们的社会仍然正在抛出越来越多的数字化数据,或者用一些特殊的硬件来进行计算,比如说GPU,以及更快的网络连接各种硬件。我非常有信心,我们可以做一个超级大规模的神经网络,而计算的能力也会进一步的得到改善,还有算法相对的学习研究社区连续不断的在算法前沿产生非凡的创新。根据这些我们可以乐观地回答,同时对深度学习保持乐观态度,在接下来的这些年它都会变的越来越好。

2018-12-03 14:09:14 weixin_43896398 阅读数 84
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39732 人正在学习 去看看 唐宇迪

在Starter Bundle第10章中,我们提到了训练一个神经网络模型所需要的四个因素,即:

  • 数据集
  • loss函数
  • 神经网络结构
  • 优化算法

有了这四个因素,实际上我们是可以训练任何深度学习模型,但是,我们如何训练得到一个最优的深度学习模型?如果效果达不到理想效果,又该如何去优化模型?

在深度学习实践中,你会发现,深度学习最难的部分其实是如何根据模型的准确性/损失曲线来进行下一步操作。如果模型的训练错误率太高,该如何处理?如果模型的验证错误率很高,又该如何处理?当验证错误率与训练错误率相差不大,而测试集错误率很高,这又该如何处理?

在这一章中,我们将讨论深度学习在应用时的一些技巧,首先是经验准则,根据经验准则来优化模型。然后是决策准则,根据决策准则来决定是从头开始训练深度学习模型还是应用迁移学习。通过本章内容,你将会对专业的深度学习实践者在训练他们自己的网络时使用的经验法则有一个很好的理解。

训练准则

以下内容主要来自于在第30届神经信息处理系统大会(NIPS 2016)中,吴恩达教授发表演讲:《利用深度学习开发人工智能应用的基本要点(Nuts and Bolts of Building Applications using Deep Learning)》。这次演讲的主要内容是:你应该怎样将深度学习用于你的业务、产品或科研?高扩展性的深度学习技术的兴起正在改变人们解决人工智能问题的最佳方式。这包括:如何定义你的训练/开发/测试(train/dev/test)分配,如何组织你的数据,应该如何在各种有希望的模型架构中选择你研究所需的架构,以及甚至你可以怎样开发新的人工智能驱动的产品。在这个 tutorial 中,你将了解到这个新兴领域中涌现出的最佳实践。你还将了解当你的团队在开发深度学习应用时,如何更好地组织你和你的团队的工作。

在构建深度学习应用中,大多数的问题都是训练数据集与测试数据集的分布不相似,当然,有些情况下,两者分布是一致的。但是,在实际中,你会发现往往训练数据集和测试数据集的分布是不同的– Andrew Ng (summarized by Malisiewicz)

Ng和Malisiewicz都提到的是,你应该确保你的训练数据能够代表你的验证集和测试集,也就是说训练数据集和验证数据集、测试数据集类似于同分布的。我们知道数据获取、数据注释和数据标记是一个非常耗时的工作,甚至也是一个昂贵的工作。在某些情况下,深度学习方法很好的进行应用,但是,并不是所有机器学习模型产品都可以获得成功。

例如,假设我们的任务是构建一个深度学习系统,主要功能是识别由摄像机抓拍到行驶在道路上的车辆的类型和品牌。如图8.1左所示:

图8.1 左:真实的车辆数据, 右:训练数据的部分样本

第一步是收集我们的训练数据集。为了加快数据收集过程,我们从相关网上爬取车辆的图片、车型号以及对应的车辆品牌信息——比如Autotrader.com, eBay, CarMax等等。

通过爬取数据,我们不用花费大量的时间在数据标记工作中。然后我们将这个数据集分成两部分:训练集和验证集,接着,对训练数据训练一个深度学习模型,使其达到较高的精度(> 90%)。

然而,当我们将训练好的模型应用到示例图像(如图8.1(左))中时,我们发现结果很糟糕——在实际应用中,我们只获得了5%的准确率。这是为什么呢?

主要原因在于我们的数据,我们从网上爬取的的训练数据集与实际生活中的数据不一致,从Autotrader, CarMax和eBay上爬取的数据(如图8.1,右)并不能代表测试数据集(如图8.1左)。虽然我们的深度学习系统可以很好地识别出像图8.1右的车辆的品牌和类型,但它不能识别出实际生活中摄像头抓拍到的车辆的品牌和类型,比如图8.1左。

如果你希望深度学习系统在给定的真实环境中能够获得高准确度,那么请确保这个深度学习系统是针对其实际应用的真实图像数据集进行训练的——否则你可能会得到很差的性能。

假如我们已经收集了足够的训练数据集,这些数据代表了我们正在尝试解决的分类任务,Andrew Ng提供了一个四步过程来帮助我们进行训练[34]。

图8.2 Andrew Ng提供了一个四步过程

从图8.2可以看出,Ng在训练深度学习模型时将数据分割成了四组:

  • 训练数据集
  • 训练-验证数据集 (也就是Ng提到的开发数据集)
  • 验证集
  • 测试集

前面,我们训练模型时使用到了训练数据集,验证数据集和测试数据集,原本是只有三组数据集,这里提到了一种新的数据集——”训练-验证“数据集,这种新的“训练-验证”数据集是什么呢?Ng建议我们将所有的数据按照6-4划分,即60%用于训练和40%用于测试。然后再将测试数据分成两部分:一部分用于验证,另一部分用于真正的测试(这一部分数据是当做完全未知的)。接着,我们从训练集中取出一小部分,并将其添加到我们的“训练-验证集”中。训练集主要用来评估模型的偏差,而训练-验证集主要用来评估模型的方差。比如:

假设你想要为一个汽车后视镜产品,开发语音识别系统。你有 5000 小时的普通语音数据,还有 10 小时的车内数据。你怎么对数据分组呢?这是一个不恰当的方式:

更好的方式:让开发和测试集来自同样的分配机制。

图8.3
  • 如果模型的训练错误率太高

如图8.3左上角所示,那么我们可以考虑通过添加更多的层和神经元来加深我们当前的模型结构。我们也可以考虑加大训练时间(比如训练更多的epochs)并调整我们的学习率——使用更小的学习率可以让你训练更长时间,同时有助于防止过拟合。如果对当前的模型结构和学习率进行了多次实验之后,发现并没有多大作用,那么我们可能需要尝试一种完全不同的模型结构。

  • 如果模型的训练-验证错误率很高

如图8.3右上角所示,一般而言,这种情况往往是模型发生了过拟合现象,可以考虑对模型加入正则化技术。比如使用Dropout技术,或者使用数据增强来增加数据量,或者对loss函数增加正则化项。当然我们需要通过实验来衡量哪种正则化技术好或者哪几种组合使用较好。

您还可以考虑收集更多的训练数据(再一次注意这些训练数据需要与实际数据相符合)——一般情况下,训练数据当然是越多越好。若还无法达到想要的效果,这时候可能需要考虑尝试一种完全不同的模型结构。

  • 如果模型的训练-验证错误率很低,但是验证集错误率很高

如图8.3左下角所示,一般这种情况,我们需要更仔细地检查我们的训练数据。训练数据是否与验证数据相似?

我们都知道,如果训练数据集与验证数据集、测试数据集的分布不同,那么我们训练再好的深度学习模型都无法再实际数据中获得良好的结果。那么,这时候我们需要花时间收集更多的数据。另外,我们还可以核查正则化参数——正则化足够强吗?最后,我们也可以尝试新的模型架构。

  • 如果模型的测试错误率很高

如图8.3右下角所示,模型在训练集和验证集上的错误率很低,但是在测试数据集上的错误率很高,有可能是模型发生了过拟合问题。因此,我们需要收集更多的验证集数据,以确定何时开始出现过拟合问题。

使用Andrew Ng提出的这种方法,当我们的实验没有如我们预期的那样进行时,我们可以更容易地就更新模型/数据集做出(正确的)决策。

迁移学习或从新训练

以下部分内容受斯坦福cs231n“迁移学习”课程的启发。从第3章关于特征提取第5章关于微调中我们看到了使用迁移学习可以带来更高的准确度,那么什么时候应该使用迁移学习,什么时候应该从头开始训练模型。

如何判断?你需要考虑两个重要的因素:

  • 数据集的大小。
  • 新的数据集与预训练CNN模型的原始数据是否相似(通常是ImageNet数据)。

基于这些因素,我们通过一个图表来帮助我们决定是否需要应用迁移学习或从头开始训练(图8.4)。主要有以下四种可能性:

图8.4 决策参考
  • 数据集小,数据相似度高(与pre-trained model的训练数据相比而言)

由于新的数据集很小,所以可能没有足够的训练数据来从头开始训练CNN(在深度学习实践中,理想情况下,每个类应该有1000 - 5000个样本)。此外,由于只有小量训练数据,尝试微调可能不是一个好主意,因为我们可能最终会发生过拟合问题。

相反,由于数据与预训练模型的训练数据相似度很高,因此,我们应该将网络视为一个提取特征器,并基于特征数据训练一个简单的机器学习分类器。需要注意的是,我们应该从预训练模型中更深的层中提取特征,因为往往这些特征具有很强的区分能力。

  • 数据集大,数据相似度高

这就是最理想的情况,采用预训练模型会变得非常高效,我们有足够的例子来应用微调而不发生过拟合问题。你可能也想从头开始训练自定义模型——这是一个值得进行的实验。但是,由于新的数据集与pre-trained model的训练数据相似,网络内部的filters可能已经具有足够的识别能力,从而获得一个合理的分类器。因此,最好的运用方式是保持模型原有的结构和初始权重不变,随后在新数据集的基础上进行微调。

  • 数据集小,数据相似度不高

同样,对于一个小的数据集,我们无法通过从头开始训练来获得一个高精度的深度学习模型。相反,我们应该再次应用特征提取并在它们之上训练一个标准的机器学习模型——但是由于新的数据与原始数据集不同,我们应该使用网络中较低的层作为特征提取器。

请记住,网络层越深,特征就越丰富且越细[对原始数据集有可能过拟合的风险],因此,由于新的数据集与原始数据集相似度不高,我们应该从网络中较低的层提取特征,而不能使用较深的层提取到的抽象特征。

  • 数据集大,数据相似度不高

在这种情况下,我们有两个选择。考虑到我们有足够的训练数据,我们可以从头开始训练自定义网络架构。另外,我们可以从大数据集中(比如ImageNet)训练的模型中得到的权重作为权重初始化,即使这些数据集是不相关的。因此,我们进行两组实验:

  • 在第一组实验中,对新的数据集尝试调整一个预先训练网络,并评估性能。
  • 在第二组实验中,从头开始训练一个全新的模型并进行评估。

究竟哪种方法好呢?完全取决于你的数据集和分类问题。但是,我建议您首先尝试进行微调,因为微调相对于重新训练而言,可以快速得到一个结果,而且,可以把第一组实验结果当做一个baseline,然后根据baseline进行第二组实验。

总结

在本章中,我们探索了应用深度学习最佳途径。在收集训练数据时,请确保用于训练模型的数据能够代表在实际应用中的数据。如果你的输入数据与你的实际数据分布不同,那么你的深度学习模型不可能在实际数据上表现得很好。

我们还回顾了何时应该考虑迁移学习,而不是从头开始训练自己的网络。对于小数据集,您应该考虑特征提取。对于较大的数据集,首先考虑进行微调(建立baseline),然后再从头开始训练模型。

没有更多推荐了,返回首页