python-在Tensorflow中将自定义渐变定义为类方法

python-在Tensorflow中将自定义渐变定义为类方法,第1张

概述我需要将方法定义为自定义渐变,如下所示:class CustGradClass: def __init__(self): pass @tf.custom_gradient def f(self,x): fx = x def grad(dy): return dy * 1

我需要将方法定义为自定义渐变,如下所示:

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中将自定义渐变定义为类方法 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1199550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存