MXNet学习笔记——0 MXNet概念、数据、模型初建

写在前面

本系列博客记录了作者上手MXNet的全过程。作者在接触MXNet之前主要使用keras,和一点tensorflow,因此在上手MXNet之前有一点deep learning的项目基础。主要参考资料为MXNet官方教程,也阅读了一些有价值的博客。

博客结构为:先列出作者对于该阶段的期望目标,以及各目标完成过程中的笔记(仅记下个人认为重要的),再附上学习过程中自己的提问(solved & unsolved,天马行空的提问,欢迎讨论)。


本阶段目标

任务预计花时间完成状态遇到问题补充
了解MXNet的框架理念与特点1.5hour\checkmark https://mxnet-bing.readthedocs.io/en/latest/zh/overview.html#id8
了解MXNet中数据处理格式1.5hour\checkmark https://beta.mxnet.io/guide/crash-course/1-ndarray.html
搭建简单模型5hour\checkmark https://beta.mxnet.io/guide/crash-course/2-nn.html
通过与keras等平台对比,快速加深对MXNet的印象 \checkmark 待补充

具体笔记

task1 MXNet的特点

  • 命令式编程声明式编程的结合

命令式编程(imperative programming),嵌入较浅,其中每个语句都按原来的意思执行,例如numpy和Torch

声明式语言(declarative programming),嵌入较深,既用户只需要声明要做什么,而具体执行则由系统完成。这类系统包括Caffe,theano和刚公布的TensorFlow

MXNet结合了"Symbol:声明式的符号表达式"和"NDArray:命令式的张量计算"

  • MXNet中几个库的使用
名称用途
Symbol生成计算图,符号编程
Gluon 
Module模型类,可用于训练和测试模型
  
  
  

 

task2 NDArray数据

官方教程

参考博客(介绍更多函数)

首先需要 from mxnet import nd,mxnet.ndarray与numpy.ndarray相似。

1. 初始化:

from mxnet import nd

a = nd.array([1,2,3]) 
b = nd.ones((2,3)) 
c = nd.full((2,3),7) #填充
d = nd.arange(4).reshape((2,2))

2. 运算:

from mxnet import nd

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

c = a*b #对应位置乘法
d = nd.dot(a,b) #矩阵相乘
e = nd.maximum(a, c)  #求对应位置最大

3. 形状改变

from mxnet import nd

np.concat
a.reshape

a = mx.nd.array(np.arange(6).reshape(6,1))
b = a.broadcast_to((6,4))  #复制广播
b.asnumpy()

4. 深拷贝和浅拷贝

b = a.copy() # 深
b = a # 浅。这时修改b也会动a

5. 指定变量在CPU还是GPU上计算

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

a = mx.nd.ones((100,100), mx.cpu())
b = mx.nd.ones((100,100), gpu_device)

 6. 读写数据

  • pickle
import pickle as pkl
import mxnet as mx
a = mx.nd.ones((2, 3))

# pack and then dump into disk
data = pkl.dumps(a)  #dumps返回一个序列化的bytes对象,不到文件中去
pkl.dump(data, open('tmp.pickle', 'wb'))  #dump到文件

# load from disk and then unpack
data = pkl.load(open('tmp.pickle', 'rb')) #读取出的data是二进制格式数据
b = pkl.loads(data) #将b从二进制读取为正常格式
b.asnumpy()
  • save & load (这种方法更好)

通过nd.save和nd.load,写或读二进制文件,数据可以和其他语言通用

import mxnet as mx

a = mx.nd.ones((2,3))
b = mx.nd.ones((5,6))
mx.nd.save("temp.ndarray", [a,b])
c = mx.nd.load("temp.ndarray")

task3 搭建模型

1. 生成单层

layer = nn.Dense(2)

2. 生成网络

\Checkmark

3. 使用类来搭建block(推荐)

将层结构和forward函数分开,可以构建例如dense block\ res block\ vgg block,块堆叠网络使用这种结构很方便.

以VGG网络为例:

import d2lzh as d2l
from mxnet import gluon, init, nd
from mxnet.gluon import nn

def vgg_block(num_convs, num_channels):
    blk = nn.Sequential()
    for _ in range(num_convs):
        blk.add(nn.Conv2D(num_channels, kernel_size=3,
                          padding=1, activation='relu'))
    blk.add(nn.MaxPool2D(pool_size=2, strides=2))
    return blk

conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))

def vgg(conv_arch):
    net = nn.Sequential()
    # 卷积层部分
    for (num_convs, num_channels) in conv_arch:
        net.add(vgg_block(num_convs, num_channels))
    # 全连接层部分
    net.add(nn.Dense(4096, activation='relu'), nn.Dropout(0.5),
            nn.Dense(4096, activation='relu'), nn.Dropout(0.5),
            nn.Dense(10))
    return net

net = vgg(conv_arch)

task4 和keras对比

问题kerasMXNet补充
模型结构列表打印

\checkmark

model.summary()

print(net) 
直接获取网络中间层weight值\times

\checkmark

layer.weight.data()

net.blk[1].weight.data()

 
画模型结构图plot_model  
为数据指定是GPU还是CPU

\times

\checkmark

a = mx.nd.ones((100,100), mx.cpu())

a = mx.nd.ones((100,100), mx.gpu())

 
    
    

学习过程问题记录

AboutQuestionAnswer
torchtorch和pytorch的区别? 
和keras对比有没有类似于keras中net.summary()的函数? 
python

super(MixMLP, self).__init__(**kwargs)

super函数?

 
python中类的多继承?一个类同时继承多个类的特征
pickleload和loads的区别、dump和dumps的区别 
编程方式命令式编程和声明式的区别? 
Symbol声明式和NDArray命令式?

SymbolNDArray均为多维数组提供了类似于c = a + b这样的计算符

NDArray提供了命令式编程的接口,其中的计算是逐句评估的。

Symbol更加接近声明式编程,使用时我们需要提前声明计算,然后才使用数据评估。这类例子包括正则表达式和SQL语句。

 

NDArray的优点:

  • 直截了当的
  • 更易于使用自然语言特性(循环和判别结构等)以及第三方库(numpy等)
  • 利于一步步进行代码debug

Symbol的优点:

  • 提供了NDArray中几乎所有的函数,例如+*sinreshape
  • 利于保存加载和可视化
  • 利于后端进行计算和内存的优化
MXNetSymbol 和 Gluon的区别? 
“Symbol API类似于caffe中的网络配置或者Theano中的符号编程。”怎么理解? 
官方的crash course教程里,讲模型搭建的这一节,第三种方法为什么更灵活?为什么要设置一个blk然后获取中间层?不能直接net[4].weight.data()这样获取中间层的weight吗?

教程中更灵活的意思是在这个类里面,结构和forward函数分开,这样在resnet这种有重复性结构的网络中,容易获取中间层的输出?

(再想想)

gluon和mxnet的关系?不用gluon的话mxnet能使用吗? 
 Apache MXNe什么意思?加不加前缀的区别? 
   
   

本阶段感想

刚入门MXNet,应该先有一个清晰框架,逐步了解遮盖东西的原理、具体实施以及别的库的用法。刚看到官方教程的时候脑子有点晕,Symbol\Gluon到底是什么概念,目前还不清楚。需要结合不同资料自己来提取信息并理解。整理ing

参考资料

  1. dive into deep learning,基于Apache MXNet对深度学习算法进行实现,内容详实,代码实现;中文版《动手学深度学习》
  2. MXNet官方教程中文翻译版本
  3. github资料,教程、模型以及预训练weight

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值