我需要将方法定义为自定义渐变,如下所示:
class CustGradClass: def __init__(self): pass @tf.custom_gradIEnt def f(self,x): fx = x def grad(dy): return dy * 1 return fx,grad
我收到以下错误:
ValueError: Attempt to convert a value (<main.CustGradClass object at 0x12ed91710>) with an unsupported type () to a Tensor.
原因是自定义渐变接受函数f(* x),其中x是张量序列.传递的第一个参数是对象本身,即自我.
从documentation开始:
f: function f(*x) that returns a tuple (y,grad_fn) where:
x is a sequence of Tensor inputs to the function.
y is a Tensor or sequence of Tensor outputs of applying TensorFlow operations in f to x.
grad_fn is a function with the signature g(*grad_ys)
我该如何运作?我需要继承一些python tensorflow类吗?
我正在使用TF版本1.12.0和渴望模式.
最佳答案这是一种可能的简单解决方法:import tensorflow as tfclass CustGradClass: def __init__(self): self.f = tf.custom_gradIEnt(lambda x: CustGradClass._f(self,x)) @staticmethod def _f(self,x): fx = x * 1 def grad(dy): return dy * 1 return fx,gradwith tf.Graph().as_default(),tf.Session() as sess: x = tf.constant(1.0) c = CustGradClass() y = c.f(x) print(tf.gradIEnts(y,x)) # [<tf.Tensor 'gradIEnts/IDentityN_grad/mul:0' shape=() dtype=float32>]
编辑:
如果您想在不同的类上多次执行此 *** 作,或者只想使用更可重用的解决方案,则可以使用如下所示的装饰器:
import functoolsimport tensorflow as tfdef tf_custom_gradIEnt_method(f): @functools.wraps(f) def wrapped(self,*args,**kwargs): if not hasattr(self,'_tf_custom_gradIEnt_wrappers'): self._tf_custom_gradIEnt_wrappers = {} if f not in self._tf_custom_gradIEnt_wrappers: self._tf_custom_gradIEnt_wrappers[f] = tf.custom_gradIEnt(lambda *a,**kw: f(self,*a,**kw)) return self._tf_custom_gradIEnt_wrappers[f](*args,**kwargs) return wrapped
然后,您可以这样做:
class CustGradClass: def __init__(self): pass @tf_custom_gradIEnt_method def f(self,grad @tf_custom_gradIEnt_method def f2(self,x): fx = x * 2 def grad(dy): return dy * 2 return fx,grad
总结 以上是内存溢出为你收集整理的python-在Tensorflow中将自定义渐变定义为类方法 全部内容,希望文章能够帮你解决python-在Tensorflow中将自定义渐变定义为类方法 所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)