继承CustomOp

  • 定义操作符,重写前向后向方法,此时可以通过_init__ 方法传递需要用到的参数
 class LossLayer(mxnet.operator.CustomOp):
def __init__(self, *args, **kwargs):
super(LossLayer, self).__init__()
# recipe some arguments for forward or backward calculation def forward(self, is_train, req, in_data, out_data, aux):
"""
in_data是一个列表,其中tensor的顺序和对应属性类中定义的list_arguments()参数一一对应
out_data输出列表
is_train 是否是训练过程
req [Null, write or inplace, add]指如何处理对应的复制操作
"""
pass
# 函数最后一般调用父类的self.assign(dst, req[0], src)进行赋值操作
# 但对于dst或者src是list类型的时候要调用多次assign函数处理,此时也可以直接自己赋值
# dst[:]=src def backward(self, req, out_grad, in_data, out_data, in_grad, aux):
"""
out_grad 上一层反传的误差
in_data 输入数据,list
out_data 输出的数据,由forward方法确定, 其类型大小和out_grad一致
in_grad 需要计算的回传误差
"""
pass
# 其操作值得复制操作类似于forward方法
  • 定义好操作符之后还需要定义其对应的属性类,并将其注册到operator中
 @mx.operator.register('losslayer')  # 注意这里注册的名字将是后面调用该操作符使用的类型名
  • 重写对应的属性类
 class LossLayerProp(mx.operator.CustomOpProp): # 这里的名字并非必须对应操作类名称,被@修饰符修饰
def __init__(self, params):
super(LossLayerProp,self).__init__(need_top_grad=False)
# 最后的损失层不需要接收上层的误差,则将need_top_grad设置为False
# 可以传递一些参数用以传递给操作类 def list_arguments(self):
# 这个方法非常重要,定义了该操作符的输入参数,当绑定对应操作符时,输入量由该方法指定
return ['data1','data2','data3','label'] def list_outputs(self):
# 同样返回的是列表,表示输出的量,这个其实是输出变量的后缀suffix
# 若返回的是['output1','output2']则输出为 操作类的名称name加上对应后缀的量[name_output1, name_output2]
return ['output'] def infer_shape(self, in_shape):
# 给定in_shape,显示每一个变量的对应大小,以判断大小是否一致
return [],[],[]
# 返回的必须是3个列表,即使列表为空,分别对应着输入参数的大小、输出数据的大小、aux参数的大小,一般最后一个为空 def infer_type(self, in_type):
# 该方法类似于infer_shape,推断数据类型 def create_operator(self, ctx, shapes, dtypes):
# 该方法真正的创建操作类对象,默认调用
return LossLayer()
  • 自定义操作符的使用
 data1=mx.sym.Variable('data1')
data2=mx.sym.Variable('data2')
data3=mx.sym.Variable('data3')
label = mx.sym.Variable('label')
# 下面这句调用很重要,显示指定输入的symbol,然后指定自定义操作符类型
net = mx.sym.Custom(data1=data1, data2=data2, data3=data3, label=label, name='net', op_type='losslayer')
# 输出操作符的相关属性
print(net.infer_shape(data1=(4,1,10,10), data2=(4,1,10,10),data3=(4,1,10,10) label=(4,)))
# data1=(4,1,10,10)表示对应symbol的shape
print(net.infer_type(data1=np.int, data2=np.int, data3=np.int, label=np.int))
# data1=np.int 标识对应symbol的数据类型
print(net.list_arguments()) # 变量参数
print(net.list_outputs()) #输出的变量参数 ex = net.simple_bind(ctx=mx.gpu(0), data1=(4,1,10,10), data2=(4,1,10,10),data3=(4,1,10,10) label=(4,)) # simple_bind只需要指定输入参数的大小
ex.forward(data1=data1, data2=data2, label=label))
print(ex.outputs[0])
  • 上面是没有参数的层,创建带有参数的中间层和上面类似, 只是修改下面部分代码
 def list_arguments(self):
return ['data','weight', 'bias'] def infer_shape(self, in_shape):
data_shape = in_shape[0]
weight_shape = ...
bias_shape = ...
output_shape = ...
return [data_shape, weight_shape, bias_shape], [output_shape], []

调用方式:

net = mx.symbol.Custom(data, name='newLayer', op_type='myLayer')

包含参数的layer在定义backward方法时要注意梯度的更新方式,即req的选择

NOTE:

有参数的操作符中,一般使用‘weight’和‘bias’作为参数, 该参数会最为后缀加到 opname_weight, opname_bias中,因为mxnet默认的参数初始化方法只认‘weight’, 'bias', 'gamma', 'beta'四个量, 对于自己新定义的量,比如weight2, 需要指定初始化方法

Default initialization is now limited to "weight", "bias", "gamma" (1.0), and "beta" (0.0).
Please use mx.sym.Variable(init=mx.init.*) to set initialization pattern

How to create own operator with python in mxnet?的更多相关文章

  1. error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted

    参考: Python pip安装模块报错 Mac升级到EI Captain之后pip install 无法使用问题 error: could not create '/System/Library/F ...

  2. Create your first isolated Python environment

    # Install virtualenv for Python 2.7 and create a sandbox called my27project: pip2. install virtualen ...

  3. [Python] Object spread operator in Python

    In JS, we have object spread opreator: const x = { a: '1', b: '2' } const y = { c: '3', d: '4' } con ...

  4. 使用python创建mxnet操作符(网络层)

    对cuda了解不多,所以使用python创建新的操作层是个不错的选择,当然这个性能不如cuda编写的代码. 在MXNET源码的example/numpy-ops/下有官方提供的使用python编写新操 ...

  5. How to create PDF files in a Python/Django application using ReportLab

    https://assist-software.net/blog/how-create-pdf-files-python-django-application-using-reportlab CONT ...

  6. Think Python - Chapter 17 - Classes and methods

    17.1 Object-oriented featuresPython is an object-oriented programming language, which means that it ...

  7. Think Python - Chapter 11 - Dictionaries

    Dictionaries A dictionary is like a list, but more general. In a list, the indices have to be intege ...

  8. Data manipulation primitives in R and Python

    Data manipulation primitives in R and Python Both R and Python are incredibly good tools to manipula ...

  9. caffe2 教程入门(python版)

    学习思路 1.先看官方文档,学习如何使用python调用caffe2包,包括 Basics of Caffe2 - Workspaces, Operators, and Nets Toy Regres ...

随机推荐

  1. 安装rocketmq-console

    一.alibaba版本 使用rocketmq命令查看集群状态,查看topic信息时比较麻烦,而且不直观,这个时候可以使用一些web页面来管理rocketmq. 以前曾使用过一个老版本的工具,适用于al ...

  2. [转载]ASP.NET-----Repeater数据控件的用法总结

    一.Repeater控件的用法流程及实例: 1.首先建立一个网站,新建一个网页index.aspx. 2.添加或者建立APP_Data数据文件,然后将用到的数据库文件放到APP_Data文件夹中. 3 ...

  3. pyDay6

    内容来自廖雪峰的官方网站 1.在Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好,1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 2.取指 ...

  4. bzoj1658: [Usaco2006 Mar]Water Slides 滑水

    Description It's a hot summer day, and Farmer John is letting Betsy go to the water park where she i ...

  5. 04:sqlalchemy操作数据库

    目录: 1.1 ORM介绍(作用:不用原生SQL语句对数据库操作) 1.2 安装sqlalchemy并创建表 1.3 使用sqlalchemy对表基本操作 1.4 一对多外键关联 1.5 sqlalc ...

  6. keepalived+nginx实现HA高可用的web负载均衡

    Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用.Keepalived ...

  7. linux内核分析 第5章读书笔记

    第五章 系统调用 一.与内核通信 系统调用在用户控件进程和硬件设备之间添加了一个中间层,作用有: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运行在虚拟系统中,而在用 ...

  8. 【转载】浅谈JavaScript,let和var定义变量的区别

    了解JS与ES5与ES6区别 JS语言 JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能. 动态: 在运行时确定数据类型.变量使用之前不需要类型声明, ...

  9. PHP中namespace和use使用详解

    来源于:http://www.jb51.net/article/36389.htm 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种 ...

  10. User-Defined Table Types 用户自定义表类型

    Location 数据库--可编程性--类型--用户定义表类型 select one database--> programmability-->types-->user--defi ...