Я использую сеть InceptionV3, я хочу вычислить градиенты вывода модели по входному слою. У меня есть следующий код:
origin_image = load_img("dog.jpg", target_size=(299, 299))
origin_image = img_to_array(origin_image)
origin_image = (origin_image - 127.5) / 127.5
origin_image = np.expand_dims(origin_image, axis=0)
model = tensorflow.keras.applications.inception_v3.InceptionV3()
with tf.GradientTape() as gtape:
output = model(origin_image)
y_pred = output[0, 346]
gradient = gtape.gradient(y_pred, model.get_layer("input_1").trainable_variables)
print(gradient) # return []
, но этот код работает:
from keras import backend as K
model_input_layer = model.layers[0].input
model_output_layer = model.layers[-1].output
cost_function = model_output_layer[0, 346]
gradient_function = K.gradients(cost_function, model_input_layer)
grab_cost_and_gradients_from_model = K.function([model_input_layer, K.learning_phase()],
[cost_function, gradient_function])
cost, gradients = grab_cost_and_gradients_from_model([origin_image, 0])
Как можно использовать tf.GradientTape для вычисления градиента вывода по отношению к входу