mxnet创建新的操作(层)
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创建新的操作(层)相关推荐
- 前嗅ForeSpider教程:如何创建新任务
从今天起,小编开始教大家逐步进行可视化配置操作.首先,我们来学习第一步:创建新任务,主要包括创建新任务的操作步骤,操作中的注意事项两部分内容. 一,创建新任务操作步骤: 1.添加新任务 点击任务列表右 ...
- 前嗅ForeSpider教程:如何创建新任务 1
从今天起,小编开始教大家逐步进行可视化配置操作.首先,我们来学习第一步:创建新任务,主要包括创建新任务的操作步骤,操作中的注意事项两部分内容. 一,创建新任务操作步骤: 1.添加新任务 点击任务列表右 ...
- linux创建数据库Oracle用户,linux下ORACLE数据库中创建新用户
http://www.cnblogs.com/cloudwalf/archive/2008/09/04/1284033.html http://www.aiisen.com/oracle-lin ...
- 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )
文章目录 一.函数形参使用推荐方法 二.完整代码示例 一.函数形参使用推荐方法 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中 ...
- 通过子类化创建新的层和模型
设置 import tensorflow as tffrom tensorflow import keras Layer类:状态(权重)和部分计算的组合 Keras 的一个中心抽象是 La ...
- VMware安装系统时“无法创建新虚拟机: 不具备执行此操作的权限“的解决方案
VMware安装系统时"无法创建新虚拟机: 不具备执行此操作的权限"的解决方案 参考文章: (1)VMware安装系统时"无法创建新虚拟机: 不具备执行此操作的权限&qu ...
- VMware 12 Pro虚拟机安装Ubuntu 16操作系统,选择创建新的虚拟机操作后无反应
问题描述: 我在WIN 10系统下先是安装VMware 12 Pro虚拟机,再在虚拟机上安装Ubuntu 16操作系统. 在VMware软件主页界面,点击"创建新的虚拟机",之后弹 ...
- 【MySQL】 # MySQL对用户权限的简单操作:(1)创建新用户(2)赋权限
MySQL对用户权限操作的详细内容:MySQL权限操作 1. 创建新用户 一般使用 Navicat 直接登录 MySQL,也可以使用命令行 mysql -u root -p,然后输入密码即可. 1.1 ...
- 在CAD绘图时创建新的面域对象是怎么操作的?
在学习CAD的过程中,我们需要去不断的练习不断的去实践不断的绘图,才能尽快的具备绘图的能力,这里以创建新的面域对象为例,在CAD编辑器中要怎样才可以快速的创建新的面域对象呢?具体需要怎么操作呢? 方法 ...
最新文章
- 天翼云从业认证(1.1)服务器的分类、用途、特点、结构和组件
- yarn client 提交任务
- 深到骨子里的自律,是每周坚持刷几篇最新论文 | PaperDaily #10
- 网络学习笔记网络通讯
- php7 pdo mysql_PHP7添加pdo_mysql扩展
- WinDbg 命令三部曲:(一)WinDbg 命令手册
- 字符串处理 —— 单模式匹配
- javascript_如何不再害怕JavaScript
- 内存cookie与持久cookie
- python中大于0的元素全部转化为1,小于0的元素全部转化为0的代码
- WiFi6模块 RW6852S-50 2T2R蓝牙模块 SDIO接口 WIFI6
- googlePlay订阅商品对接流程
- 新卡插手机显示无服务器,手机插卡无服务怎么回事
- STM32涉及到的汇编基础知识
- 知人者智,自知者明。 胜人者有力,自胜者强。 知足者富。 强行者有志。 不失其所者久。 死而不亡者寿。
- 服务器磁盘阵列做win7系统,win7 X64 中RIAD0的磁盘阵列怎么组建
- 为什么卷积层不加bias
- 小程序-手写签名(附代码)
- java用calendr做个日历,calendR :为你定制私人专属日历
- 无需改动代码实现jasypt加密
热门文章
- java用户角色权限管理 只显示姓_快递物流管理系统SSM,JQUERYEASYUI,MYSQL
- MySQL数据库索引及失效场景
- 中国为什么不发展民用计算机,为什么大多数人都错估了计算机与AI的发展?
- flask mysql 1366_2017-11-17 Python Flask Script+mysql环境设置
- 从mysql到大数据(一)--开宗明义
- ftp文件服务器杀毒,FTP远程查杀网页木马方法
- laravel5.6 使用指定字段作为key_MyRocks TTL使用姿势及Bugfix
- QuerWrapper常用方法
- dev控件swiftplot图滚动方法_无限轮播图使用Scroller就这么简单
- 使用缓冲字节流:BufferedInputStream与BufferedOutputStream读写数据