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)
降维
使用sum
或mean
, 从特定的维度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 中.
文件读写
推荐使用save
和load
方法. 因为其支持多语言, 兼容分布式.
d = 'a':a, 'b':b
mx.nd.save("temp.ndarray", d)
c = mx.nd.load("temp.ndarray")
以上是关于NDArray Tutorial - mxnet的主要内容,如果未能解决你的问题,请参考以下文章