python - 神经网络关于输入的导数

标签 python tensorflow

我训练了一个神经网络来对正弦函数进行回归,并想计算关于输入的一阶和二阶导数。
我尝试使用这样的 tf.gradients() 函数(neural_net 是 tf.keras.Sequential 的一个实例):

prediction = neural_net(x_value)
dx_f = tf.gradients(prediction, x_value)
dx_dx_f = tf.gradients(dx_f, x_value)

x_value 是一个具有测试大小长度的数组。
但是,这会导致 predictions and derivatives .网络的预测(蓝色曲线)基本上准确地捕捉到了正弦函数,但我必须将一阶导数(橙色)与因子 10 和二阶导数(绿色)与因子 100 相除才能使其成为在相同的数量级。因此,一阶导数看起来(在重新调整之后)还可以,但是二阶导数完全不稳定。由于正弦函数的预测效果非常好,显然这里发生了一些有趣的事情。

最佳答案

您观察到的一种可能的解释可能是您的函数不能推导两次。看起来好像极值周围的一阶导数有跳跃。如果是这样,该函数的二阶导数实际上并不存在,并且您得到的图高度取决于库如何处理这些地方。

考虑下面的非平滑函数图片,对于 {1, 2, ....} 中的所有 x,它从 0.5 跳到 -0.5。除了 x 是整数时,它的斜率在所有地方都是 1。如果您尝试绘制它的导数,您可能会在 y=1 处看到一条直线,这很容易被误解,因为如果有人只看这个图,他们可能会认为该函数是完全线性的,并且从 -infinity 开始到+无限。

如果您的结果是由使用 RELU 的神经网络产生的,您可以尝试使用 sigmoid 激活函数来做同样的事情。我想你不会看到这个功能有那么多尖峰。

enter image description here

关于python - 神经网络关于输入的导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56772362/

相关文章:

python - 如何使用两个损失函数训练模型?

docker - 寻找官方深度学习Docker镜像

tensorflow - 如何在 tensorflow 2.0 中使用层列表?

python - Django:有没有办法序列化模型字段而不是模型?

使用稀疏张量计算梯度时,tensorflow给出nans

python - 如何仅抓取特定单词

python - 正则表达式查找 <>

python - Tensorflow 相当于 numpy.diff

python - 从 JSON 文件加载数据

python - 使用 2 个不同的数组和 python 拖动值(simil 触发器)