首页 文章

访问相对于输入的keras模型输出的梯度值

提问于
浏览
4

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

它只适合1D函数y =(x - 5)^ 2/25 .

我知道Theano和Tensorflow的核心是基于图形的衍生(渐变)传递框架 . 并且利用关于基于梯度步骤的优化的权重的损失函数的梯度是其主要目的 .

但是我想要了解的是,如果我能够访问某些东西,给定一个训练有素的模型,可以为我输出相对于输出层的输入的导数(而不是权重或损失函数) . 因此对于这种情况,我希望通过网络的衍生图估计y'= 2(x-5)/25.0,以获得输入x的指示值,在网络当前训练状态 .

我在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支持的功能,还是任何解决方案都是特定于后端的?

1 回答

  • 3

    正如你所提到的,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),然后构建一个可以调用并进行计算的函数 . 请注意,由于形状问题,有时这不是那么微不足道,因为您为输入中的每个元素获得了一个导数 .

相关问题