获取keras模型输出相对于输入的梯度值

2024-05-19 03:42:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个非常简单的NN模型,在Keras中为我做了一些非线性回归,作为介绍练习。我上传了我的jupyter notebookit作为一个主旨here(在github上正确呈现),这很短,很中肯。在

它只适合一维函数y=(x-5)^2/25。在

我们知道,基于梯度的衍生框架和基于梯度的流。利用损失函数相对于权重的梯度进行梯度步长优化是其主要目的。在

但我想弄明白的是,如果我能得到某种东西,给定一个经过训练的模型,可以对我来说近似输入相对于输出层的导数(而不是权重或损失函数)。因此,对于这个例子,我希望通过网络的导数图来估计网络当前训练状态下输入x的指示值y'=2(x-5)/25.0。在

我是否在Keras或Theano/TF后端api中有任何选项来实现这一点,或者我是否需要以某种方式使用权重来执行我自己的链规则(或者添加我自己不可训练的“身份”层或其他东西)?在我的笔记本里,你可以看到我尝试了一些方法,基于我目前所能找到的,但没有成功。在

为了使其具体化,我有一个工作keras模型,其结构如下:

model = Sequential()
# 1d input
model.add(Dense(64, input_dim=1, activation='relu'))
model.add(Activation("linear"))
model.add(Dense(32, activation='relu'))
model.add(Activation("linear"))
model.add(Dense(32, activation='relu'))
# 1d output
model.add(Dense(1))

model.compile(loss='mse', optimizer='adam', metrics=["accuracy"])
model.fit(x, y,
      batch_size=10,
      epochs=25,
      verbose=0,
      validation_data=(x_test, y_test))

我想估计输出y相对于输入x的导数,比如x=0.5。在

我所有基于搜索过去答案来提取梯度值的尝试都导致了语法错误。从高层次的角度来看,这是Keras支持的特性,还是任何解决方案都是特定于后端的?在


Tags: 函数模型网络addinputmodelactivationkeras
1条回答
网友
1楼 · 发布于 2024-05-19 03:42:14

正如您所提到的,Theano和TF是象征性的,因此进行派生应该非常容易:

import theano
import theano.tensor as T
import keras.backend as K
J = T.grad(model.output[0, 0], model.input)
jacobian = K.function([model.input, K.learning_phase()], [J])

首先计算给定输入的输出的符号梯度(T.grad),然后构建一个可以调用的函数并进行计算。请注意,有时由于形状问题,这并不是很简单,因为您可以为输入中的每个元素获得一个导数。在

相关问题 更多 >

    热门问题