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 主要的类图关系如下图
11、官方例子
12、例子
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)
15 多迭代器
https://github.com/khetan2/MBEM/blob/master/resnet.py#L131github.com
16 预测
17 图片左右翻转
18 读取文件夹下的jpg文件
19 定义人脸关键点可视化函数
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这两个函数的底层是如何实现的不太清楚,所以想请教一下
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, …])
和直接加是等价的
26: >>> nd_iter = mx.io.NDArrayIter(data={'data':mx.nd.ones((100,10))},
... label={'softmax_label':mx.nd.ones((100,))},
... batch_size=25)
27:
28 例子:
29:convert Pytorch pretrain model to MXNET symbol modelPyTorch to ONNX to MXNet Tutorialdocs.aws.amazon.com
30 安装mxnet
pip install mxnet-cu90mkl --pre --upgrade
pip install gluoncv --pre --upgrade