CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

深度学习框架

我们在使用CNN的时候往往会采用深度学习框架来减小我们的工作量,以下是现在常用的一些深度学习框架

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

深度学习框架有以下意义

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

下面让我们来看看如果我们用numpy从头构建一个计算图是怎么样的,我们可以看出它有以下两个问题:不能在GPU上运行以及梯度需要我们手动计算

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

我们采用深度学习的框架可以很好的解决以上问题:让程序在GPU上运行仅仅需要一行代码,以及程序可以自动为我们计算梯度

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

TensorFlow

下面让我们来看一下tf的具体细节。我们看下图的程序,在tf.session()之前的代码是定义计算图,在这部分不进行任何的实际计算,在tf.session()之后的代码是给计算图赋予输入,让它运行起来并计算梯度。我们可以看出来在计算图的定义过程中首先为每个变量定义了一个placeholders,之后定义了计算图的结构以及代价函数。在计算的过程中,我们创建了很多numpy array来填充placeholders,之后运行计算图

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

为了更新权重,我们还需要增加几行代码。但是这种方法有个问题,就是计算图是在GPU上运行的,而我们的更新权重是在CPU上运行的,因此每次我们都需要将权重从CPU搬到GPU中,大大降低了程序运行的速度

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

为了解决这个问题我们可以将权重定义为variale来使得权重能够在计算图中保持一致。由于权重变为了存在于计算图中,因此我们每次我们需要把更新权重的代码放到前面的计算图定义中

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

但是我们如果采用如上代码会发现代价函数值在运行的时候完全没有降低,原因是我们虽然定义了更新权重的代码,但是在运行的时候完全没有运行它。解决方案就是我们加一行完全没作用的代码将更新权重的代码包含进来,然后在输出的时候输出这个值,这样在运行的时候我们就会运行权重更新的代码

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

另外在tf中我们有很多高阶API让我们无需手动实现loss、权重更新、卷积层定义以及初始化的过程,这种方法往往更简单,也拥有更好的效果。

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

另外我们还有Keras这种高阶封装器将以上过程封装起来进一步简化上述过程

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

除了Keras还有一些其他的封装器供我们使用

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

另外TensorFlow还有一些预训练模型、可视化工具供我们使用

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

PyTorch

除了TensorFlow,还有一种常用的框架是PyTorch。我们可以将PyTorch中一些常用概念与TF中的概念进行类比

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

PyTorch的Tensors与numpy array类似,以下是用Tensors构建的神经网络,我们可以看出来这种网络也是需要我们手动计算梯度

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

再往下引入计算图概念以后,我们将变量封装在Variable中,然后就可以用autograd来自动计算梯度了,Tensors 和Variables拥有相同的API。我们在声明Variable的时候就要说明是否需要计算它的梯度

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

另外我们还可以定义自己的autograd函数来计算梯度

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

与TF中高阶封装器类似,PyTorch中也有nn来简化我们的工作

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)4

除此以外PyTorch中也有optimizer来简化权重更新

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

除了使用自带的model,我们还可以自己定义model,我们在定义model的时候不需要定义backward,因为autograd可以自动处理求梯度的过程

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

PyTorch中dataloaders来供我们导入数据。我们从dataloaders中得到的数据是Tensors格式的,若要用到神经网络中我们应将其变为Variable

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

另外PyTorch中也提供预训练模型、可视化工具等

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

我们可以将TensorFlow和PyTorch进行如下对比

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

静态图vs动态图

TensorFlow和PyTorch的另外一个区别就是TensorFlow采用的是静态图而PyTorch采用的是动态图

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

静态图的好处是我们预先定义计算图以后,框架能对其结构进行优化

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

另外,我们在构建完计算图以后我们可以对其进行序列化,使其可以独立于代码运行

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

而动态图的优点是其非常好实现条件判断、循环等操作。这些操作在静态图中需要转换成专门的TF控制流操作符才能实现

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)
 

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

现在TensorFlow也提出了自己的动态图实现方法,但是还是没PyTorch效果好

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

以下是动态图的一些应用场景

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

Caffe

Caffe在科研的时候用的相对较少,它让你基本不需要写代码就能实现一个神经网络,但相对的它让你很难对网络细节进行更改

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

以下是使用Caffe的基本步骤

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

第一步是转换数据格式

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

第二步是利用protext定义网络结构

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

对于非常大的网络利用Caffe来实现就会变得非常麻烦

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

第三步是定义Solver来定义网络中的参数

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

第四步是训练

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

Caffe有预训练模型与Python界面供我们使用

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

 

以下是Caffe的一些优缺点

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

Caffe2是最新的版本,对Caffe做了很多优化

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

我们可以看出google与facebook的思路完全不同。google希望能提出一个框架来满足所有应用场景,而facebook提出了两个框架来满足生产场景与研究场景的不同需求

CNN笔记(CS231N)——深度学习软件(Deep Learning Software)

以下是讲者对于选择不同神经网络框架的建议CNN笔记(CS231N)——深度学习软件(Deep Learning Software)