天天看点

python中mxnet_mxnet Python 笔记

1、查看mxnet的版本

import mxnet as mx

mx.__version__

2、扩展nd的维度

image_data = mx.random.normal(shape = (3, 112, 112))

image_data.expand_dims(axis = 0)

3、装载网络结构

import mxnet as mx

train_net = mx.gluon.model_zoo.get_model("ResNet34_V1",pretrianed = False)

4、修改预装载的网络结构

from mxnet.gluon import nn

train_net = ....(参考3)

conv_0 = nn.Conv2d(channels = 64, kernel_size = (3, 3), strides =(1,1), padding = (1, 1), use_bais = False)

conv_0.collect_params().initialize(mx.init.Xavier())

train_net.features.register_child(conv_0, "0")

train_net.features.hybridize()

5、画出网络结构

x =mx.sym.var('data')

mx.viz.plot_network(train_net(x), shape = {'data':(1, 3, 112, 112)} ).view()

6、上下文

num_gpus = 0

ctx = [mx.gpu(i) for i in range(num_gpus) ] if num_gpus > 0 else [mx.cpu(0)]

train_net = mx.gluon.model_zoo.get_model("ResNet34_V1",pretrianed = False,ctx = ctx)

conv_0.collect_params().initialize(mx.init.Xavier(),ctx = ctx)

train_net.collect_params().initialize(mx.init.Xavier(), ctx = ctx )

7、读图片文件,并展示

image = mx.image.imread(filename)

plt.imshow(image.asnumpy())

8、获取GPU个数

num_gpus = mx.context.num_gpus()

9、获取模型,并初始化

finetune_net = resnet50_v2(pretrained=True, ctx=ctx)

# change last softmax layer since number of classes are different

with finetune_net.name_scope():

finetune_net.output = nn.Dense(classes)

finetune_net.output.initialize(init.Xavier(), ctx=ctx)

# hybridize for better performance

finetune_net.hybridize()

10 主要的类图关系如下图

python中mxnet_mxnet Python 笔记

11、官方例子

12、例子

python中mxnet_mxnet Python 笔记

13、读数据

image_channels = 3

image_height = 112

image_width = 96

path_root=r'E:\samplebase'

path_imglist=r'E:\samplebase\1_10000_1.lst'

train_dataiter = mx.image.ImageIter(batch_size= batch_size,

data_shape= (image_channels, image_height, image_width),

path_root = path_root,

path_imglist = path_imglist,

shuffle = True,

rand_mirror = True,

#rand_resize = True,

#resize = 96,

rand_crop = True,

# brightness = 0.1,

# contrast = 0.1,

# saturation = 0.1,

pca_noise = 0.1)

train_dataiter.reset()

image_batch = train_dataiter.next()

for i in range(batch_size):

plt.subplot(1, 4, i + 1)

plt.imshow(image_batch.data[0][i].asnumpy().astype('uint8').transpose((1,2,0)))

plt.show()

14 训练最后一层(FC7)

python中mxnet_mxnet Python 笔记

15 多迭代器

python中mxnet_mxnet Python 笔记
python中mxnet_mxnet Python 笔记

https://github.com/khetan2/MBEM/blob/master/resnet.py#L131​github.com

python中mxnet_mxnet Python 笔记

16 预测

python中mxnet_mxnet Python 笔记

17 图片左右翻转

python中mxnet_mxnet Python 笔记

18 读取文件夹下的jpg文件

python中mxnet_mxnet Python 笔记

19 定义人脸关键点可视化函数

python中mxnet_mxnet Python 笔记

for _, w in b_net.collect_params().items():

w.grad_req = 'null'

21 mxnet支持累积gradient的。

由于batch_size太小了,所以想实现caffe中iter_size这样一个功能,就是处理iter_size * batch_size个样本以后在更新网络参数。由于对loss.backward()和trainer.step这两个函数的底层是如何实现的不太清楚,所以想请教一下

python中mxnet_mxnet Python 笔记

22 迁移学习

迁移学习有两种,微调(fine-tuning)和冻结(freezing)。

前者会对预训练层也进行权重更新,这时候需要设置两个学习率,较小的用于对预训练层进行更新,较大的用于对分类层进行更新;

后者保持预训练层的权重不变,只训练分类层。通常在自己的数据集不大的时候,用 freezing,如果自己的数据集足够大且自己的数据集与预训练数据集有较大差异时,用 fine-tuning。

通常 fine-tuning 的效果优于freezing,不过 freezing 可以快速得到一个不错的结果,主要适合小数据集且数据集差异不大的情况。

在建立模型的时候,注意看 API 里的参数,比如 pretrained=True 这样的。

model.collect_params()['conv1_weight'].set_data(mx.nd.array([...]))

我有4个识别任务,现在希望用一个带有多个输出的网络实现。类似于multi-task,区别是我希望每次只训练一个任务,也就是说一个输入对应一个输出。共享层会被4个不同的任务更新,输出层的参数则只被对应的单一任务更新。

可以,你把4个loss加起来,一起训练就行了。你可以用4个独立的输出层。四个loss一起backward

autograd.backward([loss1, loss2, …])

python中mxnet_mxnet Python 笔记
python中mxnet_mxnet Python 笔记

和直接加是等价的

26: >>> nd_iter = mx.io.NDArrayIter(data={'data':mx.nd.ones((100,10))},

... label={'softmax_label':mx.nd.ones((100,))},

... batch_size=25)

27:

python中mxnet_mxnet Python 笔记

28 例子:

python中mxnet_mxnet Python 笔记

29:convert Pytorch pretrain model to MXNET symbol modelPyTorch to ONNX to MXNet Tutorial​docs.aws.amazon.com

30 安装mxnet

pip install mxnet-cu90mkl --pre --upgrade

pip install gluoncv --pre --upgrade