mxnet创建新的操作(层)

这篇blog将会告诉你如何创建新的MXNet操作(层)。

我们竭尽所能提供最好的操作对于绝大多数的使用场景。然而,如果你发现自己需要自定义层,你有3个选择:

1.使用原生的语言和它的矩阵库(numpy in Python)。这不需要过多的能力和对MXNet的了解。但是他会影响性能。

2.使用原生的语言和mxnet.rtc和mxnet.ndarray。这将给你更好的性能,但是相应的你需要了解更多的MXNet的知识。你可以写CUDA的内核通过Python的方式,并且在运行时进行编译。

3.使用 C++/MShadow(CUDA).这需要你对MXNet,mshadow和Cuda都熟悉。(大神的选择)

Python/Numpy

执行一个python里面的操作和c++里面的操作相似但是更简单了。让我们来创建一个softmax操作,我们通过用mxnet.operator.NumpyOp来开始,然后重写一些方法。

首先,我们调用我们的基础构造器使用need_top_grad=false:

class NumpySoftmax(mx.operator.NumpyOp):def __init__(self):super(NumpySoftmax, self).__init__(False)

这将告诉引擎我们不需要梯度来自后向传播。

然后我们定义我们的输入和输出

    def list_arguments(self):return ['data', 'label']def list_outputs(self):return ['output']

我们推荐的参数排序方式

['input1', 'input2', ... , 'weight1', 'weight2', ...]

接下去我们需要提供infer_shape来声明我们的output/weight并且检查输入形状的一致性。

    def infer_shape(self, in_shape):data_shape = in_shape[0]label_shape = (in_shape[0][0],)output_shape = in_shape[0]return [data_shape, label_shape], [output_shape]

我们的第一个维度总是batch size。我们的标签是一系列的整数,我们的输出和输入有相同的形状大小。Infer_size应该返回两列,即使他们是空的。

 def forward(self, in_data, out_data):x = in_data[0]y = out_data[0]y[:] = np.exp(x - x.max(axis=1).reshape((x.shape[0], 1)))y /= y.sum(axis=1).reshape((x.shape[0], 1))def backward(self, out_grad, in_data, out_data, in_grad):l = in_data[1]l = l.reshape((l.size,)).astype(np.int)y = out_data[0]dx = in_grad[0]dx[:] = ydx[np.arange(l.shape[0]), l] -= 1.0

记住你需要创建一个新的实例对于每一个symbol。

全部的代码在examples/numpy-ops/numpy_softmax.py

别的两种选择比较麻烦,这里就不讲了。

mxnet创建新的操作(层)相关推荐

  1. 前嗅ForeSpider教程:如何创建新任务

    从今天起,小编开始教大家逐步进行可视化配置操作.首先,我们来学习第一步:创建新任务,主要包括创建新任务的操作步骤,操作中的注意事项两部分内容. 一,创建新任务操作步骤: 1.添加新任务 点击任务列表右 ...

  2. 前嗅ForeSpider教程:如何创建新任务 1

    从今天起,小编开始教大家逐步进行可视化配置操作.首先,我们来学习第一步:创建新任务,主要包括创建新任务的操作步骤,操作中的注意事项两部分内容. 一,创建新任务操作步骤: 1.添加新任务 点击任务列表右 ...

  3. linux创建数据库Oracle用户,linux下ORACLE数据库中创建新用户

     http://www.cnblogs.com/cloudwalf/archive/2008/09/04/1284033.html http://www.aiisen.com/oracle-lin ...

  4. 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

    文章目录 一.函数形参使用推荐方法 二.完整代码示例 一.函数形参使用推荐方法 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中 ...

  5. 通过子类化创建新的层和模型

    设置 import tensorflow as tffrom tensorflow import keras ​​Layer​​类:状态(权重)和部分计算的组合 Keras 的一个中心抽象是 ​​La ...

  6. VMware安装系统时“无法创建新虚拟机: 不具备执行此操作的权限“的解决方案

    VMware安装系统时"无法创建新虚拟机: 不具备执行此操作的权限"的解决方案 参考文章: (1)VMware安装系统时"无法创建新虚拟机: 不具备执行此操作的权限&qu ...

  7. VMware 12 Pro虚拟机安装Ubuntu 16操作系统,选择创建新的虚拟机操作后无反应

    问题描述: 我在WIN 10系统下先是安装VMware 12 Pro虚拟机,再在虚拟机上安装Ubuntu 16操作系统. 在VMware软件主页界面,点击"创建新的虚拟机",之后弹 ...

  8. 【MySQL】 # MySQL对用户权限的简单操作:(1)创建新用户(2)赋权限

    MySQL对用户权限操作的详细内容:MySQL权限操作 1. 创建新用户 一般使用 Navicat 直接登录 MySQL,也可以使用命令行 mysql -u root -p,然后输入密码即可. 1.1 ...

  9. 在CAD绘图时创建新的面域对象是怎么操作的?

    在学习CAD的过程中,我们需要去不断的练习不断的去实践不断的绘图,才能尽快的具备绘图的能力,这里以创建新的面域对象为例,在CAD编辑器中要怎样才可以快速的创建新的面域对象呢?具体需要怎么操作呢? 方法 ...

最新文章

  1. 天翼云从业认证(1.1)服务器的分类、用途、特点、结构和组件
  2. yarn client 提交任务
  3. 深到骨子里的自律,是每周坚持刷几篇最新论文 | PaperDaily #10
  4. 网络学习笔记网络通讯
  5. php7 pdo mysql_PHP7添加pdo_mysql扩展
  6. WinDbg 命令三部曲:(一)WinDbg 命令手册
  7. 字符串处理 —— 单模式匹配
  8. javascript_如何不再害怕JavaScript
  9. 内存cookie与持久cookie
  10. python中大于0的元素全部转化为1,小于0的元素全部转化为0的代码
  11. WiFi6模块 RW6852S-50 2T2R蓝牙模块 SDIO接口 WIFI6
  12. googlePlay订阅商品对接流程
  13. 新卡插手机显示无服务器,手机插卡无服务怎么回事
  14. STM32涉及到的汇编基础知识
  15. 知人者智,自知者明。 胜人者有力,自胜者强。 知足者富。 强行者有志。 不失其所者久。 死而不亡者寿。
  16. 服务器磁盘阵列做win7系统,win7 X64 中RIAD0的磁盘阵列怎么组建
  17. 为什么卷积层不加bias
  18. 小程序-手写签名(附代码)
  19. java用calendr做个日历,calendR :为你定制私人专属日历
  20. 无需改动代码实现jasypt加密

热门文章

  1. java用户角色权限管理 只显示姓_快递物流管理系统SSM,JQUERYEASYUI,MYSQL
  2. MySQL数据库索引及失效场景
  3. 中国为什么不发展民用计算机,为什么大多数人都错估了计算机与AI的发展?
  4. flask mysql 1366_2017-11-17 Python Flask Script+mysql环境设置
  5. 从mysql到大数据(一)--开宗明义
  6. ftp文件服务器杀毒,FTP远程查杀网页木马方法
  7. laravel5.6 使用指定字段作为key_MyRocks TTL使用姿势及Bugfix
  8. QuerWrapper常用方法
  9. dev控件swiftplot图滚动方法_无限轮播图使用Scroller就这么简单
  10. 使用缓冲字节流:BufferedInputStream与BufferedOutputStream读写数据