新年福利 | 2019深度学习工具汇总


深度学习工具

深度学习的进步也严重依赖于软件基础架构的进展。软件库如:Torch(2011), Theano(2012), DistBelief(2012), PyLearn2 (2013), Caffe(2013), MXNet (2015) 和 TensorFlow(2015) 都能支持重要的研究项目或商业产品。

如果说深度学习的话,我个人接触是在2015年,这个技术其实被雪藏了很久,在2012年又得到了完全的爆发,至今已经是AI界的主流,那今天就来说说最实际也是接触最多的一个环节,那就是框架,也可以说是工具。

大家所了解的工具不知道有哪些???

今天,我以我使用过的工具来和大家分享,希望你们可以找到自己喜欢的工具,与其一起去“炼丹”(不知道这个意思的,百度下)嘿嘿!

新年福利 | 2019深度学习工具汇总_第1张图片

在我研究生入学以来,接触的深度学习工具一只手就可以数过来,有兴趣的小伙伴可以深入搜索,网上还是有很多不同说法。我接下来根基我自己的实际体验而大家说说深度学习工具这些事。Matlab

新年福利 | 2019深度学习工具汇总_第2张图片

Matlab

新年福利 | 2019深度学习工具汇总_第3张图片

刚开始接触深度学习,第一个使用的工具就是:DeepLearnToolbox,一个用于深度学习的Matlab工具箱。深度学习作为机器学习的一个新领域,它的重点是学习深层次的数据模型,其主要灵感来自于人脑表面的深度分层体系结构,深度学习理论的一个很好的概述是学习人工智能的深层架构。这个工具箱比较简单,当时我就做了一个手写数字和人脸分类(AR人脸数据库)。主要包括如下:

640?wx_fmt=png

NN:前馈BP神经网络的库

CNN:卷积神经网络的库

DBN:深度置信网络的库

SAE:堆栈自动编码器的库

CAE:卷积自动编码器的库

Util:库中使用的效用函数

Data:数据存储

tests:用来验证工具箱正在工作的测试

640?wx_fmt=png

案例如下

640?wx_fmt=png

rand('state',0)   

cnn.layers = {

    struct('type', 'i')            %输入

    struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5)  %卷积层

    struct('type', 's', 'scale', 2)    %下采样层

    struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %卷积层

    struct('type', 's', 'scale', 2)    %下采样层

};   

cnn = cnnsetup(cnn, train_x, train_y);   opts.alpha = 1;   

opts.batchsize = 50;   

opts.numepochs = 5;   

cnn = cnntrain(cnn, train_x, train_y, opts); save CNN_5 cnn;

load CNN_5;   

[er, bad]  = cnntest(cnn, test_x, test_y);   figure; plot(cnn.rL);   

assert(er<0.12, 'Too big error');

640?wx_fmt=png

运行界面比较单一:

新年福利 | 2019深度学习工具汇总_第4张图片

PyTorch

这个Pytorch库的话,其实我没怎么用,就是随便试玩了下,个人感觉还是不要碰了,没啥意思,我接下来也就简单聊一下。他是一个基于Python的科学计算包,目标用户有两类。一类是为了使用GPU来替代numpy;另一类是一个深度学习援救平台:提供最大的灵活性和速度。

640?wx_fmt=jpeg

以深度学习来说,可以使用torch.nn包来构建神经网络。已知道autograd包,nn包依赖autograd包来定义模型并求导。一个nn.Module包含各个层和一个faward(input)方法,该方法返回output。

案例如下

640?wx_fmt=png

import torch from torch.autograd

import Variable import torch.nn  

import torch.nn.functional as F  

class Net(nn.Module):     

    def __init__(self):         

        super(Net, self).__init__()         

      # 1 input image channel, 6 output channels, 5*5 square convolution         

        # kernel          

        self.conv1 = nn.Conv2d(1, 6, 5)                 

        self.conv2 = nn.Conv2d(6, 16, 5)         

        # an affine operation: y = Wx + b             

        self.fc1 = nn.Linear(16 * 5 * 5, 120)             

        self.fc2 = nn.Linear(120, 84)             

        self.fc3 = nn.Linear(84, 10)      

    def forward(self, x):         

        # max pooling over a (2, 2) window

        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))

        # If size is a square you can only specify a single number

        x = F.max_pool2d(F.relu(self.conv2(x)), 2)

        x = x.view(-1, self.num_flat_features(x))

        x = F.relu(self.fc1(x))

        x = F.relu(self.fc2(x))

        x = self.fc3(x)         

        return x      

    def num_flat_features(self, x):         

        size = x.size()[1:]

        # all dimensions except the batch dimension         

        num_features = 1         

        for s in size:             

            num_features *= s         

        return num_features

net = Net() 

print(net)

640?wx_fmt=png

具体操作和细节过程,有兴趣的可以抽空去玩玩!

Caffe

Caffe的作者为UC Berkeley大学的贾扬清。Caffe是一个c++/CUDA架构,支持命令行、Python、Matlab接口,可以在CPU/GPU上运行。

新年福利 | 2019深度学习工具汇总_第5张图片

深度学习不断在发展,其对应的实验工具也随着得到了大家的重视。Caffe就是现在流行的深度学习框架之一,工具内已经提前提供了模板,也就是该工具有现成的编程框架,而且可以与现状流行的图形计算GPU联合使用,加快网络训练的速度,流行的神经网络框架算法都可以在Caffe中运行,而且可以自己设置框架,因为Caffe已经提前就做好了各结构的定义,研究学者也可以根据自己的设计需求去进行相应的添加,设计出新的深度学习框架去完成所需的任务。

Caffe框架中,主要就是BlobsLayersNets三大类结构,而且由于是事前定义好的结构,所以在使用该框架的时候是不可以更改。

640?wx_fmt=png

Blobs

Blob是Caffe框架中的一个主要结构,其为包装器,在使用Caffe框架时,数据都要被设置成格式,只有这样的数据格式才能在Caffe框架中进行执行和处理。并且在Caffe设计时,很多函数和类都提前设计好了,在执行的过程中是不可以修改其结构,否则将无法调用其中的函数,导致网络训练的失败。

Blob的格式主要由Number,Channel,Height和Width四个元素组成,如果在进行图像处理,则表示图像通道(一般彩色图像为3通道的数据,Height和Width就表示输入数据的尺寸。而对于的元素,其主要体现在训练过程中,因为训练的时候需要选择一次性输入多少数据,就是一次输入数据的数量,通常称之为Batch。这种训练方式也可以大大缓解内存的不足。

Layers

Layers是Caffe框架中网络构成的重要结构之一,网络的构成就是因为Layers的作用,通过接收输入和输出数据,最后通过内部的计算输出。Caffe在使用网络层的时候,其定义方式特别简单明了,大致都分为三个小步骤,如下:
1)建立网络层,且建立层之间的连接关系,可以通过随机初始化的操作,去对一些网络层的变量进行初始化;
2)网络训练过程中,首先计算前向传播,在改过过程中Layers接受上一层的输出数据作为本次的输入数据,最后通过内部
的计算进行输出。
3)前向传播后,由于得到的结果与期望相差较大,通过之前提及到的反向传播来进行计算去调整网络的参数值,以达到最
优值,并且在反向传播计算时,Layers会把每次计算的梯度值存放在该层中。

Nets

之前介绍的Layers就是Nets的一个子元素,通过多种Layers的组合连接得到整个Nets,在该结构中,Nets定义了网络的各Layers、Input和Output。

640?wx_fmt=png

例如Caffe定义中最基本的隐层网络,其定义如下:

640?wx_fmt=png

name: “LogReg”
layers {
name: “mnist”
type: DATA
top: “data”
top: “label”
data_param {
source: “input_leveldb”
batch_size: 64
}}

layers {
name: “ip”
type: INNER_PRODUCT
bottom: “data”
top: “ip”
inner_product_param {
num_output: 2
}}

layers {
name: “loss”
type: SOFTMAX_LOSS
bottom: “ip”
bottom: “label”
top: “loss”
}

640?wx_fmt=png



有兴趣的可以试试Caffe2框架 640?wx_fmt=gif Caffe优势
  • Caffe作为一个开源的框架,其表达式的结构得到很多研究学者的喜爱,因为其可以鼓励更过的人去进行创新、修改完善及实际应用。在框架中,网络的模型、设计和优化过程都是指令来调用和执行,不像其他工具框架,需要通过硬编码来获取相应的操作。而且在Caffe应用中可以使用CPU中央处理器和GPU图形图像处理器进行学习,而且两个处理器可以来回切换,只要通过在GPU机器上设置一个指令就可以,而且GPU的使用在普遍增加,因为其可以给予网络的训练速度,减少训练的时间,提高网络的训练效率,进一步对网络进行微调。

  • 开源框架的好处就是可以被大家扩展,所以Caffe促进了其自身的开发,在贾扬清创建Caffe之后,仅在一年时间里,就已经有上千位研究爱好者参加了开发,而且他们都做出了很大的贡献才会有现在完善的深度学习框架,现在该框架还在不断进行优化和发展。

  • 上手快,因为网络模型不需要用代码的形式表现出来,只需要通过文本形式表现,并且Caffe框架中已定义了该模型。

  • Caffe的出现特征事宜学校机构的实验室和工业相关部门的使用。因为Caffe与英伟达GPU合用,可以达到很高的效率。曾有过一个实验,用一台英伟达生产的K40图形图像处理器去训练图片,一天下来可以执行六千万以上的训练图像。现在其表现的速度,在常用的深度学习框架中,可以算得上最快的框架之一。

  • 方便快速地使用到其他任务重,因为Caffe已经定义了各层的类型,只需通过简单调用来定义自己设计的网络模型即可。

TF

Google在2011年推出人工深度学习系统——DistBelief。通过DistBelief,Google能够扫描数据中心数以千计的核心,并建立更大的神经网络。这个系统将Google应用中的语音识别率提高了25%,以及在Google Photos中建立了图片搜索,并驱动了Google的图片字幕匹配实验。DistBelief还存在不少不足和限制。它很难被设置,和Google内部的基础设施联系也过于紧密,这导致研究代码机会不可能分享。  

新年福利 | 2019深度学习工具汇总_第6张图片

针对以上问题,Google在2015年Google Research Blog宣布推出新一代人工智能学习系统——TensorFlow。  

TensorFlow是一个异构分布式系统上的大规模机器学习框架,移植性好(小到移动设备如手机,大到大规模集群,都能支持),支持多种深度学习模型。根据Google说法,TensorFlow是综合的、灵活的、可移植的、易用的,更为关键的,它是开源的。同时,TensorFlow的速度相比前代DistBelief有了不小的提升,在一些跑分测试中,TensorFlow的得分是第一代系统的两倍。

尽管如此,TensorFlow的效率仍然比不过其他大部分开源框架。不过,随着TensorFlow源码逐步开放,对新硬件、新设备、新的加速如cuDNN的支持力度不断提升,其成为目前极具潜力的深度学习。

有兴趣可以体验下PlayGround,其是一个用于教学目的的简单神经网络的在线演示、实验的图形化平台,非常强大地可视化了神经网络的训练过程。使用它可以在浏览器里训练神经网络,对 Tensorflow有一个感性的认识。

新年福利 | 2019深度学习工具汇总_第7张图片

640?wx_fmt=gif TF缺点
  • TensorFlow 的每个计算流都必须构造为一个静态图,且缺乏符号性循环(symbolic loops),这会带来一些计算困难;

  • 没有对视频识别很有用的三维卷积(3-D convolution);

  • 尽管 TensorFlow 现在比起始版本快了 58 倍,但在执行性能方面依然落后于竞争对手。

今天就到此位置吧,感觉讲的有点多,但是又不是很深入,有机会来一次深度学习工具专题,我们大家一起慢慢聊!

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

640?wx_fmt=png

640?wx_fmt=gif

你可能感兴趣的:(新年福利 | 2019深度学习工具汇总)