深度学习之在iOS上运行CNN

1 引言
作为曾经的iOS开发者,在研究深度学习的时候,总有一个想法就是在iPhone上运行深度学习,不管是在手机上训练还是利用训练好的数据进行测试。
因为iOS的开发环境支持C++,因此,只要你的代码是C/C++,本质上就可以在iOS上运行。
怎么才能更快更好地在iOS上运行CNN呢?

2 方法1:通过Matlab转码
Matlab自带转成c的工具,如果你研究过UFLDL的深度学习教程,就知道如何在Matlab上使用CNN,那么,转换成c后,放到iOS的开发环境中,然后将参数存成txt格式再读取分割,也就是可以实现。
如下图就是已经将matlab代码转换为c后导入的结果:

%title插图%num

打开predict.h文件,可以看到可以调用的接口:

/* Function Declarations */
extern real_T predict(const real_T Theta1[10025], const real_T Theta2[260], const real_T X[400]);
1
2
3
这是训练MNIST的一个神经网络,我这边用了测试手写数字的识别。

因此,接下来需要对图片进行处理,从而转换为x[400]的向量格式。

这个只要能读取图片的像素,进行转换就可以。可以考虑用opencv来实现。

%title插图%num
这里我的方法是在用手画出数字之后,将图片转换为20*20像素的图片,如右下角所示,再将右下角的图片转换为400的数组,输入predict得到的结果。

3 方法2:使用DeepBeliefSDK
https://github.com/jetpacapp/DeepBeliefSDK
这个是别人专门写的一个用于iOS的深度学习的SDK。可以使用,但是存在的问题就是如果要自己训练的话很受限制。

4 方法3:使用tinyCNN
https://github.com/nyanp/tiny-cnn
这个很不错,它对比Caffe,Theano等框架*大的特点就是不需要安装,只要能用C++ 11.然后里面的例子使用了boost库。因此,为了运行它,我们需要在xcode安装ios的boost库。

网上找到了一个编译好的boost库:
https://github.com/danoli3/ofxiOSBoost

导入boost库的方法非常简单:

In Xcode Build Settings for your project:

Add to Library Search Paths ( LIBRARY_SEARCH_PATHS ) $(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/lib/ios
Add to Header Search Paths ( HEADER_SEARCH_PATHS )
$(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/include
In the Target under Build Phases

Add to ‘Link Binary With Libraries’ the boost.a found in the ofxiOSBoost/libs/boost/lib/ios directory.
If not openFrameworks just add the libs/boost/include to Header Search Paths and the libs/boost/ios to Library Search Paths

那么具体在创建iOS应用的时候,这里使用作者提供的训练MNIST的例子,那么要注意在使用数据时,要更改路径:

NSString *trainLabels = [[NSBundle mainBundle] pathForResource:@”train-labels” ofType:@”idx1-ubyte”];
NSString *trainImages = [[NSBundle mainBundle] pathForResource:@”train-images” ofType:@”idx3-ubyte”];
NSString *t10kLabels = [[NSBundle mainBundle] pathForResource:@”t10k-labels” ofType:@”idx1-ubyte”];
NSString *t10kImages = [[NSBundle mainBundle] pathForResource:@”t10k-images” ofType:@”idx3-ubyte”];

parse_mnist_labels([trainLabels cStringUsingEncoding:NSUTF8StringEncoding], &train_labels);
parse_mnist_images([trainImages cStringUsingEncoding:NSUTF8StringEncoding], &train_images);
parse_mnist_labels([t10kLabels cStringUsingEncoding:NSUTF8StringEncoding], &test_labels);
parse_mnist_images([t10kImages cStringUsingEncoding:NSUTF8StringEncoding], &test_images);

基本上这样就可以运行开始训练了。

如果想在Mac上训练,同样需要安装boost库。这个只要在官网下载boost,我用的是1.58版本。然后在terminal中安装,cd到路径,然后./boostrap.sh 然后./b2 安装就可以。然后在xcode引入路径:

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

/Users/…/…/…/boost

The following directory should be added to linker library paths:

/Users/…/…/…/boost/stage/lib

路径初始为自己boost的文件夹地址。

4 小结
上面说了一些很方便的方法来实现在iOS下运行CNN。当然,我们更多需要就是进行图像的识别。相信大家自己测试会觉得很有趣。

人工智能、大数据、云计算、机器学习和深度学习,主要有什么关系?

这些概念是当下的热点,它们本身并不复杂。相信我的回答能让你对这些概念以及它们之间的联系有一个清晰的了解。

我的主要研究方向是大数据和人工智能,所以机器学习、深度学习、云计算等技术也都接触过。这些概念之间也确实有很多关联,下面我主要从应用的角度来阐述一下他们之间的联系。

这五个概念按照领域可以划分成两个大部分,我先分别介绍这些概念的内部联系,然后再综合介绍他们整体之间的联系。

云计算和大数据

云计算和大数据的很多研究内容是重叠的,比如分布式存储、分布式计算,可以说大数据是云计算发展到一定阶段的产物。云计算和大数据之间主要的区别在于关注的“点”不同,云计算强调服务(IaaS、PaaS、SaaS),而大数据则强调数据的价值(数据采集、整理、传输、存储、安全、分析、呈现、应用等)。

云计算为大数据提供了重要的支撑,因为云计算平台往往构建在大型数据中心之上。大数据的主要基础有两个,一个是物联网,另一个就是云计算。物联网为大数据提供了大量的数据来源,而云计算则为大数据的运行提供了各种服务(硬件资源服务、网络资源服务、软件资源服务)。

深度学习、机器学习、人工智能

这三个概念首先要谈人工智能。人工智能虽然经过了半个多世纪的发展,但是在概念上依然没有一个统一的共识,也许人工智能的概念太难于解释了。但是人工智能所研究的主要内容集中在六个方面,分别是自然语言处理、知识表示、推理、机器学习、计算机视觉和机器人学。

所以机器学习是人工智能领域的主要研究内容之一,机器学习是人工智能的重要组成部分。机器学习的目的简单的说就是在杂乱无章的数据中找到背后的规律。

深度学习的概念提出的比较晚(2006年),深度学习是机器学习的一种方式,简单的说就是模拟人类大脑的机制来解释数据(神经网络),深度学习是构建深度神经网络的一种研究方式。

所以,深度学习是机器学习的一种重要方式,而机器学习又是人工智能的重要组成部分。

总结

以上描述了云计算和大数据之间的关系,描述了深度学习、机器学习和人工智能之间的关系,那么它们这两个大的领域之间有什么联系呢?

简单的说就是一句话:大数据是机器学习的基础。

伴随着大数据的发展,人工智能也得到了快速的发展。大数据已经成为未来智能化社会的基础,所以大数据与人工智能的关系非常密切,可以说是你中有我、我中有你。