本文主要介绍了现在主流的三大深度学习框架TensorflowCaffePytorch的组成结构,并对其特点进行了简要分析。

Tensorflow

TensorFlow是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数***算,而图边表示节点之间传递的***数据阵列(又称张量)。灵活的体系结构允许使用单个API将计算部署到服务器或移动设备中的某个或多个CPU或GPU。它是一个静态图模型,一旦图被构建后,结构不变,每次输入不同的数据。
Tensorflow一般先定义各种变量,然后建立一个计算图(数据流图),计算图指定了各个变量之间的计算关系,若此时对计算图进行编译,没有任何输出,计算图还是一个空壳,只有把需要运算的输入放入后,才会在模型中形成数据流,形成输出。
Tensorflow中的运算都要放在图中,图中的运算进行发生在回话启动后(session),给节点填充数据,然后进行运算,关闭会话,最后结束运算。

张量

所有的数据都通过张量的形式来表示,它可以被简单的理解为多为数组。张量的使用主要可以分为2大类:

  1. 对中间计算结果的引用
  2. 当计算图构造完成后,张量可以用来获取计算结果

OP操作

计算图中每一个节点代表着一个操作(operation,Op),一般用来表示施加的的数***算,也可以表示数据输入的起点以及输出的终点,或者是读取/写入持久变量(persistent veriable)的终点,Op也可用于状态初始化的任务。

类比: 一个神经元有多个输入,一个或者多个输出。这里的OP可以看作神经元,tensor可以看作输入的数据。

计算图中的边

计算图中的边包含这两种关系:数据依赖和控制依赖。(不需要对计算图中的边进行定义,因为在tensorflow中创建节点是已包含了相应的Op完成计算所需的全部输入,tensorflow会自动绘制必要的连接) 。

  1. **实线的边代表着数据依赖:**标识连接的两个节点之间有tensor的流动(传递)
  2. **虚线的边代表着控制依赖:**用于控制操作的运行,确保发生前关系, 连接的节点之间没有tensor的传递,但是源节点必须在目的节点执行前完成执行。

TensorFlow程序的阶段

TensorFlow程序通常被组织成一个构建阶段和一个执行阶段。在构建阶段,op 的执行步骤被描述成一个图。在执行阶段,使用会话执行图中的op。

阶段一:如何构建图?

  1. 构建图从创建op开始。有些op的创建是不需要input的,比如Constant。这样的op被成为源op(source op)。
  2. 在python中op对象是由op构造器(ops constructors)创建的。op构造器创建一个op对象时可以传递一个源op作为待构造op对象的输入。
  3. op对象被op构造器创建后是作为一个node加入到graph中的。TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点。

**总结:**因为graph是由op对象组成的,所以构建图的过程其实就是创建op对象的过程,以及如果将这些个op对象连接起来(比如某个op对象作为另外某个op对象的输入)的过程。

阶段二:图构建好了,如何执行?

  1. 因为graph需要在session中启动。所以为了启动一个graph,第一步就是创建session对象。
  2. sessoin对象创建的时候如果不制定graph,则使用默认图(default graph)。

Variable及Constant

  1. 变量用于维护图执行过程中的状态信息。通常会将一个统计模型中的参数表示为一组变量。 例如, 你可以将一个神经网络的权重作为一个tensor存储在某个变量中。在训练过程中, 通过重复运行训练图,更新这个 tensor。
  2. tensor存储在Constants或者Variables。就像数据可以放在常量和变量中一样。放在变量中的数据是可以修改的,放在常量中的数据是不可以修改的。

搭建神经网络步骤

  1. 定义添加神经层的函数;
  2. 准备训练的数据;
  3. 定义节点准备接收数据;
  4. 定义神经层:隐藏层和预测层;
  5. 定义loss表达式;
  6. 选择optimizer使loss达到最小;
  7. 对所有变量进行初始化,通过sess.run optimizer,迭代多次进行学习。

优势

  1. TensorFlow有内置的TF.LearnTF.Slim等上层组件可以帮助快速地设计新网络,并且兼容Scikit-learn estimator接口,可以方便地实现evaluategrid searchcross validation等功能。同时TensorFlow不只局限于神经网络,其数据流式图支持非常自由的算法表达,当然也可以轻松实现深度学习以外的机器学习算法。事实上,只要可以将计算表示成计算图的形式,就可以使用TensorFlow。用户可以写内层循环代码控制计算图分支的计算,TensorFlow会自动将相关的分支转为子图并执行迭代运算。TensorFlow也可以将计算图中的各个节点分配到不同的设备执行,充分利用硬件资源。
  2. 在可视化方面,Tensorboard非常棒。该工具包含在TensorFlow里,它对于调试和比较不同的训练过程非常有用。例如,在训练模型的时候,你可以在调整某些超参数之后再训练一遍。两次运行过程可以同时显示在Tensorboard上,以显示它们之间存在的差异。Tensorboard能够:
  • 显示模型图
  • 绘制标量变量
  • 使分布和直方图可视化
  • 使图像可视化
  • 使嵌入可视化
  • 播放音频
    Tensorboard能够显示通过tf.summary模块收集的各种摘要。我们将为前面提到的那个指数例子定义摘要操作,并使用tf.summary.FileWriter将其保存到磁盘上。
    执行tensorboard --logdir=./tensorboard以启动Tensorboard。这个工具对于云实例来说非常方便,因为它是一个webapp

Caffe

优势及劣势

Caffe是一个清晰而高效的深度学习框架,主要优势为:

  1. 上手容易,网络结构都是以配置文件形式定义,不需要用代码设计网络
  2. 训练速度快,组件模块化,可以方便的拓展到新的模型和学习任务上
  3. 拥有大量的训练好的经典模型(AlexNet、VGG、Inception)乃至其他state-of-the-artResNet等)的模型,收藏在它的Model Zoo
    劣势:
  4. 但是Caffe最开始设计时的目标只针对于图像,没有考虑文本、语音或者时间序列的数据,因此Caffe对卷积神经网络的支持非常好,但是对于时间序列RNN,LSTM等支持的不是特别充分
  5. Caffe 的配置文件不能用编程的方式调整超参数,也没有提供像 Scikit-learn 那样好用的 estimator 可以方便地进行交叉验证、超参数的 Grid Search 等操作。

组成

Caffe由低到高依次把网络中的数据抽象成Blob, 各层网络抽象成Layer ,整个网络抽象成Net,网络模型的求解方法抽象成Solver

  1. Blob: 表示网络中的数据,包括训练数据,网络各层自身的参数,网络之间传递的数据都是通过Blob来实现的,同时Blob数据也支持在CPU与GPU上存储,能够在两者之间做同步。
  2. **Layer:**对神经网络中各种层的抽象,包括卷积层和下采样层,还有全连接层和各种激活函数层等。同时每种Layer都实现了前向传播和反向传播,并通过Blob来传递数据。
  3. Net: 是对整个网络的表示,由各种Layer前后连接组合而成,也是所构建的网络模型。
  4. Solver: 定义了针对Net网络模型的求解方法,记录网络的训练过程,保存网络模型参数,中断并恢复网络的训练过程。自定义Solver能够实现不同的网络求解方式。

核心概念

Caffe 的核心概念是Layer,每一个神经网络的模块都是一个LayerLayer 接收输入数据,同时经过内部计算产生输出数据。设计网络结构时,只需要把各个Layer 拼接在一起构成完整的网络(通过写 protobuf配置文件定义)。比如卷积的Layer,它的输入就是图片的全部像素点,内部进行的操作是各种像素值与Layer 参数的 convolution 操作,最后输出的是所有卷积核filter 的结果。每一个Layer 需要定义两种运算,一种是正向(forward)的运算,即从输入数据计算输出结果,也就是模型的预测过程;另一种是反向(backward)的运算,从输出端的gradient 求解相对于输入的gradient,即反向传播算法,这部分也就是模型的训练过程。实现新Layer 时,需要将正向和反向两种计算过程的函数都实现, 这部分计算需要用户自己写 C++或者 CUDA (当需要运行在 GPU 时)代码,较为困难

Pytorch

新颖处

不同于tensorflow的静态图,pytorch是一个动态的框架,这就和python的逻辑是一样的,对变量做任何操作都是灵活的。

组成

Pytorch的设计追求最少的封装,不像tensorflow中充斥着session、graph、operation、variable、layer等全新概念。Pytorch的设计遵循tensor—>variable(autograd) —>nn.Model三个由低到高的抽象层次,分别代表高维数组(张量)、自动求导(变量)和神经网络(层/模块),三者紧密联系,可以同时进行修改和操作。

  1. tensor

  2. variable

  3. nn.Model

优势及劣势

优势:

  1. 动态图的思想直观明了,更符合人的思考过程。动态图的方式可以使得我们可以任意修改前向传播,还可以随时查看变量的值。如果静态图框架比作C++,每次运行都要编译(sess.run),那么动态图框架就是python,动态执行,可以交互式查看修改。
  2. 动态图调试更容易,pytorch中,代码报错的地方,一般就是你写错代码的地方,而静态图需要先根据你的代码生成Graph对象,然后在session.run()时报错,找到错误很难。

劣势:

PyTorch并没有一个类似于Tensorboard的工具,但有一个可以将Tensorboard集成进来的工具。或者,也可以***标准绘图工具:matplotlib和seaborn。