mxnet深度学习(NDArray)

MXNet里面的3个主要的概念:

NDArray:NDArray提供了矩阵和张量(tensor)运算在CPU和GPU上,通过使用并行运算的技术。

Symbol:Symbol使得定义一个神经网络变得更加简单,并且自动提供差异化(用于区别别的神经网络)。

KVStore: KVStore  提供数据同步在有多个GPU和CPU的机器上。

NDArray(Numpy风格的,可以在CPU和GPU运算的张量计算模块)

NDArray与numpy.ndarray相似,但是它多了以下两点:

1.多个设备支持:所有的操作可以支持GPU和CPU。

2.自动并行:所有的操作都是以并行的方式进行的。

创建和初始化

我们可以创建NDArray在CPU和GPU上:

>>> import mxnet as mx
>>> a = mx.nd.empty((2, 3)) # create a 2-by-3 matrix on cpu
>>> b = mx.nd.empty((2, 3), mx.gpu()) # create a 2-by-3 matrix on gpu 0
>>> c = mx.nd.empty((2, 3), mx.gpu(2)) # create a 2-by-3 matrix on gpu 2
>>> c.shape # get shape
(2L, 3L)
>>> c.context # get device info
gpu(2)

它们可以初始化通过不同的方式

>>> a = mx.nd.zeros((2, 3)) # create a 2-by-3 matrix filled with 0
>>> b = mx.nd.ones((2, 3))  # create a 2-by-3 matrix filled with 1
>>> b[:] = 2 # set all elements of b to 2

我们可以把值从一个NDArray到另一个,即使它们在不同的设备上

>>> a = mx.nd.ones((2, 3))
>>> b = mx.nd.zeros((2, 3), mx.gpu())
>>> a.copyto(b) # copy data from cpu to gpu

我们可以把NDArray转换成numpy.ndarray

>>> a = mx.nd.ones((2, 3))
>>> b = a.asnumpy()
>>> type(b)
<type 'numpy.ndarray'>
>>> print b
[[ 1.  1.  1.][ 1.  1.  1.]]

反之亦然

>>> import numpy as np
>>> a = mx.nd.empty((2, 3))
>>> a[:] = np.random.uniform(-0.1, 0.1, a.shape)
>>> print a.asnumpy()
[[-0.06821112 -0.03704893  0.06688045][ 0.09947646 -0.07700162  0.07681718]]
</pre>

基础操作


元素级操作是默认的,NDArray执行的是元素级的操作(这和matlab里面和我们线性代数里面学的不一样)
如果两个NDArray在不同的设备上,我们需要显示的把他们移到同一个设备上。

下面的代码显示了在GPU 0操作的例子

加载和保存

下面有两个方式去保存(加载)数据从磁盘上。第一个方式是pickle,NDArray是pickle compatible,意味着你可以简单的把NDArray进行pickle,就像在numpy.ndarray里面一样。
第二个方式是直接把一列NDArray以二进制的格式存到磁盘中(这时就不用pickle了)
我们还可以存一个字典(dict)
另外,如果设置了分布式系统比如S3和HDFS,我们可以直接去保存和加载它们(一般都没有用)
>>> mx.nd.save('s3://mybucket/mydata.bin', [a,b])
>>> mx.nd.save('hdfs///users/myname/mydata.bin', [a,b])
</pre>

用自动并行运算

NDArray可以自动并行执行操作。这是需要的,当我们需要使用多个资源如CPU,GPU,和CPU-to-GPU的内存带宽。   举个栗子,如果我们写a+=1在b+=1的后面,a是在CPU而b是在GPU,然后我们接下去想并行执行它们来提高效率。此外,在CPU和GPU之间进行数据拷贝的开销是很昂贵的,所以我们希望把它们和其他的运算一起并行计算。

然而,通过眼睛来找可以并行运算的语句是比较累人的。在下面的例子里面,a+=1和c*=3是可以被并行执行的,但是a+=1和b*=3必须顺序执行。
幸运的是,MXNet在确保运行正确的情况下,可以自动解决依赖问题。换句话说,我们可以写程序就像一个单一的线程,MXNet将会自动派遣它们到多个设备,如具有多个GPU的显卡,和多台机器上。

这是通过惰性评估来实现的。任何我们写的操作都是通过一个中间引擎来发行的,然后返回。举个栗子,如果我们运行a+=1,它在执行加法操作后立即返回这个引擎。这个异步性允许我们发出更多的操作给引擎,所以它可以决定读写依赖并找到最好的并行执行它们的方式。

实际的计算是当我们想把结果拷贝到其它地方的时候完成的,比如print a.asnumpy() (复制到终端)或者mx.nd.save([a])。因此,如果我们想去写高效的并行的代码,我们只需要延缓请求结果的时间。
a = mx.nd.ones((2,3))
b = a
c = a.copyto(mx.cpu())
a += 1
b *= 3
c *= 3
>>> mx.nd.save('mydata.bin', {'a':a, 'b':b})
>>> c = mx.nd.load('mydata.bin')
>>> print c['a'].asnumpy()
[[ 2.  2.  2.][ 2.  2.  2.]]
>>> print c['b'].asnumpy()
[[ 3.  3.  3.][ 3.  3.  3.]]
>>> a = mx.nd.ones((2,3))*2
>>> b = mx.nd.ones((2,3))*3
>>> mx.nd.save('mydata.bin', [a, b])
>>> c = mx.nd.load('mydata.bin')
>>> print c[0].asnumpy()
[[ 2.  2.  2.][ 2.  2.  2.]]
>>> print c[1].asnumpy()
[[ 3.  3.  3.][ 3.  3.  3.]]
>>> import mxnet as mx
>>> import pickle as pkl>>> a = mx.nd.ones((2, 3)) * 2
>>> data = pkl.dumps(a)
>>> b = pkl.loads(data)
>>> print b.asnumpy()
[[ 2.  2.  2.][ 2.  2.  2.]]
>>> a = mx.nd.ones((2, 3)) * 2
>>> b = mx.nd.ones((2, 3), mx.gpu()) * 3
>>> c = a.copyto(mx.gpu()) * b
>>> print c.asnumpy()
[[ 6.  6.  6.][ 6.  6.  6.]]
>>> a = mx.nd.ones((2, 3)) * 2
>>> b = mx.nd.ones((2, 3)) * 4
>>> print b.asnumpy()
[[ 4.  4.  4.][ 4.  4.  4.]]
>>> c = a + b
>>> print c.asnumpy()
[[ 6.  6.  6.][ 6.  6.  6.]]
>>> d = a * b
>>> print d.asnumpy()
[[ 8.  8.  8.][ 8.  8.  8.]]

mxnet深度学习(NDArray)相关推荐

  1. mxnet深度学习(Symbol)

    mxnet深度学习(Symbol) 自动标志化区分 NDArray是一个基础的计算单元在MXNet里面的.除此之外,MXNet提供一个标志化的接口,叫做Symbol,为了简化构造神经网络.标志化结合了 ...

  2. mxnet深度学习(KVS)

    mxnet深度学习(KVS) 分布式的键值对的存储(Ditstributed Key-value Store) KVStore是一个数据共享的地方.我们可以把它认为他是一个简单的类横跨不同的设备(GP ...

  3. 检验 pytorch,tensorflow,paddle,mxnet 深度学习框架是否正确支持GPU功能

    检验 pytorch,tensorflow,paddle,mxnet 深度学习框架是否正确支持GPU功能 1.pytorch 框架 import torch a = torch.cuda.is_ava ...

  4. MXNET深度学习框架-03-采用ndarray和autograd实现线性回归

    采用ndarray和autograd实现线性回归 虽然现在有很多深度学习框架,但它们大多继承了所有的回归/分类任务,我们也只能使用它,无法了解其原理,所以,本文只用ndarray和autograd从0 ...

  5. MXNET深度学习框架-09-使用正则化方法解决过拟合问题(以从0开始的线性回归为例)

    本章我们使用一个高维线性回归的例子来做解决过拟合的问题. 相关公式:          y=0.05+∑i=1p0.01xi+noisey=0.05+\sum_{i=1}^p0.01x_i+noise ...

  6. 深度学习高能干货:手把手教你搭建MXNet框架

    导读:相信很多程序员在学习一门新的编程语言或者框架时,都会先了解下该语言或者该框架涉及的数据结构,毕竟当你清晰地了解了数据结构之后才能更加优雅地编写代码,MXNet同样也是如此. 在MXNet框架中你 ...

  7. 【BDTC 2015】深度学习分论坛:DL的图像识别、语音识别应用进展及MxNet开源框架设计

    发表于2015-12-15 17:18|4514次阅读| 来源CSDN|0 条评论| 作者王玮 大数据技术大会深度学习论坛 摘要:12月10-12日,2015中国大数据技术大会盛大开幕,11日下午深度 ...

  8. 深度学习框架【MxNet】的安装

    文章目录 前言 一.MXNet的前世今生 二.mxnet的安装 1.CPU安装 2.GPU安装,以cuda10.1为例 三.报错提醒 前言 本文简介安装mxnet深度学习框架,下边开始对深度学习框架m ...

  9. 从TensorFlow到DL4J——主流深度学习框架对比分析

    从TensorFlow到DL4J--主流深度学习框架对比分析 2022年2月22日 极链AI云 官网地址 点击注册 更多AI小知识,关注<极链AI云>公众号 文章目录 从TensorFlo ...

最新文章

  1. alias重启终端失效的问题
  2. k8s使用kube-router网络插件并监控流量状态
  3. [转载] 财经郎眼20120409:证监会“百日维新”
  4. 生活、教育等相关概要
  5. Springboot 集成Springcloud gateway的入门
  6. JVM 参数含义:-Xms和-Xmx
  7. 2015大学计算机基础,2015新生入学大学计算机基础复习资料
  8. html中源文件回车效果无效,网页制作使用教程第2节初级.ppt
  9. I - 滑雪 POJ - 1088(深搜,记忆化搜索)
  10. 【ARDUINO】HC-05蓝牙不配对问题
  11. 利用Layer组件弹出多个对话框(非嵌套)与关闭及刷新
  12. 半天的成果,已经很快了,还有方案实现过程
  13. matlab求机制,[转载]文化算法 matlab
  14. 演出节目名字_华晨宇——让我看娱乐节目看到感动
  15. element ui的时间选择器
  16. vga分辨率与时序配置
  17. 学校计算机教室张贴些,计算机教室墙面布置方法是什么?
  18. 小甲鱼零基础python 魔法方法之 算数运算1(P43)
  19. RISC-V为中国MCU企业打开一个新窗口!
  20. 【深度学习】使用labelImg标注图像

热门文章

  1. Linux 命令解压缩
  2. 登录用户名和密码相同问题
  3. 封装html ui 控件,聊聊前端 UI 组件:组件设计
  4. java值传递string_关于java:按值传递(StringBuilder与String)
  5. Spring bean 不被 GC 的真正原因
  6. c primer英文版第5版_2019足坛10大巨星:梅西第2范戴克第3,C罗第5
  7. Spring Cloud Alibaba —— Sentinel 入门
  8. Maven配置_01
  9. 个人对于MySQL的理解_MySQL锁的理解
  10. firefox使用掘金插件_Mozilla发布新的附加组件来修复旧版Firefox中的扩展禁用问题...