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篇:通过树莓派进行实时物体检测(并让它讲话!)

Mxnet入门--第1篇相关推荐

  1. linux usb3.0改2.0,TX1入门教程硬件篇-切换USB2.0与USB3.0

    TX1入门教程硬件篇-切换USB2.0与USB3.0 说明: 介绍如何切换TX1USB口的为2.0或3.0版本 步骤: 编辑extlinux.conf文件,修改usb_port_owner_info= ...

  2. 微信公众号开发入门教程第一篇

    微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...

  3. React入门看这篇就够了

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...

  4. 一看就明白的爬虫入门讲解-基础理论篇(下篇)

    文/孔淼 上篇我分享了爬虫入门中的"我们的目的是什么"."内容从何而来"."了解网络请求"这三部分的内容,这一篇我继续分享以下内容: 1) 一些常见的限制方式 2) 尝试解决问题的思路 3) 效率问题 ...

  5. 一看就明白的爬虫入门讲解-基础理论篇(上篇)

    作者:孔淼 关于爬虫内容的分享,我会分成两篇,六个部分来分享,分别是: 1)  我们的目的是什么 2)  内容从何而来 3)  了解网络请求 4)  一些常见的限制方式 5)  尝试解决问题的思路 6 ...

  6. 怎么安装python_零基础入门必看篇:浅析python,PyCharm,Anaconda三者之间关系

    今天为大家带来的内容是:零基础入门必看篇:浅析python ,PyCharm,Anaconda三者之间关系 众所周知,Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C, ...

  7. Java快速入门-01-基础篇

    Java快速入门-01-基础篇 如果基础不好或者想学的很细,请参看:菜鸟教程-JAVA 本笔记适合快速学习,文章后面也会包含一些常见面试问题,记住快捷键操作,一些内容我就不转载了,直接附上链接,嘻嘻 ...

  8. .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

    写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能.今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git ...

  9. Spring Cloud 入门 之 Config 篇(六)

    一.前言 随着业务的扩展,为了方便开发和维护项目,我们通常会将大项目拆分成多个小项目做成微服务,每个微服务都会有各自配置文件,管理和修改文件起来也会变得繁琐.而且,当我们需要修改正在运行的项目的配置时 ...

最新文章

  1. 继人工智能攻陷围棋,德州扑克也沦陷了
  2. HDU2553 N皇后 回溯法+打表
  3. python日志模块的封装
  4. python 利用pexpect进行多机远程命令执行
  5. vsftpd 源码安装 linux/redhat
  6. 【Qt教程】1.11 - Qt5 标准对话框QMessageBox(关于、错误、信息、警告、问题、颜色、字体、文件对话框)
  7. android 动态改变listview的内容
  8. SQL Android
  9. Markdown语言调整图片居中、大小
  10. Hive窗口函数应用:级联累加求和场景
  11. windows2016服务器优化,Windows server 2016性能调优问题
  12. 【数据库学习笔记】Day03 - SQL语言基础及数据库定义功能
  13. 软考下午常见问题——个人笔记
  14. RK3588快速上手 | 01-RK3588开发板快速上手
  15. dedecms教程:采集教程
  16. 程序员副业之无货源闲鱼
  17. 【学习周报】注意力机制的工作原理和主流方法。
  18. 图解图库Janusgraph系列-一文知晓图数据底层存储结构
  19. Windows下清除cmd命令窗口所有的内容
  20. Mysql高级教程思维导图

热门文章

  1. 阿里云服务器硬盘不够用怎么办?
  2. debug : 应用程序无法正常启动(0xc000007b)
  3. transformers的beam_search
  4. 给FLASH加链接的方法
  5. 企业实战zabbix(7)--结合qqmail(报警信息发给qq用户)
  6. 白鹭安装node_Egret Engine(白鹭引擎)介绍及windows下安装
  7. MySql两台服务器(主机)间热备份(双机热备份)
  8. python 删除重复文件
  9. IOS开发高手课第三篇 App Auto Layout 是怎么进行自动布局的,性能如何?
  10. 嵌入式学习(3)ADC、DMA、通信方式