Карты значимости нейронных сетей (с использованием Keras)

У меня есть полностью подключенный многослойный персептрон, обученный в Керасе. Я передаю ему N-мерный вектор объектов, и он предсказывает один из M классов для входного вектора. Обучение и прогнозирование работает хорошо. Теперь я хочу проанализировать, какая часть вектора входных объектов на самом деле отвечает за определенный класс.
Например, скажем, есть два класса A а также B и входной вектор f, Вектор f принадлежит к классу A и сеть предсказывает это правильно - вывод сети A=1 B=0, Поскольку у меня есть некоторые знания в области, я знаю, что весь f на самом деле не несет ответственности за f принадлежность к Aтолько определенная часть внутри f несет ответственность за это. Я хочу знать, захватила ли это нейронная сеть. Рисование соответствия изображениям, если изображение I имеет cat в нем (с некоторым фоном) и обученная сеть предсказывает это правильно, тогда сеть должна знать, что весь образ на самом деле не cat; сеть внутренне знает местоположение cat на изображении. Аналогично, в моем случае сеть знает, какая часть f делает его принадлежать к классу A, Я хочу знать, что это за часть.

Я искал вокруг, и считаю, что то, что я хочу сделать, называется поиском карт значимости для моей сети для заданного ввода. Это верно?
Если я правильно понял, Карты Значимости просто (change in output)/(change in input), и может быть найден просто 1 операцией обратного распространения, где я нахожу производную от выхода по входу.
Я нашел следующий фрагмент кода для этого в Keras, но я не совсем уверен, что это правильно:

   inp = model.layers[0].get_input()
   outp = model.layers[-1].get_output()
   max_outp = T.max(outp, axis=1)
   saliency = theano.grad(max_outp.sum(), wrt=inp)

В приведенном выше коде при вычислении градиента происходит ли обратное распространение? Вывод является нелинейной функцией ввода, поэтому единственный способ найти градиент - сделать backprop. Но в приведенном выше коде нечего подключать theano и сеть, как theano "осведомлен" о сети здесь? Насколько я знаю, при вычислении градиентов с помощью Theano мы сначала определяем функцию в терминах ввода и вывода. Поэтому Теано должен знать, что это за нелинейная функция. Я не думаю, что это правда в приведенном фрагменте..

Обновление: приведенный выше код не работает, потому что у меня есть полностью подключенный MLP. Выдает ошибку, в которой говорится, что "Плотный объект не имеет get_output()" . У меня есть следующая функция Keras, которая вычисляет вывод сети с учетом ввода. Теперь я хочу найти градиент этой функции по входу:

    get_output = K.function([self.model.layers[0].input],[self.model.layers[-1].output])

1 ответ

Решение

Я нашел решение:

    get_output = theano.function([model.layers[0].input],model.layers[-1].output,allow_input_downcast=True)
    fx = theano.function( [model.layers[0].input] ,T.jacobian(model.layers[-1].output.flatten(),model.layers[0].input), allow_input_downcast=True)
    grad = fx([input_feature])
Другие вопросы по тегам