Tensorflow——如何在 py_func 梯度中处理 numpy op 输出?
Tensorflow -- how can I process in numpy op outputs in py_func gradient?
我用这个 link: https://gist.github.com/harpone/3453185b41d8d985356cbe5e57d67342 创建了一个带有梯度的 py_func 函数。这是 Harpone 的代码:
import tensorflow as tf
from tensorflow.python.framework import ops
import numpy as np
def py_func(func, inp, Tout, stateful=True, name=None, grad=None):
rnd_name = 'PyFuncGrad' + str(np.random.randint(0,1e+8))
tf.RegisterGradient(rnd_name)(grad)
g = tf.get_default_graph()
with g.gradient_override_map({"PyFunc" : rnd_name}):
return tf.py_func(func, inp, Tout, stateful=stateful, name=name)
def mysquare(x, name=None):
with ops.op_scope([x], name, "Mysquare") as name:
sqr_x = py_func(np.square, [x], [tf.float32], name=name, grad=_MySquareGrad)
return sqr_x[0]
def _MySquareGrad(op, grad):
x = op.inputs[0] // how can I process this op.inputs[0] in numpy??
return x*grad*2 // sample gradient
with tf.Session() as sess:
x = tf.constant([8., 2.])
y = mysquare(x)
tf.initialize_all_variables().run()
print (x.eval(), y.eval(), tf.gradients(y,x)[0].eval())
我的问题是,我可以通过对第一个输入使用 op.input[0] 对第一个输出使用 op.output[0] 来检索图层的输入和输出。
但是我从 op.output[0] 得到的是一个张量,我想在 python 中使用 numpy 处理它...有什么方法可以将这个张量转换成 numpy py_func?
的 python 渐变环境
使用tf.py_func
IE,使用 numpy
平方 x
def _MySquareGrad(op, grad):
x = op.inputs[0] # how can I process this op.inputs[0] in numpy??
xx = tf.py_func(np.square, [x], [tf.float32])
return xx[0]*grad*2 # sample gradient
我用这个 link: https://gist.github.com/harpone/3453185b41d8d985356cbe5e57d67342 创建了一个带有梯度的 py_func 函数。这是 Harpone 的代码:
import tensorflow as tf
from tensorflow.python.framework import ops
import numpy as np
def py_func(func, inp, Tout, stateful=True, name=None, grad=None):
rnd_name = 'PyFuncGrad' + str(np.random.randint(0,1e+8))
tf.RegisterGradient(rnd_name)(grad)
g = tf.get_default_graph()
with g.gradient_override_map({"PyFunc" : rnd_name}):
return tf.py_func(func, inp, Tout, stateful=stateful, name=name)
def mysquare(x, name=None):
with ops.op_scope([x], name, "Mysquare") as name:
sqr_x = py_func(np.square, [x], [tf.float32], name=name, grad=_MySquareGrad)
return sqr_x[0]
def _MySquareGrad(op, grad):
x = op.inputs[0] // how can I process this op.inputs[0] in numpy??
return x*grad*2 // sample gradient
with tf.Session() as sess:
x = tf.constant([8., 2.])
y = mysquare(x)
tf.initialize_all_variables().run()
print (x.eval(), y.eval(), tf.gradients(y,x)[0].eval())
我的问题是,我可以通过对第一个输入使用 op.input[0] 对第一个输出使用 op.output[0] 来检索图层的输入和输出。
但是我从 op.output[0] 得到的是一个张量,我想在 python 中使用 numpy 处理它...有什么方法可以将这个张量转换成 numpy py_func?
的 python 渐变环境使用tf.py_func
IE,使用 numpy
x
def _MySquareGrad(op, grad):
x = op.inputs[0] # how can I process this op.inputs[0] in numpy??
xx = tf.py_func(np.square, [x], [tf.float32])
return xx[0]*grad*2 # sample gradient