MXNet 核心接口

简介: 介绍一些 MXNet 常用的 API
from mxnet import cpu, gpu, nd

Context

Context 是模型的数据放置的环境:

a = nd.array([2, 4], ctx=cpu())
a1 = nd.array([3, 7], ctx=gpu(0))
a.context, a1.context
(cpu(0), gpu(0))

当然,也可以在 CPU 与 GPU 之间进行复制。

a2 = a.copyto(a1)   # 要求 a 与 a1 有相同的 shape
a1 is a2, a2.context
(True, gpu(0))
a1  # a1 被修改了

[2. 4.]
<NDArray 2 @gpu(0)>

为了进行深度复制,需要使用:

a3 = nd.array([3, 9])
a4 = a3.as_in_context(gpu(0))
a3 is a4, a3.context, a4.context
(False, cpu(0), gpu(0))

Symbol

  • Symbol 的基本函数 - 定义计算图
  • Symbol.infer_type: 推导当前 Symbol 所依赖的所有 Symbol 数据类型
  • Symbol.infer_shape: 推导当前 Symbol 所依赖的所有 Symbol 的形状
  • Symbol.list_argments: 列出当前 Symbol 所用到的基本参数名称
  • Symbo.list_outputs: 列出当前 Symbol 的输出名称
  • Symbol.list_auxiliary_states: 列出当前 Symbol 的辅助参量名称
from mxnet import sym, symbol
X = sym.Variable('X')
out = sym.FullyConnected(data=X, name='fc1', num_hidden=1000)
out = symbol.BatchNorm(out, name='batchnorm')
out = sym.Activation(data=out, act_type='relu')
out = sym.FullyConnected(data=out, name='fc2', num_hidden=10)
arg_types, out_types, aux_types = out.infer_type(X='float32')
arg_types, out_types, aux_types
([numpy.float32,
  numpy.float32,
  numpy.float32,
  numpy.float32,
  numpy.float32,
  numpy.float32,
  numpy.float32],
 [numpy.float32],
 [numpy.float32, numpy.float32])
arg_shapes, out_shapes, aux_shapes = out.infer_shape(X=(100,784))
arg_shapes, out_shapes, aux_shapes
([(100, 784), (1000, 784), (1000,), (1000,), (1000,), (10, 1000), (10,)],
 [(100, 10)],
 [(1000,), (1000,)])
out.list_arguments()
['X',
 'fc1_weight',
 'fc1_bias',
 'batchnorm_gamma',
 'batchnorm_beta',
 'fc2_weight',
 'fc2_bias']
out.list_outputs()
['fc2_output']
out.list_auxiliary_states()
['batchnorm_moving_mean', 'batchnorm_moving_var']

Symbol 如何获取中间节点

在定义好一个网络之后,如何去获取任何一个节点的输出值对于深度神经网络的迁移来说非常重要,因为在使用时通常并不是自己从头开始训练一个网络,而是在别人训练好的网络基础上根据自己的问题进行微调。

X = sym.Variable('X')
fc1 = sym.FullyConnected(data=X, name='fc1', num_hidden=1000)
act = sym.Activation(data=fc1, act_type='relu')
fc2 = sym.FullyConnected(data=act, name='fc2', num_hidden=10)
net = sym.SoftmaxOutput(fc2, name="softmax")
net.get_internals()
<Symbol group [X, fc1_weight, fc1_bias, fc1, activation0, fc2_weight, fc2_bias, fc2, softmax_label, softmax]>
subnet = net.get_internals()['fc2_output']
subnet, subnet.list_arguments()
(<Symbol fc2>, ['X', 'fc1_weight', 'fc1_bias', 'fc2_weight', 'fc2_bias'])

首先使用 get_internals() 获取整个 Symbol 的子图,输出是整个内部节点的输出节点列表。然后可以通过索引获取网络的子图。在上面的例子中,我们获取网络层的倒数第二层 fc2,可以看到 fc2 也是一个 Symbol 对象。

fc2.list_arguments()
['X', 'fc1_weight', 'fc1_bias', 'fc2_weight', 'fc2_bias']

同理,有:

subnet = net.get_internals()['fc1_output']
subnet.list_arguments()
['X', 'fc1_weight', 'fc1_bias']

图的拼接

假如,我们拿到了别人训练好的网络参数文件和网络结构文件,我们可以固定网络图的前部分,在尾部添加额外的 Symbol 节点,但是在网络的头部替换输入节点较困难。

X = sym.Variable('X')
fc1 =  sym.FullyConnected(data=X, name='fc1', num_hidden=1000)
act =  sym.Activation(data=fc1, act_type='relu',name='act')
fc2 =  sym.FullyConnected(data=act, name='fc2', num_hidden=10)
net = sym.SoftmaxOutput(fc2,name="softmax")
net.save('model.symbol.json')

如上面所示,我们先定义好了一个 包含 10 个输出节点网络,然后将 Smbol 网络保存到 json 文件。接下来我们重新加载这个 json 文件,并且在网络结尾处重新修改网络层的输出为 20。

net = sym.load('model.symbol.json')
net.get_internals().list_outputs()
['X',
 'fc1_weight',
 'fc1_bias',
 'fc1_output',
 'act_output',
 'fc2_weight',
 'fc2_bias',
 'fc2_output',
 'softmax_label',
 'softmax_output']
newnet = net.get_internals()['act_output']
newnet = sym.FullyConnected(data=fc1,num_hidden=20,name ='fc2_new')
newnet = sym.SoftmaxOutput(data=newnet,name='softmax_new')
newnet.get_internals().list_outputs()
['X',
 'fc1_weight',
 'fc1_bias',
 'fc1_output',
 'fc2_new_weight',
 'fc2_new_bias',
 'fc2_new_output',
 'softmax_new_label',
 'softmax_new_output']

Metric

Metric 是用来衡量模型效果的接口
当我们定义好一个 Metric,比如说 Accuracy , 然后将 Accuracy 交给 Module 托管的时候,在每个 Epoch 结束时,会自动调用 update 方法,计算 正确预测的样本数量和总共的样本数量,进而调用父类中的 get 方法,计算出最后的 Acc。

from mxnet import metric

predicts = [nd.array([[0.3, 0.7], [0, 1.], [0.4, 0.6]])]
labels   = [nd.array([0, 1, 1])]
acc = metric.Accuracy()
acc.update(preds = predicts, labels = labels)
acc.get()
('accuracy', 0.6666666666666666)

Metric Hack 分析

如果我们想要定义 自己的 Metric 类,需要完成下面几步:

  • 继承 metric.EvalMetric 接口,重新定义 update 方法,update 传入参数分析:

    • labels : list 类型,每个元素对应 DataBatch 中的 label
    • predicts : list 类型, 是 Loss Symbol 中 label 外的输入,因此 list 中的元素个数与网络上 loss 的个数有关
  1. 函数需要完成:
  • 更新属性 sum_metricnum_inst 的值,mxnet 会调用 get 函数中的 self.sum_metric / self.num_inst 来计算当前 metric 的输出值。
  • 与一个特殊的 Callback 类有关: Speedometer 会自动打印出所有 metric 的值。

转载:https://www.imooc.com/article/278837

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
8天前
|
机器学习/深度学习 API 语音技术
|
11天前
|
机器学习/深度学习 监控 算法
深度学习赋能智能监控:图像识别技术的革新与应用
【4月更文挑战第8天】 随着人工智能技术的飞速发展,深度学习在图像处理领域取得了突破性进展。特别是在智能监控系统中,基于深度学习的图像识别技术已成为提升安全和效率的关键工具。本文将探讨深度学习技术如何革新传统监控体系,增强其对复杂场景的理解能力,以及在实际部署中面临的挑战和解决方案。通过分析最新的研究成果和应用案例,我们揭示了深度学习在智能监控领域的潜力及其对未来社会发展的影响。
17 2
|
10天前
|
机器学习/深度学习 监控 安全
智能化视野下的守卫者:基于深度学习的图像识别技术在智能监控领域的革新应用
【4月更文挑战第9天】 随着人工智能技术的飞速发展,深度学习已经成为了推动计算机视觉进步的重要力量。尤其在智能监控领域,基于深度学习的图像识别技术正逐步转变着传统监控系统的功能与效率。本文旨在探讨深度学习技术如何赋能智能监控,提高对场景理解的准确性,增强异常行为检测的能力,并讨论其在实际部署中所面临的挑战和解决方案。通过深入分析,我们揭示了深度学习在智能监控中的应用不仅优化了安全防范体系,也为城市管理和公共安全提供了有力的技术支持。
|
10天前
|
机器学习/深度学习 算法 数据处理
深度学习在图像识别中的创新应用
【4月更文挑战第9天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的关键技术之一。特别是在图像识别任务中,深度学习模型已经展现出超越传统算法的性能。本文将深入探讨深度学习在图像识别领域的最新进展,包括卷积神经网络(CNN)的变体、数据增强技术以及迁移学习等策略。通过对这些技术的综合运用,我们能够实现对复杂图像数据的高效识别和分类,进一步拓展了深度学习在实际应用中的可能性。
12 1
|
10天前
|
机器学习/深度学习 人工智能 算法
深度学习在医学影像诊断中的应用与挑战
传统医学影像诊断一直是医学领域的重要组成部分,但其依赖于医生的经验和技能,存在着诊断准确性不高和效率低下的问题。近年来,随着深度学习技术的发展,越来越多的研究表明,深度学习在医学影像诊断中具有巨大的潜力。本文将探讨深度学习在医学影像诊断中的应用现状、挑战和未来发展趋势。
15 0
|
11天前
|
机器学习/深度学习 人工智能 算法
深度学习在图像识别中的应用与挑战
【4月更文挑战第8天】 随着人工智能技术的飞速发展,深度学习已经成为了计算机视觉领域的核心动力。本文聚焦于深度学习技术在图像识别任务中的运用,探讨了卷积神经网络(CNN)的基本原理、关键结构和训练技巧,并通过实验分析展示了其在处理复杂图像数据时的强大能力。同时,文章也指出了当前深度学习方法面临的主要挑战,如数据偏差、模型泛化能力和计算资源消耗等,并对未来的发展方向进行了展望。
|
3天前
|
机器学习/深度学习 计算机视觉 异构计算
深度学习在图像识别中的应用与挑战
【4月更文挑战第16天】 随着人工智能技术的飞速发展,深度学习作为其核心技术之一,在图像识别领域取得了显著的成果。本文将探讨深度学习在图像识别中的应用,分析其优势和面临的挑战,并提出相应的解决方案。通过对现有技术的研究和实践,我们旨在为读者提供一个全面了解深度学习在图像识别领域的应用现状和未来发展趋势的视角。
|
3天前
|
机器学习/深度学习 监控 安全
深度学习驱动下的智能监控革新:图像识别技术的实战应用
【4月更文挑战第16天】 随着人工智能的迅猛发展,深度学习技术在图像处理和分析领域取得了突破性的进展。尤其是在智能监控系统中,基于深度学习的图像识别技术已经成为提高安全水平、实现自动化监控的关键工具。本文聚焦于深度学习在智能监控中的应用,探讨了卷积神经网络(CNN)、递归神经网络(RNN)等先进结构在实时视频流分析和异常行为检测方面的具体实践。通过深入分析多个案例,我们展示了深度学习如何提升监控系统的准确性、效率及智能化程度,同时对面临的挑战和未来发展趋势进行了展望。
8 2
|
5天前
|
机器学习/深度学习 安全 计算机视觉
深度学习在图像识别中的应用与挑战
【4月更文挑战第14天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的关键力量。本文聚焦于深度学习技术在图像识别任务中的运用,探讨了卷积神经网络(CNN)的基本原理、关键架构以及优化策略,并对当前面临的主要挑战进行了分析。通过实验结果与案例分析,本文揭示了深度学习在提高图像识别准确性方面的潜力及存在的限制因素。