我是Tensorflow 2.0的初学者。我曾广泛使用PyTorch,但发现很难在现有文档中找到与Tensorflow 2.0相似的地方。我希望能获得任何帮助:
我有一个预先训练的GHUM human body model的VAE解码器。由于解码器代码是专有的(谷歌的),我没有权限在这里发布。但我希望我可以描述的问题,没有这一点,我的代码片段,我被允许分享。解码器采取形状潜码和姿势潜码,并输出一个身体网格在该形状和姿势。我想做的是,保持解码器固定,针对给定目标优化潜在形状和姿态代码。也就是说,优化潜在空间中的形状/姿态,以获得与目标形状最匹配的形状。
我在Pytorch中是怎么做的,就是用torch.nn.Parameter
初始化Pose和Shape潜在向量,用参数列表初始化一个优化器,保持解码器冻结只需要设置它的requires_grad_ = False
。
然而在TF2.0中,这似乎并不那么简单。
我的代码如下:
class Projection(Model):
def __init__(self):
super(Projection, self).__init__()
self.joint_angles_type = "EULER"
def call(self,shape,pose):
pose_parameters = ghum_pose_params(
body_shape_code=shape,
skeleton_posing_values=pose)
posed_data = ghum_shape_pose(pose_parameters)
return posed_data.vertices
现在,我调用initialize并尝试如下优化:
pose = tf.Variable(tf.zeros((1, num_pose_params),tf.float32))
shape = tf.Variable(tf.zeros((1, shape_code_size)))
model = Projection()
optimizer = tf.optimizers.Adam()
model.compile(optimizer=optimizer,
loss=loss_fn)
vertices = model(shape,pose)
with tf.device('/cpu:0'):
with tf.GradientTape() as tape:
chamfer_distance = loss_fn(vertices[0,:,:],target_vertices)
gradients = tape.gradient(chamfer_distance, [pose,shape])
optimizer.apply_gradients(zip(gradients, [pose,shape]))
当我这样做时,我得到如下错误:
ValueError:没有为任何变量提供梯度:([“变量:0”,“变量:0”],)。假定grads_and_vars
为...
我想知道如何修复这个错误,以及在TF中做这样的事情的一般管道是什么。谢谢!
1条答案
按热度按时间i7uaboj41#
解决了,这是我代码中的一个错误:
我调用
model()
的部分应该在with
语句中,如下所示: