Tensorflow - 如何在py_func渐变中处理numpy op输出?

时间:2016-10-15 14:10:40

标签: numpy tensorflow gradient

我使用这个链接: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>

1 个答案:

答案 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