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 函数)。
我正在学习 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 函数)。