mxnet深度学习(NDArray)

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里面和我们线性代数里面学的不一样)

>>> 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.]]

如果两个NDArray在不同的设备上,我们需要显示的把他们移到同一个设备上。

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

>>> 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.]]

加载和保存

下面有两个方式去保存(加载)数据从磁盘上。第一个方式是pickle,NDArray是pickle compatible,意味着你可以简单的把NDArray进行pickle,就像在numpy.ndarray里面一样。

>>> 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.]]

第二个方式是直接把一列NDArray以二进制的格式存到磁盘中(这时就不用pickle了)

>>> 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.]]

我们还可以存一个字典(dict)

>>> 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.]]

另外,如果设置了分布式系统比如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必须顺序执行。

a = mx.nd.ones((2,3))
b = a
c = a.copyto(mx.cpu())
a += 1
b *= 3
c *= 3

幸运的是,MXNet在确保运行正确的情况下,可以自动解决依赖问题。换句话说,我们可以写程序就像一个单一的线程,MXNet将会自动派遣它们到多个设备,如具有多个GPU的显卡,和多台机器上。


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


实际的计算是当我们想把结果拷贝到其它地方的时候完成的,比如print a.asnumpy() (复制到终端)或者mx.nd.save([a])。因此,如果我们想去写高效的并行的代码,我们只需要延缓请求结果的时间。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV 例程300篇】02. 图像的保存(cv2.imwrite)

专栏地址&#xff1a;『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取&#xff08;cv2.imread&#xff09; 02. 图像的保存&#xff08;cv2.imwrite&#xff09; 03. 图像的显示&#xff08;cv2.imshow&#xff09; 04. 用 matplotlib 显示图像&#xff08;plt.imsho…

mxnet深度学习(Symbol)

mxnet深度学习(Symbol) 自动标志化区分 NDArray是一个基础的计算单元在MXNet里面的。除此之外&#xff0c;MXNet提供一个标志化的接口&#xff0c;叫做Symbol&#xff0c;为了简化构造神经网络。标志化结合了灵活性和效率。一方面&#xff0c;它是和Caffe里面的神经网络构造是…

【OpenCV 例程300篇】03. 图像的显示(cv2.imshow)

专栏地址&#xff1a;『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取&#xff08;cv2.imread&#xff09; 02. 图像的保存&#xff08;cv2.imwrite&#xff09; 03. 图像的显示&#xff08;cv2.imshow&#xff09; 04. 用 matplotlib 显示图像&#xff08;plt.imsho…

【OpenCV 例程300篇】04. 用 matplotlib 显示图像(plt.imshow)

专栏地址&#xff1a;『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取&#xff08;cv2.imread&#xff09; 02. 图像的保存&#xff08;cv2.imwrite&#xff09; 03. 图像的显示&#xff08;cv2.imshow&#xff09; 04. 用 matplotlib 显示图像&#xff08;plt.imsho…

mxnet深度学习(KVS)

mxnet深度学习(KVS) 分布式的键值对的存储(Ditstributed Key-value Store) KVStore是一个数据共享的地方。我们可以把它认为他是一个简单的类横跨不同的设备(GPUS和不同的机器)&#xff0c;在这里设备将会压入和提取数据。初始化 让我们考虑一个简单的例子:初始化一个(int,NDAa…

【OpenCV 例程300篇】05. 图像的属性(np.shape)

专栏地址&#xff1a;『youcans 的 OpenCV 例程 300 篇』 【OpenCV 例程300篇】05. 图像的属性&#xff08;np.shape&#xff09; OpenCV 中图像对象的数据结构是 ndarray 多维数组&#xff0c;因此 ndarray 数组的属性和操作方法也都适用于 OpenCV 的图像对象。 img.ndim&…

mxnet安装(Jetson)

mxnet安装 mxnet是一个跨平台的深度学习框架&#xff0c;今天我们将在板子(Jetson Tk1或Jetson Tx1或者Tegra K1)上安装mxnet,并用到cuda加速。1.第一步&#xff0c;我们先安装依赖 sudo apt-get update sudo apt-get install -y build-essential git libatlas-base-dev libope…

【OpenCV 例程300篇】06. 像素的编辑(img.itemset)

文章目录&#xff1a;『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程300篇】06. 像素的编辑&#xff08;img.itemset&#xff09; 像素是构成数字图像的基本单位&#xff0c;像素处理是图像处理的基本操作。 对像素的访问、修改&#xff0c;可以使用 Numpy 方法直接…

图片里的标志化的构造和执行

图片里的标志化的构造和执行 这是一篇解释在图片里面的进行标志化构造和执行的文章。你最好和这篇文章一起阅读 Symbolic API..标志构成 标志是我们想做的计算的描述。标志构造API生成计算图源来描述计算的需要。下面的图片显示了怎样我们组成标志来描述基本的计算。 mxnet.sy…

【OpenCV 例程300篇】07. 图像的创建(np.zeros)

专栏地址&#xff1a;『youcans 的 OpenCV 例程 300 篇』 【OpenCV 例程300篇】07. 图像的创建&#xff08;np.zeros&#xff09; OpenCV 中图像对象的数据结构是 ndarray 多维数组&#xff0c;因此可以用 Numpy 创建多维数组来生成图像。特别对于空白、黑色、白色、随机等特殊…

mxnet创建新的操作(层)

mxnet创建新的操作(层) 这篇blog将会告诉你如何创建新的MXNet操作(层)。 我们竭尽所能提供最好的操作对于绝大多数的使用场景。然而&#xff0c;如果你发现自己需要自定义层&#xff0c;你有3个选择: 1.使用原生的语言和它的矩阵库(numpy in Python)。这不需要过多的能力和对…

【OpenCV 例程300篇】08. 图像的复制(np.copy)

专栏地址&#xff1a;『youcans 的 OpenCV 例程 300 篇』 【OpenCV 例程300篇】08. 图像的复制&#xff08;np.copy&#xff09; 使用 Numpy 的 np.copy() 函数可以进行图像的复制&#xff0c;不能通过直接赋值进行图像的复制。 函数说明&#xff1a; arr numpy.copy(img) # …

机器学习里面常用知识

每次手推公式就会遇见各种不会的&#xff0c;在网上搜了个总结的还不错的常用求导公式。。。继续更新中…… 一、基本线性代数 以下部分原文地址&#xff1a;http://blog.163.com/live_freely/blog/static/151142060201023154057339/ 在网上看到有人贴了如下求导公式&#xff1…

【OpenCV 例程300篇】09. 图像的裁剪(cv2.selectROI)

专栏地址&#xff1a;『youcans 的 OpenCV 例程 300 篇』 【OpenCV 例程300篇】09. 图像的裁剪&#xff08;cv2.selectROI&#xff09; 用 Numpy 的切片方法可以进行图像的裁剪&#xff0c;操作简单方便。 方法说明&#xff1a; retval img[y:yh, x:xw].copy() 对图像 img 裁…

【OpenCV 例程300篇】10. 图像的拼接(np.hstack)

3文章目录&#xff1a;『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程300篇】10. 图像的拼接&#xff08;np.hstack&#xff09; 用 Numpy 的数组堆叠方法可以进行图像的拼接&#xff0c;操作简单方便。 方法说明&#xff1a; retval numpy.hstack((img1, img2, ……

win下python和opencv安装

最简单粗暴的安装教程 1.先去下载3个文件pycharm(IDE),anaconda(集成库),opencv的whl文件 http://yun.baidu.com/share/link?shareid1022325066&uk1275716166 里面还有别的学习教程&#xff0c;包括opencv&#xff0c;numpy&#xff0c;matplotlib等。 2.把pycharm和an…

【OpenCV 例程300篇】11. 图像通道的拆分(cv2.split)

文章目录&#xff1a;『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程300篇】11. 图像通道的拆分&#xff08;cv2.split&#xff09; 函数 cv2.split() 将 3 通道 BGR 彩色图像分离为 B、G、R 单通道图像。 函数说明&#xff1a; cv2.split(img[, mv]) -> retval …

机器学习矩阵求导

矩阵求导好像读书的时候都没学过&#xff0c;因为讲矩阵的课程上不讲求导&#xff0c;讲求导的课又不提矩阵。如果从事机器学习方面的工作&#xff0c;那就一定会遇到矩阵求导的东西。维基百科上&#xff1a;http://en.wikipedia.org/wiki/Matrix_calculus &#xff0c; 根据Y与…

【OpenCV 例程300篇】12. 图像通道的合并(cv2.merge)

文章目录&#xff1a;『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程300篇】12. 图像通道的合并&#xff08;cv2.merge&#xff09; 函数 cv2.merge() 将 B、G、R 单通道合并为 3 通道 BGR 彩色图像。 函数说明&#xff1a; cv2.merge(mv[, dst]) -> retval # BG…

机器学习向量化练习

机器学习向量化练习 在先前的练习里面&#xff0c;我们已经通过对自然图像完成了一个稀疏自编码的练习。在这次我们将通过向量化来使我们运行速度更快&#xff0c;并且我们将把它应用到手写数字里面。 数据下载 MNIST Dataset (Training Images)MNIST Dataset (Training Labe…