В TensorFlow 2.0 с готовностью к выполнению, как вычислить градиенты сетевого вывода по входному слою? - PullRequest
1 голос
/ 13 марта 2020

Я использую сеть 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 для вычисления градиента вывода по отношению к входу

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете выполнить это в TF2 с помощью решения, предложенного здесь: Как вычислить градиент выходных данных по сравнению с Tensorflow 2.0

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)

Не забудьте изменить форму ввода в размер = (25, 120) в зависимости от количества входных столбцов, которые у вас есть. Модель (входные данные) и model.predict (входные данные) не выполняют одно и то же, прогнозирование работает с массивами numpy, а модель (входные данные) выполняет символьное вычисление c, которое тензорный поток может дифференцировать.

Но, глядя на ваш код, похоже, что вы пытаетесь сделать это на указанном c слое. Таким образом, вы можете обратиться к этой ссылке: как вычислить градиенты выходных данных сети по указанному c слою? Это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...