MXnet
参考
通过 MXNet / Gluon 来动手学习深度学习 在线
github
代码
深度学习库 MXNet 由 dmlc/cxxnet, dmlc/minerva 和 Purine2 的作者发起,
融合了Minerva 的动态执行,cxxnet 的静态优化和 Purine2 的符号计算等思想,直接支持基于Python 的 parameter server 接口,使得代码可以很快向分布式进行迁移。
每个模块都进行清晰设计,使得每一部分本身都具有被直接利用的价值。
C 接口和静态/动态 Library 使得对于新语言的扩展更加容易,目前支持C++和python 2/3 ,接下来相信会有更多语言支持,并方便其他工具增加深度学习功能。
MXNet是一个开源的深度学习框架,由亚马逊公司发起并维护。它支持多种编程语言,包括Python、C++、R、Scala等,可以在CPU、GPU和分布式环境下运行。MXNet提供了丰富的神经网络层和优化算法,可以用于各种深度学习任务,如图像分类、目标检测、语音识别等。
MXNet的基本概念包括Symbol和NDArray。Symbol表示数学运算,是MXNet的基本构建块,可以用来表示变量、运算、函数等。NDArray则是MXNet中的多维数组,类似于NumPy数组。
MXNet具有以下特点和优势:
-
灵活编程模型:支持命令式和符号式编程模型,以最大化效率和性能。
-
可移植性:从云端到客户端都可运行,包括多CPU、多GPU、集群、服务器、工作站甚至移动智能手机。
-
多语言支持:支持七种主流编程语言,是唯一支持所有R函数的构架。
-
本地分布式训练:支持在多CPU/GPU设备上的分布式训练,可充分利用云计算的规模优势。
-
性能优化:使用一个优化的C++后端引擎并行I/O和计算,无论使用哪种语言都能达到最佳性能。
MXNet可以应用于各种机器学习和深度学习的任务和领域,包括自然语言处理、计算机视觉、推荐系统和强化学习等。在自然语言处理领域,MXNet可以构建和训练用于文本分类、情感分析、命名实体识别、机器翻译等任务的深度学习模型。在计算机视觉领域,MXNet提供了许多用于处理图像数据的函数和工具,并支持常用的图像数据集,如ImageNet,可用于图像分类、目标检测、语义分割和人脸识别等任务。
安装 Ubuntu/Debian上构建
安装依赖:sudo apt-get updatesudo apt-get install -y build-essential git libatlas-base-dev libopencv-dev构建MXnet:git clone --recursive https://github.com/dmlc/mxnetcd mxnet;make -j 安装python 接口进入源码目录编译好的python子目录安装python语言包即可cd ./python/sudo python setup.py install
MXnet基本概念和操作
NDArray
多维的数据结构,提供在 cpu 或者 gpu 上进行矩阵运算和张量计算,
能够自动并行计算
NDArray 是 MXnet 中最底层的计算单元,与 numpy.ndarray 非常相似,
但是也有 2 点不同的特性:
1)支持多设备
所有的操作可以在不同的设备上运行,包括 cpu 和 gpu。
>>> import mxnet as mx
在cpu0上创建一个2X3的矩阵
>>> a = mx.nd.empty((2, 3))
在gpu上创建一个2X3的矩阵
>>> b = mx.nd.empty((2, 3), mx.gpu()) # 在gpu0上创建一个2X3的矩阵
>>> c = mx.nd.empty((2, 3), mx.gpu(2)) # 在gpu2上创建一个2X3的矩阵
>>> c.shape # 维度(2L, 3L)
>>> c.context # 设备信息gpu(2)
其他的初始化方式
>>> a = mx.nd.zeros((2, 3)) # 创建2X3的全0矩阵
>>> b = mx.nd.ones((2, 3)) # 创建2X3的全1矩阵
>>> b[:] = 2 # 所有元素赋值为2>>> b = mx.nd.zeros((2, 3), mx.gpu())
>>> a = mx.nd.ones((2, 3)) # 创建2X3的全1矩阵
不同的设备之间进行数据拷贝
>>> a.copyto(b) # 从cpu拷贝数据到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.]]
numpy.ndarray转换为NDArray
>>> 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]]
NDArray基本运算
>>> 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.]]