在具有急切执行的TensorFlow 2.0中,如何计算网络输出wrt输入层的梯度?

在具有急切执行的TensorFlow 2.0中,如何计算网络输出wrt输入层的梯度?,tensorflow,keras,gradient,tensorflow2.0,Tensorflow,Keras,Gradient,Tensorflow2.0,我使用网络接收v3,我想计算模型输出w.r.t.输入层的梯度。我有以下代码: 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 = ten

我使用网络接收v3,我想计算模型输出w.r.t.输入层的梯度。我有以下代码:

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计算输出相对于输入的梯度

您可以通过此处提供的解决方案在TF2中执行此操作:

别忘了根据您拥有的输入列的数量,在size=(25120)中更改输入形状。 model(input)和model.predict(input)的作用不一样,predict使用numpy数组,而model(input)执行tensorflow可以区分的符号计算

但仔细查看您的代码,看起来您正试图在特定的层上执行此操作。至此,您可以参考以下链接:
这可能会有所帮助。

您可以通过此处提供的解决方案在TF2中执行此操作:

别忘了根据您拥有的输入列的数量,在size=(25120)中更改输入形状。 model(input)和model.predict(input)的作用不一样,predict使用numpy数组,而model(input)执行tensorflow可以区分的符号计算

但仔细查看您的代码,看起来您正试图在特定的层上执行此操作。至此,您可以参考以下链接: 这可能会有所帮助

input = tf.Variable(np.random.normal(size=(25, 120)), dtype=tf.float32) 

with tf.GradientTape() as tape:
   preds = model(inp) 

grads = tape.gradient(preds, input)