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(),它会很好地工作。是因为模型损失必须具有与模型输出相同的形状?还是不可微的?
答案 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()
个函数。