标签: CNN

深度学习之在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。当然,我们更多需要就是进行图像的识别。相信大家自己测试会觉得很有趣。

GNN流程到GCN流程

聚合、更新、循环
举例:输入一个简单的图结构

GNN

  • 聚合操作
  • 更新操作
  • 循环操作(多层更新操作)
  • 目的

GCN

  • 修改的聚合部分
    • 平均法
    • 平均法存在的问题
    • GCN提出的方法

简单粗暴快速理解GNN
Graph-Unets
GCN中的拉普拉斯矩阵如何归一化?

%title插图%num

举例:输入一个简单的图结构

%title插图%num
GNN
聚合操作
经过一次聚合后:聚合到的信息:
邻 居 信 息 N = a ∗ ( 2 , 2 , 2 , 2 , 2 ) + b ∗ ( 3 , 3 , 3 , 3 , 3 ) + c ∗ ( 4 , 4 , 4 , 4 , 4 ) 邻居信息N = a*(2,2,2,2,2)+b*(3,3,3,3,3)+c*(4,4,4,4,4)
邻居信息N=a∗(2,2,2,2,2)+b∗(3,3,3,3,3)+c∗(4,4,4,4,4)

a 、 b 、 c a、b、c a、b、c :自行设置或进行训练学习。
简单的说:就是将其他相邻节点的信息聚合,作为当前节点信息的一个补足。
更新操作
A的信息  = σ ( W ( ( 1 , 1 , 1 , 1 , 1 ) + α ∗   N ) ) \text { A的信息 }=\sigma\left(\mathrm{W}\left((1,1,1,1,1)+\alpha^{*} \mathrm{~N}\right)\right)
A的信息 =σ(W((1,1,1,1,1)+α

N))

简单地说:将得到的邻居节点信息乘以系数加到当前节点,再乘以学习的权重和激活函数,从而获得聚合后的A的信息(一层GNN后的A的*终信息)。

α \alpha α :自行设置或attention机制选出或进行训练学习。
W W W :模型需要训练的权值参数。
σ \sigma σ :激活函数。
循环操作(多层更新操作)
【n层的GNN可以得到n层的邻居信息】
经过一次聚合后:

A中有B,C,D的信息
B中有A,C的信息
C中有A,B,D,E的信息
D中有A,C的信息
E中有C的信息
那么第二次聚合之后以此类推

以A结点为例,此时A聚合C的时候,C中有上一层聚合到的E的信息,所以这时A获得了二阶邻居E的特征。
目的
通过聚合更新,到*后,我们能够得到每个结点的表达,也就是特征feature,此时:

结点分类就可以直接拿去分类,算loss, 优化前面提到的W
关联预测就*简单的方法两个节点的特征一拼,拿去做分类,一样的算loss, 优化。
归根到底,GNN就是个提取特征的方法! ! ! ! !
黑盒子表示:
输入的是节点特征与图的结构
输出的是包含结构与特征的节点的*终特征
用*终特征去进行分类、预测、回归等操作。
GCN
修改的聚合部分
修改了GNN的聚合部分,提出解决 a 、 b 、 c a、b、c a、b、c值的设定问题。

平均法

%title插图%num

首先:提出将邻居的特征加起来作为特征求和。
之后又需要添加闭环:添加一个自环加上自身的特征。
然后:又将求和的特征平均一下的得到当前节点*终的特征。

平均法存在的问题

 

%title插图%num

马云-我的例子。

GCN提出的方法

 

%title插图%num

A ~ \tilde{A}
A
~
:邻接矩阵A+单位矩阵I(表示邻居的信息加上自己的信息)。
D ~ \tilde{D}
D
~
: A ~ \tilde{A}
A
~
的度矩阵。

%title插图%num

使用了对称归一化的拉普拉斯矩阵方法解决了这个问题。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速