python - 这个“单一”值在渐变中代表什么?
问题描述
我试图计算输出层wrt输入的梯度,我期待一个梯度矩阵(作为每个输入输出层中不同节点的梯度),但我得到一个值。我想知道这个值在这里代表什么?
我的目标是计算每个输入的分类交叉熵损失梯度。我正在寻找解决方案,然后我坚持了下来。
我是新手,所以请忽略愚蠢的错误。
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)
我得到打印语句的输出为:
[array([[0.]], dtype=float32)]
解决方案
k.gradients
是一个实际运行的包装器tf.gradients
。如文档中所述
在 xs 中构造 ys 与 x 之和的符号导数。
的结果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]
推荐阅读
- c++ - 如何使用 QT 和 C++ 监听 mysql 数据库中的触发事件?
- sql - 如何在 SQL 中将 FLOAT 显式转换为 VARCHAR 字段
- sql-server - 如何根据起始日期和截止日期参数值获取前三个月的日期
- python - 使用 and 运算符否定 if 语句背后的 Python 逻辑
- phpmyadmin - Ampps、PHP 7.1、Windows 7(缺少 mbstring 扩展名。请检查您的 PHP 配置。)
- laravel - 如果描述相同,则分组选择选项
- javascript - 如何使用 Axios HTTP Client 登录网站?
- visual-studio-code - 整洁的标签,但对于 VSCode?
- r - 在 R 中填充日期以添加缺失/空白月份?
- javascript - 在 Javascript setInterval 函数中动态修改速度