我需要帮助计算Keras中输入的模型输出的导数。
我想在损失函数中添加正则化函数。正则化器包含分类器函数的导数。所以我试着采用模型输出的衍生物。该模型是具有一个隐藏层的MLP。数据集是MNIST。当我编译模型并采用导数时,我得到[无]作为结果而不是导数函数。
我看过类似的帖子,但也没有得到答案: Taking derivative of Keras model wrt to inputs is returning all zeros
这是我的代码。请帮我解决问题。
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))
以下是代码的输出。这两个参数是张量。渐变函数返回None。
Tensor("dense_2/Softmax:0", shape=(?, 10), dtype=float32)
Tensor("Identity:0", shape=(60000, 784), dtype=float32)
[None]
答案 0 :(得分:3)
您正在计算相对于X_train的渐变,X_train不是计算图的输入变量。相反,你需要获得模型的符号输入张量,所以尝试类似:
grads = K.gradients(model.output, model.input)
答案 1 :(得分:1)
为了计算梯度,您需要首先找出可训练的变量。这是你如何做到的:
outputs = model.output
trainable_variables = model.trainable_weights
现在将渐变计算为:
gradients = K.gradients(outputs, trainable_variables)
作为旁注,gradients
是计算图的一部分,其执行取决于您的后端。如果您使用的是tf
,则可能需要初始化会话并将渐变变量传递给会话以进行评估。