深度学习框架 (from《深度学习入门之PyTorch》)

TensorFlow

TensorFlow由Google开源。
TensorFlow是使用C++语言开发的开源数学计算软件,使用数据流图(Data Flow Graph)的形式进行计算。图中的节点代表数学运算,而图中的线条表示多维数据数组(tensor)之间的交互。
TensorFlow灵活的架构可以部署在一个或多个CPU,GPU的台式及服务器中,或者使用单一的API应用在移动设备中。
TensorFlow是深度学习界框架默认的老大。
目前TensorFlow是全世界使用人数最多、社区最为庞大的一个框架。因为Google公司出品,所以维护和更新也比较频繁,由python和C++的接口,教程也非常完善,同时很多论文复现的第一个版本都是基于TensorFlow写的。

吴恩达老师讲解TensorFlow的示例:TensorFlow

Caffe

Caffe由加州大学伯克利的Phd贾扬清开发,是一个清晰而高效的开源深度学习框架,目前由伯克利视觉学中心维护。
从它的名字就可以看出其对卷积网络支持特别好,同时也是用C++写的,但是并没有提供python接口,只提供了C++接口。
Caffe之所以流行,是因为之前很多ImageNet比赛中使用的网络都是用Caffe写的,所以如果你想使用致谢比赛中的网络模型就只能使用Caffe。
Caffe的缺点是不够灵活,同时占用内存高,只提供C++的接口,目前Caffe的升级版本Caffe2已经开源了,修复了一些问题,同时工程水平得到了进一步提高。

Torch

Torch是一个有大量机器学习算法支持的科学计算框架,其诞生已有十年之久,但其真正起势得益于FaceBook开源了大量Torch的深度学习模块和拓展。
Torch的特点在于特别灵活,但另一个特殊之处是采用了编程语言Lua
在目前深度学习大部分以Python为编程语言的大环境下,Lua这一小众的语言增加了学习使用Torch这个框架的成本。
Pytorch的前身就是Torch,其底层和Torch框架一样,但是用Python重新写了很多内容,不仅更加灵活,支持动态图,也提供了Python接口。

Pytorch

PyTorch简介

PyTorch由torch7团队开发,使用了Python作为开发语言。
所谓的“python first”,说明它是一个以Python优先的深度学习框架,不仅能够实现强大GPU加速,同时还支持动态神经网络,这是现在很多主流框架比如TensorFlow等不支持的。
PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成拥有自动求导的强大的深度神经网络

为何要使用PyTorch

  1. 掌握一个框架并不能一劳永逸
    现在深度学习并没有谁拥有绝对的垄断地位,所以只学习TensorFlow并不够(本人还没学TensorFlow)。
    同时现在的研究者使用各个框架的都有,要去看他们实现的代码,至少也要了解他们使用的框架。

  2. 极高的速度和灵活性
    TensorFlow和Caffe都是命令式的编程语言,而且是静态的。首先必须构建一个神经网络,然后一次又一次使用相同的结构。如果想改变网络的结构,就必须从头开始。
    但是PyTorch,通过反向求导的技术,可以零延迟地任意改变神经网络的结构。尽管这项技术并不是PyTorch独有,但目前为止它实现是最快的,能够为你任何疯狂想法的实现获得极高的速度和极高的灵活性。
    而这也是PyTorch对比TensorFlow最大的优势。

  3. 线性、直观、易于使用
    PyTorch的设计思路是线性、直观、易于使用的。
    当你执行一行代码时,他会忠实地执行,并没有异步的世界观。
    所以当你的代码出现Bug的时候,可以通过这些信息轻松地找到出错的代码,不会让你在Debug的时候因为错误的指向或者异步和不透明的引擎浪费太多的时间。

  4. 代码简洁友好
    PyTorch的代码相对于TensorFlow而言,更加简洁直观。同时对于TensorFlow高度工业化的很难看懂的底层代码,PyTorch的源代码要友好得多,更容易看懂。
    深入API,理解PyTorch底层肯定是一件令人高兴的事。一个底层架构能看懂的架构,你对其的理解会更深。

最后简要总结一下PyTorch的特点:

  • 支持GPU
  • 动态神经网络
  • Python优先
  • 命令式体验
  • 轻松扩展

选择深度学习框架的标准

回归问题 vs 分类问题

分类问题和回归问题是机器学习和深度学习的第一步,拿到任何一个问题,我们都需要先确定其到底是分类还是回归,然后再进行算法设计。

分类问题

分类问题希望把数据集分到某一类。比如一个 3 分类问题,那么对于任何一个数据点,我们都希望找到其到底属于哪一类,最终的结果只有三种情况,{0, 1, 2},所以这是一个离散的问题。
这里有一个挺有意思的小demo,来演示神经网络来分类的过程。

回归问题

回归问题是一个连续的问题,比如曲线的拟合,我们可以拟合任意的函数结果,这个结果是一个连续的值。

激活函数 of 神经网络

激活函数在神经网络中作用的机理


对于单个神经元,首先接受数据输入,然后通过计算得到计算结果,接着经过激活函数,再传给下一层神经元

神经网络使用的激活函数都是非线性的。每个激活函数都输入一个值,然后做一种特定的数学运算得到一个结果。

常见的激活函数有:SigmoidReLU

ReLU 是在神经网络中广泛使用的激活函数(《深度学习入门之Pytorch》中说有90%)。
ReLU 构成的神经网络,一层的神经网络的公式就是 y=max(0,wx+b)y = max(0, w x + b)y=max(0,wx+b) ,两层的神经网络就是 y=w2max(0,w1x+b1)+b2y = w_2\ max(0, w_1 x + b_1) + b_2y=w2​ max(0,w1​x+b1​)+b2​ ,非常简单,但是却很有效。
使用这个激活函数能够加快梯度下降法的收敛速度,同时对比与其他的激活函数,这个激活函数计算更加简单,所以现在变得非常流行。

从数学角度理解激活函数的必要性

举例一个两层的神经网络,使用 A 表示激活函数,那么
y=w2A(w1x)y = w_2 A(w_1 x) y=w2​A(w1​x)
如果我们不使用激活函数,那么神经网络的结果就是
y=w2(w1x)=(w2w1)x=wˉxy = w_2 (w_1 x) = (w_2 w_1) x = \bar{w} x y=w2​(w1​x)=(w2​w1​)x=wˉx
可以看到,我们将两层神经网络的参数合在一起,用 wˉ\bar{w}wˉ 来表示,两层的神经网络其实就变成了一层神经网络,只不过参数变成了新的 wˉ\bar{w}wˉ,所以如果不使用激活函数,那么不管多少层的神经网络,y=wn⋯w2w1x=wˉxy = w_n \cdots w_2 w_1 x = \bar{w} xy=wn​⋯w2​w1​x=wˉx,就都变成了单层神经网络。

激活函数对神经网络的影响 - 万能逼近能力

看到使用了激活函数之后,神经网络可以通过改变权重实现任意形状,越是复杂的神经网络能拟合的形状越复杂,这就是著名的神经网络万有逼近定理。

前向传播和反向传播

详见该博客
详解神经网络的前向传播和反向传播(从头推导)
他的推导过程恰到好处,能把道理说得明白又不显得冗余。(膜一波
尤其是他在梯度下降局部最优的部分用的小恶魔的比喻,真实太形象了。

深度卷积网络的结构

输入层

输入为三维矩阵,代表一张图片。
矩阵的长宽代表图片的大小,矩阵的深度代表图像的通道,如黑白为1,RGB为3。

卷积层

卷积层试图对神经网络的每一小块滤波器扫到的区域)进行分析,得到抽象程度更高的特征
一般来说,通过卷积层处理后的结点矩阵深度会增加。

不带Padding的卷积过程

带Padding的卷积过程 由图可知

卷积过程是由一个带有参数的矩阵(称为滤波器),按一定的步长扫过输入矩阵,被扫到的位置依次相乘求和作为输出矩阵的一个元素,得到降维的输出矩阵。

(如何计算输出矩阵的维度

池化层

池化层能够缩小矩阵的大小,但不会改变三维矩阵的深度,从而达到减少参数的目的。
池化的过程可以看做将一个高分辨率图片转化为低分辨率图片的过程。

全连接层

经过多轮卷积和池化后,经过1-2个全连接层来进行输出。
可以将卷积层和池化层看做特征提取,最后的全连接层来进行分类。

[深度学习] 深度学习常见概念相关推荐

  1. 深度学习12大常见问题解答(附答案)

    阿尔法狗让深度学习登上了数据科学世界的巅峰.深度学习成为了当今最热门的话题之一,但对于大多数人来说,这是一个陌生而又神秘的学科.很多人认为,深度学习就是包括了大量的数学和统计知识. 本文列举了常见的1 ...

  2. 深度学习——深度学习基础概念

    摘要 本文将针对与深度学习的平台的这样的一个理解和实战这样的一个理解.这是一个系列的课程.我将一直更新有关于的paddle的开发和学习.Paddle包括众多方面.目标检测.文字识别.图像分类.图像分割 ...

  3. 浅说深度学习(1):核心概念

    浅说深度学习(1):核心概念 原文来自Nvidia开发者社区:Deep Learning in a Nutshell: Core Concepts 作者:Tim Dettmers, Author at ...

  4. 基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测(工具+综述+玉米锈病严重程度数据集)

    基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测 Abstract 人工智能(AI)的发展使植物病理学的许多应用成为可能.例如,许多研究人员使用了预先训练的卷积神经网络(CNNs),如VGG- ...

  5. 关于深度学习的一些基础概念的简单梳理

    目录 独立同分布independent and identically distributed (i.i.d.) BN(Batch Normalization)批规范化 正则化 损失函数 过拟合现象 ...

  6. 深度丨深度强化学习研究的短期悲观与长期乐观(长文)

    文章来源:机器之心 深度强化学习是最接近于通用人工智能(AGI)的范式之一.不幸的是,迄今为止这种方法还不能真正地奏效.在本文中,作者将为我们解释深度强化学习没有成功的原因,介绍成功的典型案例,并指出 ...

  7. 爱奇艺深度语义表示学习的探索与实践

    导读:基于学术界和工业界经验,爱奇艺设计和探索出了一套适用于爱奇艺多种业务场景的深度语义表示学习框架.在推荐.搜索.直播等多个业务中的召回.排序.去重.多样性.语义匹配.聚类等场景上线,提高视频推荐的 ...

  8. 学习深度学习需要哪些知识_您想了解的有关深度学习的所有知识

    学习深度学习需要哪些知识 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) Corona was a huge challenge for many ...

  9. 《神经网络与深度学习》—学习笔记

    [nndl.github.io] [神经网络与深度学习] [nndl-book] 深度学习基础 深度学习是机器学习的一个分支,是指一类问题以及解决这类问题的方法. 深度学习问题是一个机器学习问题,指从 ...

  10. 基于深度强化学习的机器人运动控制研究进展 | 无模型强化学习 | 元学习

    1.基于深度强化学习的机器人运动控制研究进展 1.1 深度强化学习 1.1.1 强化学习简介: 强化学习(Reinforcement Learning, RL)利用试错机制与环境进行交互,旨在通过最大 ...

最新文章

  1. linear model课程笔记
  2. 解决jquery的多次绑定事件
  3. 用Opengl实现骨骼系统
  4. 【转】String.format详解
  5. javascript 获取DropDownList选定值的方法
  6. 结对编程1-基于GUI的四则运算生成器
  7. zookeeper配置集群
  8. 【绝对原创】EFS加密文件真的可以解密!各位不要放弃哈~
  9. Python学习-安装Anaconda及print我爱王晓静
  10. 叶俊:把特质用对地方就是优势
  11. vmware启动虚拟机提示“无法连接虚拟设备ide1:0,主机上没有相对应的设备“
  12. 旅游类APP原型模板分享——爱彼迎
  13. 简单的外汇市场赚钱方法
  14. BUUCTF:zip
  15. 深度学习笔记整理(五)——提高泛化能力的方法
  16. 【条形码识别】基于计算机视觉实现二维条形码识别含Matlab源码
  17. solidworks素材_视频剪辑中的视频素材是从哪里找的?
  18. drupal笔记之block缓存踩坑
  19. 100道动态规划——34 UVA 10559 Blocks 状态的定义 状态转移方程
  20. 高通LCD之亮灭屏过程简析

热门文章

  1. python基本代码教程-python基础教程第三版源代码
  2. 最简单的基于FFmpeg的移动端例子附件:SDL Android HelloWorld
  3. 视频主观质量评价方法
  4. mysql tcp优化_mysql 优化
  5. Element-UI中el-input输入值不显示
  6. application使用@符合问题:‘@‘ that cannot start any token
  7. 【Luogu1341】无序字母对(并查集联通,欧拉路模板)
  8. NYOJ11 - 奇偶数分离
  9. java.servlet js,调用servlet方法
  10. python多继承顺序及分配,python多继承的查找顺序是什么?