Вычисление значимости изображения с помощью классификатора нейронной сети

Предположим, что у нас есть сверточная нейронная сеть, обученная классифицировать (w.l.o.g. оттенки серого) изображения, вТензор-Flow.

По обученной сети и тестовому изображению можно проследить, какие ее пиксели являются значимыми или «эквивалентно», какие пиксели наиболее ответственны за выходную классификацию изображения. Хороший, объяснение и детали реализации в Theano, приведены в этомстатья.

Предположим, что для первого слоя сверток, который напрямую связан с входным изображением, у нас есть градиент для параметров каждого сверточного ядра по сравнению с исходным. классификационная функция.

Как можно распространить градиент обратно на входной слой, чтобы вычислить частную производную для каждого пикселя изображения?

Распространение и накопление обратного градиента дало бы нам заметные пиксели (это те, которые имеют большую производную по величине).

Найти градиент по отношению к Ядра первого слоя, до сих пор я сделал:

Заменен обычный оператор потерь на оператор выходного слоя.Использовал функцию "compute_gradient",

В целом, это выглядит так:

opt = tf.train.GradientDescentOptimizer (1)grads = opt.compute_gradients (вывод)grad_var = [(град1) для выпускников в градусах]g1 = sess.run ([grad_var [0]])

Где «выход» - это максимум выходного уровня NN. И g1 является (k, k, 1, M) тензором, поскольку я использовал M: k x k сверточных ядер на первом слое.

Теперь мне нужно найти правильный способ распространения g1 на каждый входной пиксель, чтобы вычислить их производную по отношению к. выход.

Ответы на вопрос(1)

Ваш ответ на вопрос