武汉的开发者们注意啦!AI技术战略、框架以及最佳实战尽在Azure OpenAI Day 了解详情
写点什么

MXNet API 入门 —第 1 篇

  • 2017-06-26
  • 本文字数:3219 字

    阅读完需:约 11 分钟

MXNet 教程

这一系列文章将概括介绍深度学习库 MXNet ,将介绍该库的主要功能及其 Python API(可能会成为该库的首选 API)。随后还将提供一些有关 MXNet 的在线教程和笔记,希望能帮助大家更好地理解这项技术!

如果希望进一步了解 MXNet 的原理和架构,推荐阅读这篇论文:“MXNet:适用于异构分布式系统,灵活高效的机器学习库”。本文将介绍这篇论文涉及的大部分概念,不过会尽量以更浅显易懂的方式进行介绍。

本文将尽可能清晰直白地讲解,但你需要对数学和基本术语有一定了解,本文不会(刻意)从最基础的内容讲起。这一系列文章不会让你变成该领域的专家(我自己都还不是专家),本文目的在于帮你更好地理解如何为自己的应用添加深度学习能力。

在本地运行MXNet

首先最重要的事:MXNet 的安装。本文不会详细介绍安装方法,只会介绍一些技巧。

MXNet 最酷的功能之一在于,可以在 CPU 和 GPU 上实现完全相同的运行效果(下文将介绍如何针对具体运算选择运行位置)。这意味着就算你的计算机不具备 Nvidia GPU(例如我的 MacBook),依然可以编写并运行 MXNet 代码,并放在具备 GPU 的系统中使用。

如果你的计算机带有符合要求的 GPU 也更好,但还需要安装 CUDA cuDNN 工具包,大部分情况下这一过程犹如一场噩梦。就算 MXNet 二进制文件和 Nvidia 工具之间存在哪怕最轻微的不兼容问题,也会导致安装失败无法使用。

因此我个人强烈建议你使用 MXNet 网站提供的 Docker 镜像:一个针对 CPU 环境,另一个针对 GPU 环境(要求具备 nvidia-docker )。这些镜像包含预安装的所有必要组件,可以帮助用户更快速投入使用。

复制代码
sudo -H pip install mxnet --upgrade
python
>>> import mxnet as mx
>>> mx.__version__
'0.9.3a3'

另外值得一提的是,这个 Docker 镜像提供的 Python 程序包似乎比通过“pip”方式获得的版本更新一些

复制代码
docker run -it mxnet/python
root@88a5fe9c8def:/# python
>>> import mxnet as mx
>>> mx.__version__
'0.9.5'

通过 AWS 运行 MXNet

AWS 提供了适用于 Linux Ubuntu 深度学习 AMI (Amazon Machine Image)。这些 AMI 包含预安装的各种深度学习框架(MXNet 是其中之一),此外还包含 Nvidia 工具以及其他工具。无需配置立即可用

复制代码
====================================================================
__| __|_ )
_| ( / Deep Learning AMI for Amazon Linux
___|\___|___|
====================================================================
[ec2-user@ip-172-31-42-173 ~]$ nvidia-smi -L
GPU 0: GRID K520 (UUID: GPU-d470337d-b59b-ca2a-fe6d-718f0faf2153)
[ec2-user@ip-172-31-42-173 ~]$ python
>>> import mxnet as mx
>>> mx.__version__
'0.9.3'

我们可以在常规实例或 GPU 实例上运行这种 AMI。如果你的计算机未配备 Nvidia GPU,那么在稍后启动训练网络后这一特性就会显得很实用:成本最低的选项是使用每小时价格仅为 0.65 美元的g2.2xlarge实例。

因此目前,继续按照老派的做法使用 CPU 就够了!一起开始吧。

为何说 NDArrays 很重要

我们要介绍的第一类 MXNet API 是NDArray API。NDArray 是一种n 维阵列,其中可包含类型与大小完全一致的项(32 位浮点、32 位整数等)。

这种阵列为何重要?之前的一篇文章中进行过解释:神经网络的训练和运行会涉及大量数学运算,此时将使用多维阵列来存储数据。

输入数据,神经元进行权值,随后输出的数据存储至向量和矩阵(Matrice)中,因此自然而然就产生了这种类型的构造。

用一个简单的例子来类比一下:图片分类。下图代表一个手写的数字“8”,图片规格为 18x18 像素。

数字“8”,18x18 像素

这个图片可以看作是一个 18x18 的矩阵,其中每个单元代表了对应像素的灰度值:“0”代表白色,“255”代表黑色,介于两者之间的值代表 254 级灰度。我们正是通过这种矩阵化的呈现训练神经网络对从 0 到 9 的数字进行分类的。

一个 18x18 的矩阵,代表了上述图片的灰度值

假设我们用彩色图片取代灰度图片。这样每个图片将需要用 3 个矩阵来表示,每种颜色对应一个矩阵,此时输入的数据会变得略微复杂一些。

接着更进一步,假设为了实现无人驾驶需要进行实时图片识别:为了能通过高质量的实时数据做决策,我们会使用 1000x1000 像素的 RGB 图片,并且每秒钟需要识别 30 帧。每一秒,都需要处理 90 个 1000x1000 的矩阵(30 帧 x3 色)。如果每个像素用一个 32 位值表示,那就是 90x1000x1000x4 字节,大约 343 兆字节。如果用到了多个摄像头,数据量还会进一步激增。

对神经网络来说这个数据量已经很大了:为了获得最优性能(例如最小延迟),GPU 并不会逐张处理图片,而是会偏批量处理。如果批的大小为 8,我们的神经网络将以 1000x1000x24 的块为单位处理输入的数据,也就是以三原色代表的 8 张 1000x1000 像素图片组成的三维阵列。

底线:最起码需要理解 NDArrays :) 这是神经网络的基础,并且我们的大部分数据都会存储为这种形式。

NDArray API

了解了 NDArrays 的重要性后,再来看看工作方式(没错,终于开始讲代码了!)。如果你曾用过 numpy 这个 Python 库会更好理解:NDArrays 与其极为类似,并且你可能已经熟悉其中的大部分 API,完整文档可参阅这里

首先从最基础的开始。这就不需要过多解释了吧 :)

复制代码
>>> a = mx.nd.array([[1,2,3], [4,5,6]])
>>> a.size
6
>>> a.shape
(2L, 3L)
>>> a.dtype
<type 'numpy.float32'>

默认情况下,一个 NDArray 可以保存 32 位浮点,不过这个大小可以调整。

复制代码
>>> import numpy as np
>>> b = mx.nd.array([[1,2,3], [2,3,4]], dtype=np.int32)
>>> b.dtype

NDArray 的打印很简单,这样:

复制代码
>>> b.asnumpy()
array([[1, 2, 3],
[2, 3, 4]], dtype=int32)

NDArray 支持所有需要的数学运算,例如可以试试看进行一个面向元素的矩阵乘法:

复制代码
>>> a = mx.nd.array([[1,2,3], [4,5,6]])
>>> b = a*a
>>> b.asnumpy()
array([[ 1., 4., 9.],
[ 16., 25., 36.]], dtype=float32)

再来个严格意义上的矩阵乘法(又叫“点积”)怎么样?

复制代码
>>> a = mx.nd.array([[1,2,3], [4,5,6]])
>>> a.shape
(2L, 3L)
>>> a.asnumpy()
array([[ 1., 2., 3.],
[ 4., 5., 6.]], dtype=float32)
>>> b = a.T
>>> b.shape
(3L, 2L)
>>> b.asnumpy()
array([[ 1., 4.],
[ 2., 5.],
[ 3., 6.]], dtype=float32)
>>> c = mx.nd.dot(a,b)
>>> c.shape
(2L, 2L)
>>> c.asnumpy()
array([[ 14., 32.],
[ 32., 77.]], dtype=float32)

接着再来试试一些更复杂的运算:

  • 初始化一个均匀分布的 1000x1000 矩阵并存储在 GPU#0(此处使用了一个 g2 实例)。
  • 初始化另一个正态分布的 1000x1000 矩阵(均值为 1,标准差为 2),也存储在 GPU#0。
复制代码
>>> c = mx.nd.uniform(low=0, high=1, shape=(1000,1000), ctx="gpu(0)")
>>> d = mx.nd.normal(loc=1, scale=2, shape=(1000,1000), ctx="gpu(0)")
>>> e = mx.nd.dot(c,d)

别忘了,MXNet 可以在 CPU 和 GPU 上实现一致的运行结果。这就是个很棒的例子:只要将上述代码中的“gpu(0)”替换为“cpu(0)”,就可以通过 CPU 运行这个点积。

至此你应该可以开始与 NDArray 一起游戏了。我们还可以用其他更高级的函数(FullyConnected 等)来构建神经网络,这些内容等真正开始介绍神经网络的时候再说。

今天要讲的就是这些。下篇文章将要介绍 Symbol API,通过它我们可以定义数据流,而这才是神经网络最重要的部分。感谢阅读,还请继续关注。

后续内容:

- 第 2 篇:Symbol API

- 第 3 篇:Module API

- 第 4 篇:使用预训练模型进行图片分类(Inception v3)

- 第 5 篇:进一步了解预训练模型(VGG16 和 ResNet-152)

- 第 6 篇:通过树莓派进行实时物体检测(并让它讲话!)

作者 Julien Simon 阅读英文原文 An introduction to the MXNet API?—?part 1


感谢杜小芳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-06-26 17:4611751
用户头像

发布了 283 篇内容, 共 101.5 次阅读, 收获喜欢 61 次。

关注

评论

发布
暂无评论
发现更多内容

不知不觉不假思索——可供性

Justin

心理学 28天写作 游戏设计

KubeEdge 1.6发布:可靠的K8s原生边云API

华为云原生团队

开源 云原生 边缘技术 kubeedge

百分点大数据技术团队:数据治理“PAI”实施方法论

百分点大数据团队

Elasticsearch Analyzer 分词器

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 3月日更

云小课丨网络好不好,ping一下就知道

华为云开发者联盟

网络 虚拟私有云 ping ICMP 安全组

一个简单实用的Linux性能分析工具

运维研习社

Linux 性能分析

聊聊园区网中的专网架构

冯骐

运维 网络 VRF 虚拟路由表

2021 创新加速周蓄势待发,铆足牛劲再出发!

亚马逊云科技 (Amazon Web Services)

建信金科大咖访谈:金融科技驱动业务创新,智慧运营引领发展转型

金科优源汇

Nydia

翻译:《实用的Python编程》03_05_Main_module

codists

Python

MySQL数据库DDL、DML详解

若尘

MySQL

《精通比特币》学习笔记(第二章)

棉花糖

区块链 读书笔记

笔记整理:技术架构涵盖内容和演变过程总结

小傅哥

Java 程序员 小傅哥 架构设计 架构图

互联网短平快下,DevCloud如何支撑软件开发的“转型”?

华为云开发者联盟

android 敏捷开发 软件开发 华为云 devcloud

详解NLP和时序预测的相似性(附赠AAAI21最佳论文INFORMER的详细解析)

华为云开发者联盟

自然语言处理 深度学习 时序预测 RNN Informer

AI数学基础之:概率和上帝视角

程序那些事

人工智能 AI 程序那些事 概率论

华云大咖说 | 高校混合云建设及应用

华云数据

聊聊我对SCRM的理解

boshi

CRM 七日更

Java的锁

并发编程

滚雪球学 Python 第二轮开启,进阶之路,列表与元组那些事儿

梦想橡皮擦

28天写作 3月日更

25个关键技术点,带你熟悉Python

华为云开发者联盟

Python

SQL Server 删除正在使用数据库

田镇珲

是什么支持“毅力号”在火星上尽情摄影?

亚马逊云科技 (Amazon Web Services)

关于写作的一点小想法「Day 13」

道伟

28天写作

从JVM底层原理分析数值交换那些事

秦怀杂货店

JVM 交换数值

Kubectl Plugin 推荐(一)| 可观测性篇

郭旭东

kubectl kubectl plugin

Shibboleth IdP4 升级指南

冯骐

认证 Shibboleth IdP 上海教育认证 上海教育

智汇华云 | ArcherOS Stack—软件定义数据中心“利器”

华云数据

百分点数据科学实验室:产品生命周期管理创新应用落地实践

百分点大数据团队

人民网:亚马逊云科技,以这样姿势扎根中国!

亚马逊云科技 (Amazon Web Services)

MXNet API入门 —第1篇_语言 & 开发_Julien Simon_InfoQ精选文章