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
。然后使用循环在梯度上迭代。谢谢