#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.