вычисление градиентов по классам в классификаторе керас - PullRequest
0 голосов
/ 08 февраля 2020

Я борюсь с вычислением градиентов по классам в выходном слое классификатора ANN в кератах (tf backend). вот архитектура модели:

model = Sequential([
  Dense(64, activation='relu', input_shape=(784,)),
  Dense(64, activation='relu'),
  Dense(10, activation='softmax'),
])

и вот как я вычисляю градиент:

outputTensor = model.output
listOfVariableTensors = model.trainable_weights[4]
gradients = k.gradients(outputTensor, listOfVariableTensors)
evaluated_gradients[0].shape

Я получил (64,10) форму, где я хочу получить (784,10). Я думаю, что проблема в списке переменных тензоров.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

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


def jacobian_tensorflow(x,M=10):    
    jacobian_matrix = []
    for m in range(M):
        # We iterate over the M elements of the output vector
        grad_func = tf.gradients(model.output[:, m], model.input)
        gradients = sess.run(grad_func, feed_dict={model.input: x.reshape((1, x.size))})
        jacobian_matrix.append(gradients[0][0,:])

    return np.array(jacobian_matrix)

Спасибо всем

0 голосов
/ 08 февраля 2020

Если вы хотите получить градиент выходных данных относительно входных данных, это на самом деле якобиан, градиенты определены для скалярных функций, поэтому вам нужно сделать:

from tensorflow.python.ops.parallel_for.gradients import jacobian
gradients = jacobian(model.output, model.input)

Это должно иметь форма (samples, 784, None, 10).

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