Что это «единичное» значение представляет в градиенте? - PullRequest
1 голос
/ 27 марта 2019

Я попытался вычислить градиент выходного слоя w.r.t. вход, и я ожидаю матрицу градиента (как градиент различных узлов в выходном слое с каждым входом), но я получаю одно значение. Я хочу знать, что это значение представляет здесь?

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

Я новичок в этом, поэтому, пожалуйста, игнорируйте глупые ошибки.

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras import backend as k
import numpy as np
import tensorflow as tf

model = Sequential()
model.add(Dense(2, input_dim=1, init='uniform', activation='relu'))
model.add(Dense(2, init='uniform', activation='softmax'))

outputTensor = model.output
listOfVariableTensors = model.input

gradients = k.gradients(outputTensor, listOfVariableTensors)

trainingExample = np.random.random((1,1))
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
evaluated_gradients = sess.run(gradients,feed_dict={model.input:trainingExample})

print(evaluated_gradients)

Я получил вывод оператора print как:

[array([[0.]], dtype=float32)]

1 Ответ

1 голос
/ 31 марта 2019

k.gradients - это оболочка, которая на самом деле работает tf.gradients.Как описано в документе

Создает символические производные от sum от ys по x в xs.

Результатом tf.gradients является суммавсех ys производных xs.Формула выглядит следующим образом:

enter image description here

Форма результата такая же, как у xs, а не ys.Пример:

import tensorflow as tf

a = tf.constant([[1.],[2.]])
b = tf.matmul(a,[[3.,4.]])
c = tf.matmul(a,[[5.,6.]])

grads1 = tf.gradients(ys=b,xs=a)
grads2 = tf.gradients(ys=[b,c],xs=a)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(grads1))
    print(sess.run(grads2))

[array([[7.],[7.]], dtype=float32)]
[array([[18.],[18.]], dtype=float32)]

Просто сделайте tf.gradients(ys=loss,xs=input), если вы хотите рассчитать градиент суммы категориальных кросс-энтропийных потерь по каждому входу.Вам нужно будет вызывать tf.gradients для каждого ys[i,j] отдельно, если вы хотите рассчитать градиент различных узлов в выходном слое по отношению к каждому входу.

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