TensorFlow 如何计算 vgg19.preprocess_input 的梯度?

How does TensorFlow compute the gradient of vgg19.preprocess_input?

我正在学习 neural style transfer 上的教程。风格转移是通过最小化关于图像(用内容图像初始化)的损失函数来完成的。令我困惑的是以下一段代码:

preprocessed_input = tf.keras.applications.vgg19.preprocess_input(inputs)

这是 StyleContentModel class 中 call 方法的一部分。 TensorFlow 怎么知道这个操作的梯度呢?我已经使用模块 tensorflow.python.framework.ops 中的 get_gradient_function 检查了此操作是否具有梯度函数,据我所知它没有。

这与模型或梯度无关。此函数的作用是缩放输入图像,使像素在 -1 到 +1 的范围内。这是迁移学习中使用的许多模型(如 VGG 和 MobileNet)的共同要求。如果您使用 ImageDataGenerator,它有一个参数 preprocessing_function,生成器调用它来预处理图像。确保如果对训练图像进行预处理,则对测试图像和验证图像进行相同的预处理。

很简单,函数内部使用了可微的符号张量运算。 TensorFlow 可以通过内部使用 TensorFlow 操作的函数计算梯度,无需为每个函数手动定义梯度。

您可以通过查看函数 here, specially if you look at the _preprocess_symbolic_function here 的代码来确认,它使用正常的标量运算和 Keras 后端函数(它们只是 tf.keras 中的 TensorFlow 函数)。