【问题标题】:Accessing gradient values of keras model outputs with respect to inputs访问 keras 模型输出相对于输入的梯度值
【发布时间】:2017-06-08 19:54:03
【问题描述】:

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

它正好适合一维函数 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 支持的功能,还是任何解决方案都将是特定于后端的?

【问题讨论】:

标签: python machine-learning tensorflow keras theano


【解决方案1】:

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

【讨论】:

  • 如果您的输出是向量而不是单个值,这将如何改变?您能否更改此函数以返回每个输出相对于每个输入的导数矩阵?
  • 我很乐意让它工作。我在J = ... 命令上得到AttributeError: 'Tensor' object has no attribute 'type'。你有什么见解吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2020-02-27
  • 2019-01-16
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多