Вычисление значимости изображения с помощью классификатора нейронной сети
Предположим, что у нас есть сверточная нейронная сеть, обученная классифицировать (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 на каждый входной пиксель, чтобы вычислить их производную по отношению к. выход.