首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改梯度图估计

更改梯度图估计
EN

Stack Overflow用户
提问于 2017-10-31 01:11:32
回答 1查看 71关注 0票数 1

我正在尝试估计下面函数的正向传递和反向梯度:

代码语言:javascript
复制
  def func(img-batch, X1,X2):
    L=1
    A1 = X1*L**2
    A2 = X2*L**2
    AA1 = A1*A1
    AA2 = A2*A2
    A11A2 = A1*A2
    v = tf.nn.conv2d(img-batch, A1A2, strides=[1, 1, 1, 1], padding='SAME')
    v = v+ AA1+AA2
    return v

当我将这个函数添加到网络中时,默认情况下会对该函数的每条指令执行梯度。

如何使用此函数并在正向传递中计算它,同时忽略函数中每条指令的梯度,并提供其他梯度估计并将其添加到模型的主梯度中?

EN

回答 1

Stack Overflow用户

发布于 2017-11-01 11:10:11

您可以使用py_func忽略此函数中的渐变,并使用gradient_override_map提供自定义渐变。下面是一个示例:

代码语言:javascript
复制
import tensorflow as tf

def myfunc(X1, X2):
  L = 1
  A1 = X1 * L**2
  A2 = X2 * L**2
  AA1 = A1 * A1
  AA2 = A2 * A2
  A11A2 = A1 * A2
  ...
  v = AA1 + AA2 + A11A2
  return v


@tf.RegisterGradient("GradMyfunc")
def grad_myfunc(op, grad):
  X1 = op.inputs[0]
  X2 = op.inputs[1]
  return [grad * X2, grad * X1]


X1 = tf.Variable(tf.constant(1.1, dtype=tf.float64))
X2 = tf.Variable(tf.constant(2.2, dtype=tf.float64))
g = tf.get_default_graph()
with g.gradient_override_map({"PyFunc": "GradMyfunc"}):
  y = tf.py_func(myfunc, [X1, X2], [tf.float64])


with tf.Session() as sess:
  grad = tf.gradients(y, [X1, X2])
  sess.run(tf.global_variables_initializer())
  print(sess.run(y))
  print(sess.run(grad))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47020762

复制
相关文章

相似问题

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