Что это «единственное» значение представляет в gradient?

#python #tensorflow #input #keras #gradient

#python #тензорный поток #ввод #keras #градиент

Вопрос:

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

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

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

 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. Какая у вас версия tensorflow и keras ? Мой возврат происходит [array([[0., 0.]], dtype=float32)] на tensorflow=1.12.0 и keras=2.2.4 .

2. @giser_yugang Спасибо …… По ошибке я вставил код для input_dim =2… Вопрос допустим в любом случае

Ответ №1:

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

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

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

введите описание изображения здесь

Форма результата такая же, как у 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] отдельно, если вы хотите вычислить градиент разных узлов в выходном слое по каждому входу.r.t.