pytorch Tensorflow 2.0 -未为任何变量提供梯度

pgky5nke  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(177)

我是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中做这样的事情的一般管道是什么。谢谢!

i7uaboj4

i7uaboj41#

解决了,这是我代码中的一个错误:
我调用model()的部分应该在with语句中,如下所示:

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)
with tf.device('/cpu:0'):
    with tf.GradientTape() as tape:
        vertices = model(shape,pose) # this line should be here.
        chamfer_distance = loss_fn(vertices[0,:,:],target_vertices)
        gradients = tape.gradient(chamfer_distance, [pose,shape])
        optimizer.apply_gradients(zip(gradients, [pose,shape]))

相关问题