Tensorflow没有为变量具有不同形状的变量提供梯度

时间:2020-07-20 07:13:29

标签: python tensorflow machine-learning

with tf.GradientTape() as tape:
    images, labels = x
    initial_points = self.model(images, is_training=True)
    final_images = (tf.ones_like(initial_points) + initial_points).numpy()
    final_images = np.expand_dims(final_images, axis=-1)
    final_labels = tf.zeros_like(final_images)
    loss = tf.nn.softmax_cross_entropy_with_logits(logits=final_images, labels=final_labels)
gradients = tape.gradient(loss, self.model.trainable_variables)
self.optimizer.apply_gradients(zip(gradients, self.model.trainable_variables))

为什么如果我使用np.expand_dims()修改模型输出的形状,则会出现以下错误:

“ ValueError:将渐变应用于任何模型变量时,没有为任何变量提供渐变...”?如果我没有np.expand_dims(),它会很好地工作。是因为模型损失必须具有与模型输出相同的形状?还是不可微的?

2 个答案:

答案 0 :(得分:2)

始终使用TensorFlow版的NumPy函数来避免这种错误。

with tf.GradientTape() as tape:
    images, labels = x
    initial_points = self.model(images, is_training=True)
    final_images = (tf.ones_like(initial_points) + initial_points).numpy()
    final_images = tf.expand_dims(final_images, axis=-1)
    final_labels = tf.zeros_like(final_images)
    loss = tf.nn.softmax_cross_entropy_with_logits(logits=final_images, labels=final_labels)
gradients = tape.gradient(loss, self.model.trainable_variables)
self.optimizer.apply_gradients(zip(gradients, self.model.trainable_variables))

答案 1 :(得分:1)

使用tf.GradientTape()时,TensorFlow库的运行非常具体。在此功能下,它将自动为您计算偏导数,以便随后更新梯度。之所以可以这样做,是因为每个tf函数都是为此专门设计的。

但是,当您使用NumPy函数时,公式中会有一个中断。 TensorFlow不了解/不了解此功能,因此无法再通过链式规则计算损失的偏导数。

因此,您只能在tf下使用GradientTape()个函数。