这个“单一”值在渐变中代表什么?

问题描述 投票:1回答:1

我试着计算输出层的梯度w.r.t.输入,我期待一个梯度矩阵(作为输出层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)]
python tensorflow input keras gradient
1个回答
1
投票

k.gradients是一个实际运行tf.gradients的包装器。如文件中所述

构造ys w.r.t之和的符号导数。 xs中的x。

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)。如果要在输出层w.r.t中计算不同节点的梯度,则需要分别为每个tf.gradients调用ys[i,j]。每个输入。

© www.soinside.com 2019 - 2024. All rights reserved.