阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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:4611772
用户头像

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

关注

评论

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

从工具、工具箱到数字化软件工厂——DevOps 设计理念与工程实践专场 | CIF 精彩看点

CODING DevOps

DevOps 数字化 研发工具 腾讯云 CIF 峰会

用Python绘制专业的K线图【含源代码】

恒生LIGHT云社区

金九银十不要怕!有了腾讯这本2021年最新Java面试手册,offer手到擒来!

Java 程序员 架构 面试 后端

CTF压轴题解题思路和过程

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

打造“大国重器”高性能计算,联想与英特尔如何携手点亮数字经济加速度?

脑极体

AlibabaP9力荐!最新出品1297页JDK源码+并发核心原理解析小册

Java 架构 面试 程序人生 编程语言

通俗易懂!306页图解计算机网络,涵盖所有基础知识

Java 架构 面试 程序人生 编程语言

linux线上CPU100%排查

入门小站

Linux

快手、知乎等平台严厉打击“病媛”炒作行为:自媒体行业不能被流量裹挟

石头IT视角

如何做一场有趣又高效的迭代回顾会议?

万事ONES

Scrum 敏捷 回顾会

拥抱开源,共建生态 - 开源生态与效能提升专场 | CIF 精彩看点

CODING DevOps

DevOps 研发效能 腾讯云 CIF 峰会 开源生态

音视频终端引擎优化实践

百度开发者中心

最佳实践 音视频 实践案例 智能视频 行业深度

互斥锁、自旋锁、读写锁...理清它们的区别和应用

行云创新

云计算 编程 开发 应用

JVM g1 gc 学习笔记二

风翱

GC 9月日更

002云原生之架构定义

穿过生命散发芬芳

云原生 9月日更

智能网联汽车行业信息安全现状与威胁

SOA开发者

强烈推荐!88页《Redis学习文档》完整版,PDF开放下载

Java 架构 面试 程序人生 编程语言

北鲲云超算平台如何将云计算与高性能计算结合

北鲲云

一文了解「模块化」 区块链的当前形势:执行、安全性及数据可用性

CECBC

【新品尝鲜】OCR磅单识别上线邀测,为货运物流提速增效

百度大脑

人工智能 OCR

如何让文件共享 SDK 支持使用 Uri 上传文件

ZEGO即构

文件存储 分区存储 文件共享

浪潮云洲荣获两项工业自动化及数字化行业年度大奖 inspur浪潮云 昨天

浪潮云

云计算

史上最全Java高频面试合集,命中率高达95%

Java 程序员 架构 面试 后端

超十年渗透专家总结出636页渗透测试全笔记,100课时一次讲清

Java 架构 面试 程序人生 编程语言

重磅来袭,虚拟化技术分类

hanaper

手把手教你使用Studio Lite + Digtal car!助力智能汽车场景、轻应用开发更轻松!

SOA开发者

5G三年成厦,泛在千兆为应用造榫卯

脑极体

提高工作效率的三种方法

石云升

团队管理 管理 引航计划 内容合集 9月日更

行云创新:云原生技术助力企业数字化转型

行云创新

技术 云原生 转型 数字化 平台

FunTester框架Redis性能测试之map & INCR

FunTester

redis 性能测试 测试框架 测试开发 FunTester

华为大牛总结的超全Linux学习笔记,看这一篇就够了!

Java 架构 面试 程序人生 编程语言

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