【Mxnet 】入门篇(一)

mxnet 新提出的 Gluon 框架是一个 动态图框架:

动态图: define by run 代表就是 Tensorflow,我们首先定义好计算图,然后 feed 数据进行训练网络参数。
静态图: define and run 代表就是 chainer, pytorch 和 Gluon 了,在运行的时候定义图。在每个 batch 进行训练的时候都会重新定义一次计算图。

1. 安装
pip install  mxnet-cu100 # CUDA 10.0
2. 数据
  • 样本数据(输入 和 label)
  • 网络模型参数
  • 网络中每层的输入 数据
    在 mxnet/Gluon 中,这三种类别的数据都是由 mx.nd.NDArray 来存储的。
3. 自动求梯度

mxnet 对于 NDArray 也提供了自动求导机制, 通过 mxnet.autograd 来支持

from mxnet import nd
from mxnet import autograd

# nd.NDArray
val = nd.ones(shape=(3, 5))

w1 = nd.ones(shape=(5, 1))
b1 = nd.ones(shape=(1,))

w1.attach_grad() # 对模型参数进行 attach_grad()
b1.attach_grad() # 同上

with autograd.record(): # 使用 autograd 来记录计算图
    res = nd.dot(val, w1)
    res2 = res + b1
res2.backward() # 这里需要注意的是,如果 res2 不是标量的话,默认的操作是会对 res2 做一个 sum,然后再 backward

print(w1.grad)
print(b1.grad)
[[ 3.]
 [ 3.]
 [ 3.]
 [ 3.]
 [ 3.]]
<NDArray 5x1 @cpu(0)>

[ 3.]
<NDArray 1 @cpu(0)>

4. 神经网络

深度学习搭建神经网络大概有以下几个步骤:

  • 搭建网络结构
  • 初始化模型参数
  • 训练模型参数
    • batch 数据输入到网络中
    • 计算 loss
    • 反向传导得到 模型参数的梯度信息
    • 更新参数
from mxnet import nd
from mxnet.gluon import nn
from mxnet.gluon import loss
from mxnet import gluon

class Net(nn.Block):
    def __init__(self, **kwargs):
        super(Net, self).__init__(**kwargs)

        self.dense0 = nn.Dense(256) # 我们只需要对 层的输出维度 作说明,不需要考虑输入的维度
        self.dense1 = nn.Dense(1)   # Gluon 会帮助我们 推断出 输入的 维度

    def forward(self, x):
        return self.dense1(nd.relu(self.dense0(x)))

net = Net()
net.initialize() # 要先 initialize, 再创建 trainer
trainer = gluon.Trainer(net.collect_params(), 'sgd',
                        {'learning_rate': 0.001}) # 优化方法
val = nd.ones(shape=(10, 100))
label = nd.ones(shape=(10,))

criterion = loss.L2Loss() # 创建一个 l2 loss

with autograd.record(): # 需要反向传导的地方记得 record 一下
    res = net(val)
    print(res)
    loss = criterion(res, label)

loss.backward() # 计算梯度

trainer.step(batch_size=10)  # 更新模型参数

print(net(val))
print(loss)

[[-0.18936485]
 [-0.18936485]
 [-0.18936485]
 [-0.18936485]
 [-0.18936485]
 [-0.18936485]
 [-0.18936485]
 [-0.18936485]
 [-0.18936485]
 [-0.18936485]]
<NDArray 10x1 @cpu(0)>

[[-0.14251584]
 [-0.14251584]
 [-0.14251584]
 [-0.14251584]
 [-0.14251584]
 [-0.14251584]
 [-0.14251584]
 [-0.14251584]
 [-0.14251584]
 [-0.14251584]]
<NDArray 10x1 @cpu(0)>

[ 0.70729446  0.70729446  0.70729446  0.70729446  0.70729446  0.70729446
  0.70729446  0.70729446  0.70729446  0.70729446]
<NDArray 10 @cpu(0)>

各关键的 Gluon 组件一一展现了出来,包括:

  • gluon.nn.Block 容器一样的概念,用来构建神经网络
  • gluon.loss 各种 loss 的聚集地
  • gluon.nn 有很多 层的 实现
  • gluon.data 数据集单元
  • gluon.utils 各种实用程序
  • gluon.Trainer 用来辅助更新模型参数的一个辅助类
  • gluon.Parameter 参数设置和获取的模块
  • mxnet.optimizer 里面有很多优化器
  • mxnet.nd 对于 NDArray 的 op 级别操作在这里
5. 小方法(未完待续…)
  • NDArray 与 numpy.ndarray 互相转换
import numpy as np
from mxnet import nd

# numpy.ndarray --> mx.NDArray
val = np.array([1, 2, 3])
nd_val = nd.array(val) # 深复制

# NDArray --> numpy.ndarray
val_ = nd_val.asnumpy()
  • 使用 ctx 来为创建的 NDArray 指定设备 (CPU or GPU)
import mxnet as mx
val = nd.zeros(shape=(3,),ctx=mx.gpu())
  • 将数据copy到ctx
data = data.copyto(ctx)
label = data.copyto(ctx)
  • 该函数适合于多GPU训练,将数据分割并载入不同GPU
data_list = gluon.data.utils.split_and_load(data, devices)
label_list = gluon.data.utils.split_and_load(label, devices)
  • NDarray 操作
    • 加减乘除对应元素加减乘除
    • X.exp() 以e为底的幂
    • nd.dot(X, Y.T) 矩阵点乘
    • nd.concat(X, Y, dim=0)多个NDArray在不同的维度上(0表示列,1表示行)进行连接
    • X.sum()所有元素求和
    • X.norm().asscalar() 通过asscalar函数将结果变换为Python中的标量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值