NDArray Tutorial - mxnet

Posted tealex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NDArray Tutorial - mxnet相关的知识,希望对你有一定的参考价值。

根据 mxnet documentation-NDArray
NDArray 是 mxnet 用于计算的数据结构. 可类比于 tensorflow 的 tensor,caffe 的 blob.
看到 mxnet 中的 NDArray 使用与 numpy 差别不大, 操作都很简明.
这个网页都是基础操作, 我记录了其中较关键的部分.

创建 NDArray

NDArray 既可直接创建, 也可以从 numpy 的 ndarray 转换得到.

a = mx.nd.array([1,2,3])

c = np.arange(15).reshape(3,5)
# create a 2-dimensional array from a numpy.ndarray object
a = mx.nd.array(c)

制定数据类型

默认是 float32, 如需改变可通过 dtype 设置.

# float32 is used in default
a = mx.nd.array([1,2,3])
# create an int32 array
b = mx.nd.array([1,2,3], dtype=np.int32)
# create a 16-bit float array
c = mx.nd.array([1.2, 2.3], dtype=np.float16)

填充函数

# create a 2-dimensional array full of zeros with shape (2,3)
a = mx.nd.zeros((2,3))
# create a same shape array full of ones
b = mx.nd.ones((2,3))
# 全是7
c = mx.nd.full((2,3), 7)
# 随机值
d = mx.nd.empty((2,3))

打印

使用asnumpy来打印 NDArray

b = mx.nd.arange(18).reshape((3,2,3))
b.asnumpy()

基本操作

与 numpy 一样, * 代表矩阵对应元素相乘 (点乘),dot表示矩阵相乘.

a = mx.nd.arange(4).reshape((2,2))
b = a * a
c = mx.nd.dot(a,a)

切片

切片操作默认在 axis=0, 即上. 也可通过slice_axis来确定在哪个维度切片.

#按行切, 设置序号为1的行内数据为1
a = mx.nd.array(np.arange(6).reshape(3,2))
a[1:2] = 1
a[:].asnumpy()
#按列切, 取出序号为1的列(从0开始
d = mx.nd.slice_axis(a, axis=1, begin=1, end=2)
d.asnumpy()

形状

除了 axis=1 上可以不同, 被concat的矩阵其他维度都要相同.
如 a.shape:(1L,2L,3L,4L),b.shape:(1L,10L,3L,4L)
那么 c = mx.nd.concat(a,b)
c.shape:(1L, 12L, 3L, 4L)

降维

使用summean, 从特定的维度sum_axis

a = mx.nd.ones((2,3))
b = mx.nd.sum(a)
c = mx.nd.sum_axis(a, axis=1)

广播

使用broadcast_to方法.
在使用 + 或 *, 两个矩阵维度不同的时候, 会自动广播.

a = mx.nd.array(np.arange(6).reshape(6,1))
b = a.broadcast_to((6,4))
#多维度广播
c = a.reshape((2,1,1,3))
d = c.broadcast_to((2,2,2,3))
#自动广播
a = mx.nd.ones((3,2))
b = mx.nd.ones((1,2))
c = a + b

复制

a = mx.nd.ones((2,2))
b = a
b is a # will be True

b = a.copy()
b is a  # will be False

GPU 支持

NDArray 设备信息存放在 ndarray.context 中.

gpu_device=mx.gpu() # Change this to mx.cpu() in absence of GPUs.

def f():
    a = mx.nd.ones((100,100))
    b = mx.nd.ones((100,100))
    c = a + b
    print(c)
# in default mx.cpu() is used
f()
# change the default context to the first GPU
with mx.Context(gpu_device):
    f()

mxnet 计算的所需的数据结构需存在相同的设备中. 可使用copyto方法, 将 cpu 数据转存到 gpu 中.

文件读写

推荐使用saveload方法. 因为其支持多语言, 兼容分布式.

d = 'a':a, 'b':b
mx.nd.save("temp.ndarray", d)
c = mx.nd.load("temp.ndarray")

以上是关于NDArray Tutorial - mxnet的主要内容,如果未能解决你的问题,请参考以下文章

mxnet:基础知识和一个简单的示例

MXNet官方教程3Symbol -神经网络图和自动区分

动手学深度学习第一课:从上手到多类分类-NDArray

MXNet和pytorch哪个比较好用?

动手学深度学习

动手学深度学习