Карты значимости нейронных сетей (с использованием 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])