TypeError:无法转换值<;tensorflow.python.eager.def_function.function对象转换为tensorflow数据类型

TypeError:无法转换值<;tensorflow.python.eager.def_function.function对象转换为tensorflow数据类型,python,tensorflow,tensorflow2.0,Python,Tensorflow,Tensorflow2.0,我正在尝试在我的模型中应用tf.GradientTape。在此之前,我用一个玩具的例子来尝试这一点 import numpy as np import tensorflow as tf X = tf.range(10.) Y = 50.*X class CGMM(object): def __init__(self): self.beta = tf.Variable(1. , dtype=np.float32) @tf.function def

我正在尝试在我的模型中应用
tf.GradientTape
。在此之前,我用一个玩具的例子来尝试这一点

import numpy as np
import tensorflow as tf


X = tf.range(10.)
Y = 50.*X

class CGMM(object):
    def __init__(self):
        self.beta =  tf.Variable(1. , dtype=np.float32)

    @tf.function
    def objfun(self):
        beta_mu = self.beta
        obj = tf.reduce_mean(tf.square(beta_mu*self.X - self.Y))
        return obj

    def build_model(self,X,Y):
        self.X,self.Y=X,Y
        opt = tf.optimizers.Adam(0.001) 

        for i in range(100):

            with tf.GradientTape() as tape:
              loss = self.objfun
            vars = self.beta
            grads = tape.gradient(loss, vars)


            processed_grads = [process_gradient(g) for g in grads]
            opt.apply_gradients(zip(processed_grads, vars))

        opt_beta_mu =self.beta

        return opt_beta_mu


model =CGMM()
opt_beta = model.build_model(X,Y)
print(opt_beta)
然而,我得到了这个错误-

<ipython-input-17-381a82ea919f> in <module>
     66 
     67 model =CGMM()
---> 68 opt_beta = model.build_model(X,Y)
     69 print(opt_beta)

<ipython-input-17-381a82ea919f> in build_model(self, X, Y)
     51               loss = self.objfun
     52             vars = self.beta
---> 53             grads = tape.gradient(loss, vars)
     54 
     55             # Process the gradients, for example cap them, etc.

/Users/Mine/Python/tf2_env/lib/python3.6/site-packages/tensorflow/python/eager/backprop.py in gradient(self, target, sources, output_gradients, unconnected_gradients)
   1016     flat_targets = []
   1017     for t in nest.flatten(target):
-> 1018       if not backprop_util.IsTrainable(t):
   1019         logging.vlog(
   1020             logging.WARN, "The dtype of the target tensor must be "

/Users/Mine/Python/tf2_env/lib/python3.6/site-packages/tensorflow/python/eager/backprop_util.py in IsTrainable(tensor_or_dtype)
     28   else:
     29     dtype = tensor_or_dtype
---> 30   dtype = dtypes.as_dtype(dtype)
     31   return dtype.base_dtype in (dtypes.float16, dtypes.float32, dtypes.float64,
     32                               dtypes.complex64, dtypes.complex128,

/Users/Mine/Python/tf2_env/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py in as_dtype(type_value)
    641 
    642   raise TypeError("Cannot convert value %r to a TensorFlow DType." %
--> 643                   (type_value,))

TypeError: Cannot convert value <tensorflow.python.eager.def_function.Function object at 0x14905d128> to a TensorFlow DType.
in
66
67型号=CGMM()
--->68 opt_beta=model.build_model(X,Y)
69打印(可选测试版)
内置模型(自、X、Y)
51损失=self.objfun
52变量=自β
--->53梯度=磁带梯度(损耗,变容)
54
55#处理渐变,例如对渐变进行覆盖等。
/梯度中的Users/Mine/Python/tf2_env/lib/python3.6/site-packages/tensorflow/Python/eager/backprop.py(自梯度、目标梯度、源梯度、输出梯度、未连接梯度)
1016个平面目标=[]
1017用于t嵌套。展平(目标):
->1018如果不可追溯(t):
1019 logging.vlog(
1020 logging.WARN,“目标张量的数据类型必须为”
/IsTrainable中的Users/Mine/Python/tf2_env/lib/python3.6/site-packages/tensorflow/Python/eager/backprop_util.py(tensor_或_dtype)
28.其他:
29 D类型=张量或D类型
--->30 dtype=dtypes.as\u dtype(dtype)
31返回dtype.base_dtype in(dtypes.float16、dtypes.float32、dtypes.float64、,
32数据类型.complex64,数据类型.complex128,
/as_dtype(type_值)中的Users/Mine/Python/tf2_env/lib/python3.6/site-packages/tensorflow/Python/framework/dtypes.py
641
642 raise TypeError(“无法将值%r转换为TensorFlow数据类型”。%
-->643(类型值)
TypeError:无法将值转换为TensorFlow数据类型。

您能帮我解决这个问题吗?

您需要调用loss,比如loss=self.objfun()@Snoopy博士感谢您的检查。我确实更改了它,但得到的错误是
TypeError:Cannot iterate over a scalar tensor.
grads
是标量值,它不能被迭代。如果您正在为变量列表查找梯度,请定义变量列表并计算梯度,然后将每个梯度附加到列表
grads
。然后使用循环在
梯度上迭代
。谢谢您需要调用loss,比如loss=self.objfun()@Snoopy博士感谢您的检查。我确实更改了它,但得到的错误是
TypeError:Cannot iterate over a scalar tensor.
grads
是标量值,它不能被迭代。如果您正在为变量列表查找梯度,请定义变量列表并计算梯度,然后将每个梯度附加到列表
grads
。然后使用循环在
梯度上迭代。谢谢