深度学习工具
深度学习的进步也严重依赖于软件基础架构的进展。 软件库如: 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元无门槛券
私享最新 技术干货