有人能解释一下gradient_override_map函数在TensorFlow中的用法吗?我不能准确地理解它的用法。
我认为代码的用法是:
with G.gradient_override_map({"Floor": "Identity"}):
return tf.reduce_mean(SomeVals) * SomeOtherVal这里到底发生了什么?什么是Identity?
发布于 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的回答中展示的。
@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")通过
@tf.RegisterGradient("CustomGrad")
def _const_mul_grad(unused_op, grad):
return 5.0 * gradtf.RegisterGradient("CustomGrad")为定制的op类型注册_const_mul_grad(unused_op, grad)定义的梯度函数-- "CustomGrad",
而
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计算机制。
附注:
OpDef.name字段。要找到op的OpDef.name,请参阅this question下的鸣星的答案发布于 2017-06-30 19:06:27
据我所知,gradient_override_map允许您说:“在这个上下文中,任何时候都可以使用X的梯度,而使用Y的梯度”。这意味着你仍然需要Y的梯度作为你想要使用的梯度。
这是我在寻找它的工作原理时看到的一个例子:
@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=的“身份”是否真的是必要的。
https://stackoverflow.com/questions/41391718
复制相似问题