IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 写算子单元测试Writing Unit Tests -> 正文阅读

[开发测试]写算子单元测试Writing Unit Tests

写算子单元测试Writing Unit Tests!
一些单元测试示例,可在tests/python/relay/test_op_level3.py中找到,用于累积总和与乘积算子。
梯度算子
梯度算子对于编写Relay中的可微程序非常重要。虽然Relay的autodiff算法可区分一流的语言结构,但算子是不透明的。Relay无法查看实现,必须提供明确的差异化规则。
Python和C++都可编写梯度算子,但是,示例集中在Python上,更常用。
在Python中添加梯度
Python梯度算子的集合可在Python/tvm/relay/op/_tensor_grad.py中找到。将介绍两个具有代表性的示例:sigmoid和multiply。
@register_gradient(“sigmoid”)
def sigmoid_grad(orig,grad):
“”“Returns [grad * sigmoid(x) * (1 - sigmoid(x))].”""
return [grad * orig * (ones_like(orig) - orig)]

这里的输入是原始算子orig和要累加的梯度。返回的是一个列表,第i个索引处的元素是算子相对于算子第i个输入的导数。通常,梯度将返回一个列表,包含的元素数量与基本算子的输入数量相同。
进一步分析这个定义前面,首先回顾一下sigmoid函数的导数:
上面的定义类似于数学定义,但有一个重要的补充,将在下面描述。
术语orig*(类似于(orig)-orig)直接匹配导数,这里的orig是sigmoid函数,但不只是对如何计算这个函数的梯度感兴趣。将这个梯度与其它梯度组合起来,这样就可在整个程序中累积梯度。
在这里插入图片描述

这就是梯度术语的意义所在。在表达式gradorig(one_like(orig)-orig)中,乘以grad,表示如何使用到目前为止的梯度合成导数。
现在,考虑乘法,一个稍微有趣的示例:
@register_gradient(“multiply”)
def multiply_grad(orig,grad):
“”“Returns [grad * y,grad * x]”""
x,y=orig.args
return [collapse_sum_like(grad * y,x),
collapse_sum_like(grad * x,y)]

在本例中,返回的列表中有两个元素,multiply是一个二进制算子。回想一下,如果 在这里插入图片描述
,偏导数是
在这里插入图片描述

有一个乘法所需的步骤,对于sigmoid不是必需的,乘法具有广播语义。梯度的shape可能与输入的shape不匹配,使用collapse_sum_like来获取梯度grad * 项的内容,使shape与要区分的输入的shape匹配。
Adding a Gradient in C++
在C++中添加一个梯度,类似于在Python中添加,但是,用于注册的接口略有不同。
首先,确保包含src/relay/transforms/pattern_utils.h。提供了用于在RelayAST中创建节点的 helper函数。然后,类似于Python示例的方式,定义梯度:
tvm::Array MultiplyGrad(const Expr& orig_call,const Expr& output_grad) {
const Call& call=orig_call.Downcast();
return { CollapseSumLike(Multiply(output_grad,call.args[1]),call.args[0]),
CollapseSumLike(Multiply(output_grad,call.args[0]),call.args[1]) };
}
在C++中,不能使用Python中的算子重载,需要进行downcast,实现更加冗长。即使如此,可容易地验证这个定义,是否反映了Python中的早期示例。
现在,不需要使用Python装饰器,需要在基础算子的注册末尾,添加一个对“FPrimalGradient”的set_attr调用,注册梯度。
RELAY_REGISTER_OP(“multiply”)
// …
// Set other attributes
// …
.set_attr(“FPrimalGradient”,MultiplyGrad);

参考链接:
https://tvm.apache.org/docs/dev/relay_add_op.html
TVM源码研习 — TVM中的IR设计与技术实现

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-12-07 12:20:35  更:2021-12-07 12:21:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 6:30:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码