[英]Keras: calculating derivatives of model output wrt input returns [None]
我需要有关在Keras中为模型输出wrt输入计算导数的帮助。
我想向损失函数添加一个正则化函数。 正则化器包含分类器函数的导数。 因此,我尝试采用模型输出的导数。 该模型是具有一个隐藏层的MLP。 数据集是MNIST。 当我编译模型并采用导数时,得到的结果为[None],而不是导数函数。
我看到过类似的帖子,但也没有得到答案: 将Keras模型wrt的导数作为输入将返回全零。
这是我的代码。 请帮我解决问题。
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras import backend as K
num_hiddenNodes = 1024
num_classes = 10
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(-1, 28 * 28)
X_train = X_train.astype('float32')
X_train /= 255
y_train = keras.utils.to_categorical(y_train, num_classes)
model = Sequential()
model.add(Dense(num_hiddenNodes, activation='softplus', input_shape=(784,)))
model.add(Dense(num_classes, activation='softmax'))
# Compile the model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
logits = model.output
# logits = model.layers[-1].output
print(logits)
X = K.identity(X_train)
# X = tf.placeholder(dtype=tf.float32, shape=(None, 784))
print(X)
print(K.gradients(logits, X))
这是代码的输出。 这两个参数是张量。 渐变函数返回无。
Tensor("dense_2/Softmax:0", shape=(?, 10), dtype=float32)
Tensor("Identity:0", shape=(60000, 784), dtype=float32)
[None]
您正在计算相对于X_train的梯度,它不是计算图的输入变量。 相反,您需要获取模型的符号输入张量,因此请尝试以下操作:
grads = K.gradients(model.output, model.input)
为了计算梯度,您需要首先弄清楚可训练变量。 这是您的操作方式:
outputs = model.output
trainable_variables = model.trainable_weights
现在将梯度计算为:
gradients = K.gradients(outputs, trainable_variables)
附带说明一下, gradients
是计算图的一部分,其执行取决于您的后端。 如果您使用的是tf
,则可能需要初始化会话并将gradients变量传递给该会话以进行评估。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.