选自Sony
机器之心编译
参与:蒋思源、李泽南
索尼昨天宣布开源了自己的神经网络库 NNabla,其中包含用于深度学习系统的 Python API 与用于嵌入式设备的 C++ API。彭博社也表示索尼正在加入谷歌、Facebook 和亚马逊等巨头的人工智能开发竞争。
神经网络是深度学习模型的核心,后者自 2012 年在图像识别领域获得突破性进展以来获得了人们的广泛关注。现在,深度学习已经在很多领域中获得应用,它不仅仅是一种图像识别的算法,也是一种用于建模的黑箱系统。
用于处理深度学习模型的架构各有不同:从小到大,从前馈到循环,从非监督到监督……对于深度学习技术的研究发展也有很快速度,新的架构、组件或神经网络每天都在出现。目前装备 GPU 的高性能深度学习计算机或集群,对于运行深度学习的移动设备、物联网设备的要求也在催生技术的发展。
索尼从 2010 年起就加入了深度学习的研究行列。这次开源的深度学习核心库已是其研究成果的第三代了,它包含以下特性:
索尼官方将很快发出更具体更详细的神经网络库使用方法。
索尼表示他们的神经网络库提供了最基本的深度学习开发研究和部署的函数。他们希望该软件库能推动人工智能的发展,并且不论是在先进研究领域还是前沿应用部署上都能提供强有力的助力。
下面是该神经网络库的 Github 项目介绍:
NNabla 是一个深度学习框架,计划在研究,开发与生产领域当中使用。索尼的目标是让它可以在任何地方运行,就像个人笔记本电脑、高性能计算集群、嵌入式装置和生产服务器一样。因此索尼希望通过提供高效便捷的机器学习库而将算法嵌入到边缘设备中。
安装
安装 NNabla 很简单:
pip install nnabla
这是 CPU 版本的 NNabla,GPU-加速器可以通过安装 CUDA 工具包来添加:pip install nnabla-ext-cuda
特征
简单,灵活并且有表现力
基于 NNabla C++11 内核的 Python API 给你提供了灵活性和高产出效率。例如,一个带有分类损失的两层神经网络可以仅通过以下 5 行代码被定义(超参数由<>括出)。
import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF
x = nn.Variable(<input_shape>)
t = nn.Variable(<target_shape>)
h = F.tanh(PF.affine(x, <hidden_size>, name='affine1'))
y = PF.affine(h, <target_size>, name='affine2')
loss = F.mean(F.softmax_cross_entropy(y, t))
训练可以通过以下步骤来完成:
import nnabla.solvers as S
# Create a solver (parameter updater)
solver = S.Adam(<solver_params>)
solver.set_parameters(nn.get_parameters())
# Training iteration
for n in range(<num_training_iterations>):
# Setting data from any data source
x.d = <set data>
t.d = <set label>
# Initialize gradients
solver.zero_grad()
# Forward and backward execution
loss.forward()
loss.backward()
# Update parameters by computed gradients
solver.update()
动态计算图使网络结构的执行时间变得灵活。NNabla 可以使用静态和动态图的模型,在两种情况下都使用相同的 API。
x.d = <set data>
t.d = <set label>
drop_depth = np.random.rand(<num_stochastic_layers>) < <layer_drop_ratio>
with nn.auto_forward():
h = F.relu(PF.convolution(x, <hidden_size>, (3, 3), pad=(1, 1), name='conv0'))
for i in range(<num_stochastic_layers>):
if drop_depth[i]:
continue # Stochastically drop a layer
h2 = F.relu(PF.convolution(x, <hidden_size>, (3, 3), pad=(1, 1),
name='conv%d' % (i + 1)))
h = F.add2(h, h2)
y = PF.affine(h, <target_size>, name='classification')
loss = F.mean(F.softmax_cross_entropy(y, t))
# Backward computation (can also be done in dynamically executed graph)
loss.backward()
便携式和多平台
可扩展性
高效性
文档
安装
入门指南
本文为机器之心编译,转载请联系本公众号获得授权。