首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow gradient_override_map函数

Tensorflow gradient_override_map函数
EN

Stack Overflow用户
提问于 2016-12-30 06:33:39
回答 2查看 6.6K关注 0票数 8

有人能解释一下gradient_override_map函数在TensorFlow中的用法吗?我不能准确地理解它的用法。

我认为代码的用法是:

代码语言:javascript
复制
with G.gradient_override_map({"Floor": "Identity"}):
    return tf.reduce_mean(SomeVals) * SomeOtherVal

这里到底发生了什么?什么是Identity

EN

回答 2

Stack Overflow用户

发布于 2017-10-21 17:24:13

“楼层”和“标识”都是操作的类型字符串,前者对应于tf.floor,后者对应于tf.identity。因此,我猜,您的代码的功能是在传递tf.reduce_mean. tf.reduce_mean.的前向输出的同时,代替反向传播梯度( BPG )计算机制来代替图G中 tf.floor 操作的BPG计算机制。这似乎有点奇怪,因为在我到目前为止发现的所有gradient_override_map应用程序中,op_type_map的键总是与用于在上下文中生成输出的操作的类型字符串相同。我的意思是我更熟悉tf.floor(SomeVals)返回的场景,而不是tf.reduce_mean(SomeVals)

gradient_override_map({op_A_type: op_B_type})所做的是用op_B代替op_A的BPG计算机制,而保持op_A型的前向传播计算机制。gradient_override_map的一个常见应用是在lahwran的回答中展示的。

代码语言:javascript
复制
@tf.RegisterGradient("CustomGrad")
def _const_mul_grad(unused_op, grad):
    return 5.0 * grad

g = tf.get_default_graph()
with g.gradient_override_map({"Identity": "CustomGrad"}):
    output = tf.identity(input, name="Identity")

通过

代码语言:javascript
复制
@tf.RegisterGradient("CustomGrad")
def _const_mul_grad(unused_op, grad):
    return 5.0 * grad

tf.RegisterGradient("CustomGrad")为定制的op类型注册_const_mul_grad(unused_op, grad)定义的梯度函数-- "CustomGrad",

代码语言:javascript
复制
g = tf.get_default_graph()
with g.gradient_override_map({"Identity": "CustomGrad"}):
    output = tf.identity(input, name="Identity") 

确保字符串类型“标识”(tf.identity)的所有操作(图g)的输出保持原样,而用字符串类型"CustomGrad“代替_tf.identity_s的BPG计算机制。

附注:

  1. op的类型字符串对应于定义操作的proto的OpDef.name字段。要找到op的OpDef.name,请参阅this question下的鸣星的答案
  2. 没有必要声明tf.identity操作的名称,因为tf.identity中的arg ' name‘是可选的。
票数 8
EN

Stack Overflow用户

发布于 2017-06-30 19:06:27

据我所知,gradient_override_map允许您说:“在这个上下文中,任何时候都可以使用X的梯度,而使用Y的梯度”。这意味着你仍然需要Y的梯度作为你想要使用的梯度。

这是我在寻找它的工作原理时看到的一个例子:

代码语言:javascript
复制
@tf.RegisterGradient("CustomGrad")
def _const_mul_grad(unused_op, grad):
    return 5.0 * grad

g = tf.get_default_graph()
with g.gradient_override_map({"Identity": "CustomGrad"}):
    output = tf.identity(input, name="Identity")

引文:https://stackoverflow.com/a/43948872/1102705

RegisterGradient()允许您注册正在定义的新op的梯度,从而允许您有一个具有所需梯度的op,然后您可以在梯度覆盖映射中使用该op。有点笨重-你在定义一个没有前传的操作。

我不清楚的是,name=的“身份”是否真的是必要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41391718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档