全球人工智能:专注为AI开发者提供全球最新AI技术动态和社群交流。用户来源包括:北大、清华、中科院、复旦、麻省理工、卡内基梅隆、斯坦福、哈佛、牛津、剑桥等世界名校的AI技术硕士、博士和教授;以及谷歌、腾讯、百度、脸谱、微软、华为、阿里、海康威视、滴滴、英伟达等全球名企的AI开发者和AI科学家。
文章来源:GitHub 编辑:马卓奇博士
Forge 是一个开源库,可以方便使用苹果的MPSCNN框架来构建神经网络。
为什么需要Forge?
苹果的MPSCNN框架很适合在iOS设备上创建快速的深度学习网络。他使用Metal技术助力,能够让你的iPhone的GPU发挥最好的作用。然而使用GPU也有不好的一面:Metal只会从纹理和图像方面考虑问题。将图像作为卷积网络的输入是很常见的,但是你还需要把网络的输出转化成你可以用Swift调用的东西。那对于非图像数据,例如音频和文字,网络该如何工作呢?Forge可以很简单的将你的数据转换形成纹理特征。
例如,一个分类网络会产生类别可能性分布。你所需要的是一个浮点数矩阵,但是Metal给你的是一个MTLTexture文件,嵌在一个MPSImage文件中,他们都使用的奇怪的16位浮点数存储.
使用Forge,你可以简单的用下面的命令来获得前5个预测分数最高的标签:
let probabilities = outputImage.toFloatArray()let top5 = probabilities.top(k: 5)
Forge的亮点
计算核
大部分神经网络都需要自定义计算核,Forge可以可以协助你写出自己的计算核。
预处理核
一般情况下,在数据进入网络之前都要进行预处理,Forge自带了一些很好用的预处理核:
· 颜色去均值
· RGB转Gray
· RGB转BGR
更多网络层。
MPSCNN只支持有限数量层,所以Forge增加了其中没有的自定义层:
· 深度卷积
· 转置通道
· 反卷积
调试工具
当你在Metal中实现神经网络时,你想确认它的计算是正确的。根据Metal编码数据的方式,观察MTLTexture的内容不是一直那么直白。Forge可以帮助到这一点。
领域特定语言(domain-specific language,DSL)
然而,Forge目前最大的特征是领域特定语言(domain-specific language,DSL),为你的网络创作层只需要很简单的指令。
没有开发模版了!
在iPhone上实现深度学习网络总是需要大量的开发模版代码。苹果的Inception-v3网络的样例代码用了大概2000行代码来设置和运行网络。这样的代码写起来很慢,而且还很容易出错。有了Forge的领域特定语言,定义一个完整的神经网络只需要几行代码。、
目前该功能只支持基础的卷积,池化和全连接层。你也可以插入你自己的计算核。将来作者会增加对多种层的支持。
这种迷你语言的好处就是在他流通过整个网络的时候,它会自动推算数据的大小。
样例中的Resize层可以将任何大小的RGB图像缩减成64×64的尺寸。
每个卷积层(Convolution layer)都会增加数据的深度,每个最大池化层(MaxPooling layer )会将空间维度减半。
该网络的数据形状为(宽度*高度*深度):
如果只用MPSCNN代码,你还需要对所有不同尺寸的数据建立MPSImageDeor项。Forge会代替你完成这些工作,你永远都不需要再建立一个MPSImageDeor项了。
Inception-v3网络现在只需要130行代码就足够说明,而不用2000行了。样例可以参考该网页:https://github.com/hollance/Forge/blob/master/Examples/Inception/Inception/Inception3.swift
编译模型
当你指定了模型之后,你可以编译它:
编译首先计算层输出的形状,然后为该层建立MPSCNN项。
MPSCNN卷积(MPSCNNConvolution)项或MPSCNN全连接(MPSCNNFullyConnected)项需要知道网络学习的权重和偏置,所以你需要提供这些参数。这样一来,model.compile()函数进行闭包,并且返回一个参数数据(ParameterData)项。
这样的闭包函数对于使用参数的每一层都会调用,一次计算权重,一次计算偏置。上面的例子会返回一个ParameterLoaderBundle实例,它是ParameterData的实现,可以从在程序束储存的文件中读入权重和偏置。对于命名为“Conv1”的层,它会下载文件conv1_W.bin (权重)和conv1_b.bin(偏置)。
在模型成功编译之后,print(model.summary())命令会输出一个列表,包含模型中所有的层。这对于复查是很有用的。
如果你使用过Keras,这个应该看起来很熟悉,的确,Keras是Forge的DSL的创作灵感来源。注意到每层输出的形状是根据层参数自动计算的,例如计算核的尺寸,带宽等等。
有什么缺点呢?
使用这种DSL来定义网络时有个一缺点:会出现不可避免的间接消耗,因为Forge需要横贯整个层图,并且组装所有的片段。这比手动的代码要慢。
你当然是希望你的网络代码运行速度越快越好,尤其是编码了GPU增益时。DSL在这里也会有一些间接消耗。不过在实际应用中这种速度差基本可以忽略不计。消耗的时间绝大部分都是在编码和运行GPU指令上。在目前的硬件水平下你的网络的运行速度,都会比Forge慢几个数量级。
如何实现运行Demo!
在Xcode 中打开Forge.xcworkspace,然后在你的设备上运行MNIST程序,就可以观看Forge在活动状态下的演示。
你需要Xcode 8.3版本及以上,以及带有A8处理器的设备(iPhone6及以上),运行系统为iOS10或更新的系统。如果不支持Metal的话,是无法建立模拟器的。
如何安装
使用Xcode 8.3版本及以上。
1 复制Forge文件夹到你的项目下。
2 使用File > Add Files to "YourProject" > Forge.xcodeproj 来把Forge项目添加到你的项目内。
3 将Products/Forge.framework拖入项目设置的Embedded Binaries部分
4 在代码中导入Forge。
使用方法
使用领域特定语言来产生新网络的样例:https://machinethink.net/blog/forge-neural-network-toolkit-for-metal/
热门文章推荐
我来说两句排行榜