我使用这个链接: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]得到的是一个Tensor,我想用python在python中处理...有什么方法可以将这个Tensor转换成python的python梯度环境中的numpy?< / p>
答案 0 :(得分:2)
使用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