?深度学习工具
深度学习的进步也严重依赖于软件基础架构的进展。?软件库如:?Torch(2011),??Theano(2012), DistBelief(2012),?PyLearn2 (2013),??Caffe(2013), MXNet (2015) 和 TensorFlow(2015) 都能支持重要的研究项目或商业产品。
如果说深度学习的话,我个人接触是在2015年,这个技术其实被雪藏了很久,在2012年又得到了完全的爆发,至今已经是AI界的主流,那今天就来说说最实际也是接触最多的一个环节,那就是框架,也可以说是工具。
大家所了解的工具不知道有哪些???
今天,我以我使用过的工具来和大家分享,希望你们可以找到自己喜欢的工具,与其一起去“?炼丹?”(不知道这个意思的,百度下)嘿嘿!
在我研究生入学以来,接触的深度学习工具一只手就可以数过来,有兴趣的小伙伴可以深入搜索,网上还是有很多不同说法。我接下来根基我自己的实际体验而大家说说深度学习工具这些事。?Matlab
Matlab
刚开始接触深度学习,第一个使用的工具就是:DeepLearnToolbox,一个用于深度学习的Matlab工具箱。?深度学习作为机器学习的一个新领域,它的重点是学习深层次的数据模型,其主要灵感来自于人脑表面的深度分层体系结构,深度学习理论的一个很好的概述是学习人工智能的深层架构。这个工具箱比较简单,当时我就做了一个手写数字和人脸分类(AR人脸数据库)。主要包括如下:
NN?:前馈BP神经网络的库
CNN?:卷积神经网络的库
DBN?:深度置信网络的库
SAE?:堆栈自动编码器的库
CAE?:卷积自动编码器的库
Util?:库中使用的效用函数
Data?:数据存储
tests?:用来验证工具箱正在工作的测试
案例如下
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');??
运行界面比较单一:
PyTorch
这个Pytorch库的话,其实我没怎么用,就是随便试玩了下,个人感觉还是不要碰了,没啥意思,我接下来也就简单聊一下。?他是一个基于Python的科学计算包,目标用户有两类。一类是?为了使用GPU来替代numpy;另一类是一个深度学习援救平台:提供最大的灵活性和速度。
以深度学习来说,可以使用?torch.nn?包来构建神经网络。已知道autograd包,nn包依赖autograd包来定义模型并求导。一个nn.Module包含各个层和一个faward(input)方法,该方法返回output。
案例如下
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)?
具体操作和细节过程,有兴趣的可以抽空去玩玩!
Caffe
Caffe的作者为UC Berkeley大学的贾扬清。Caffe是一个c++/CUDA架构,支持命令行、Python、Matlab接口,可以在CPU/GPU上运行。
深度学习不断在发展,其对应的实验工具也随着得到了大家的重视。Caffe就是现在流行的深度学习框架之一,工具内已经提前提供了模板,也就是该工具有现成的编程框架,而且可以与现状流行的图形计算GPU联合使用,加快网络训练的速度,流行的神经网络框架算法都可以在Caffe中运行,而且可以自己设置框架,因为Caffe已经提前就做好了各结构的定义,研究学者也可以根据自己的设计需求去进行相应的添加,设计出新的深度学习框架去完成所需的任务。
Caffe框架中,主要就是?Blobs?,?Layers?和?Nets?三大类结构,而且由于是事前定义好的结构,所以在使用该框架的时候是不可以更改。
Blob是Caffe框架中的一个主要结构,其为包装器,在使用Caffe框架时,数据都要被设置成格式,只有这样的数据格式才能在Caffe框架中进行执行和处理。并且在Caffe设计时,很多函数和类都提前设计好了,在执行的过程中是不可以修改其结构,否则将无法调用其中的函数,导致网络训练的失败。
Blob的格式主要由Number,Channel,Height和Width四个元素组成,如果在进行图像处理,则表示图像通道(一般彩色图像为3通道的数据,Height和Width就表示输入数据的尺寸。而对于的元素,其主要体现在训练过程中,因为训练的时候需要选择一次性输入多少数据,就是一次输入数据的数量,通常称之为Batch。这种训练方式也可以大大缓解内存的不足。
Layers是Caffe框架中网络构成的重要结构之一,网络的构成就是因为Layers的作用,通过接收输入和输出数据,最后通过内部的计算输出。Caffe在使用网络层的时候,其定义方式特别简单明了,大致都分为三个小步骤,如下:? 1)建立网络层,且建立层之间的连接关系,可以通过随机初始化的操作,去对一些网络层的变量进行初始化;? 2)网络训练过程中,首先计算前向传播,在改过过程中Layers接受上一层的输出数据作为本次的输入数据,最后通过内部? 的计算进行输出。? 3)前向传播后,由于得到的结果与期望相差较大,通过之前提及到的反向传播来进行计算去调整网络的参数值,以达到最? 优值,并且在反向传播计算时,Layers会把每次计算的梯度值存放在该层中。
之前介绍的Layers就是Nets的一个子元素,通过多种Layers的组合连接得到整个Nets,在该结构中,Nets定义了网络的各?Layers、Input和Output。
例如Caffe定义中最基本的隐层网络,其定义如下:
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”??}?
Caffe优势
TF
Google在2011年推出人工深度学习系统——DistBelief。通过DistBelief,Google能够扫描数据中心数以千计的核心,并建立更大的神经网络。这个系统将Google应用中的语音识别率提高了25%,以及在Google Photos中建立了图片搜索,并驱动了Google的图片字幕匹配实验。DistBelief还存在不少不足和限制。它很难被设置,和Google内部的基础设施联系也过于紧密,这导致研究代码机会不可能分享。
针对以上问题,Google在2015年Google Research Blog宣布推出新一代人工智能学习系统——TensorFlow。
TensorFlow是一个异构分布式系统上的大规模机器学习框架,移植性好(小到移动设备如手机,大到大规模集群,都能支持),支持多种深度学习模型。根据Google说法,TensorFlow是综合的、灵活的、可移植的、易用的,更为关键的,它是开源的。同时,TensorFlow的速度相比前代DistBelief有了不小的提升,在一些跑分测试中,TensorFlow的得分是第一代系统的两倍。
尽管如此,TensorFlow的效率仍然比不过其他大部分开源框架。不过,随着TensorFlow源码逐步开放,对新硬件、新设备、新的加速如cuDNN的支持力度不断提升,其成为目前极具潜力的深度学习。
有兴趣可以体验下PlayGround,其是一个用于教学目的的简单神经网络的在线演示、实验的图形化平台,非常强大地可视化了神经网络的训练过程。使用它可以在浏览器里训练神经网络,对 Tensorflow有一个感性的认识。
TF缺点
今天就到此位置吧,感觉讲的有点多,但是又不是很深入,有机会来一次深度学习工具专题,我们大家一起慢慢聊!
领取专属 10元无门槛券
私享最新 技术干货