立即领取|华润集团、宁德核电、东风岚图等 20+ 标杆企业数字化人才培养实践案例 了解详情
写点什么

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

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

关注

评论

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

诚邀报名|探寻AI融合的前端开发之道:解除焦虑,构建核心竞争力

开放原子开源基金会

开源

唯品会商品列表数据接口(Vip.item_search)丨唯品会API接口

tbapi

唯品会商品列表数据接口 关键词搜索唯品会接口 唯品会API接口 唯品会商品数据接口 唯品会商品API接口

centos 7.6安装sealos和单机集群

麦兜

TDengine 创始人陶建辉出席 CIAS 2023 年会,为新能源汽车数据处理带来新思路

TDengine

tdengine 时序数据库

现代 CPU 技术发展 | 京东云技术团队

京东科技开发者

软件开发 cpu 性能提升

诚邀报名|与你同行——开源教育晨雾中的早行者

开放原子开源基金会

开源

顶级加密混淆混淆工具测评:ipagurd

一起学Elasticsearch系列-深度分页问题

Java随想录

Java 大数据 elastic

一款双极锁存型霍尔位置传感器

梦笔生花

5G和云渲染将如何快速推进XR和元宇宙?

3DCAT实时渲染

云渲染 元宇宙解决方案

杭州悦数成立「悦数图技术陆家嘴数据智能研究院」,入驻上海陆家嘴金融城「双城辉映」平台

最新动态

支付宝 v3 自签名如何实现

盐焗代码虾

Java 支付宝 签名 加签

web3钱包进阶!从入门到精通,Bitget实现逆袭

股市老人

脉脉宣布全员下调,华为莫名奇妙躺枪。。。

Jackpop

开源时代:极狐GitLab如何保证软件供应链安全

极狐GitLab

vivo 容器平台资源运营实践

vivo互联网技术

容器平台 资源运营 利用率提升

[译]优秀的URL设计

南城FE

前端 后端 url

C 语言运算符详解

小万哥

c c++ 程序员 后端 软件开发

华为终于开奖了,结果有点可笑

Jackpop

软件开发

Geek_8da502

Wi-Fi 6 vs. Wi-Fi 6E: The differences between IPQ6018, IPQ6010 and IPQ5018

wallysSK

倒计时3天|开源开发者的技术年末盛典即将开启

开放原子开源基金会

开源

使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理 | 京东云技术团队

京东科技开发者

Chappyz 生态迎重磅利好:多链应用程序启动、100% 收入共享计划开启

股市老人

大数据时代:我对大数据的发展趋势与前景展望

屿小夏

大数据

如何写好Prompt,让GPT 的回答更加精准

Bob Lin

人工智能 openai ChatGPT GPT-4 langchain

诚邀报名|来开源项目维护者论坛,为项目可持续发展贡献您的声音

开放原子开源基金会

开源

宏 | AI工程化部署

AIWeker

c AI AI工程化部署

#issue 111538 MySQL 8.0 instant add/drop column 性能回退问题

ba0tiao

MySQL InnoDB

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