Keras:计算模型输出与输入返回的导数 [无]

Rom*_*ann 4 python derivative keras tensorflow

我需要帮助计算 Keras 中模型输出和输入的导数。

我想为损失函数添加一个正则化函数。正则化器包含分类器函数的导数。所以我试图取模型输出的导数。该模型是一个带有一个隐藏层的 MLP。数据集是 MNIST。当我编译模型并取导数时,我得到 [None] 作为结果而不是导数函数。

我看过类似的帖子,但也没有得到答案: 将 Keras 模型的导数导出到输入是返回全零

这是我的代码。请帮我解决问题。

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))
Run Code Online (Sandbox Code Playgroud)

这是代码的输出。这两个参数是张量。梯度函数返回无。

Tensor("dense_2/Softmax:0", shape=(?, 10), dtype=float32)
Tensor("Identity:0", shape=(60000, 784), dtype=float32)
[None]
Run Code Online (Sandbox Code Playgroud)

Mat*_*gro 5

您正在计算关于 X_train 的梯度,它不是计算图的输入变量。相反,您需要获取模型的符号输入张量,因此请尝试以下操作:

grads = K.gradients(model.output, model.input)
Run Code Online (Sandbox Code Playgroud)