Python Keras:计算模型输出wrt输入回报的导数[无]

Python Keras:计算模型输出wrt输入回报的导数[无],python,tensorflow,keras,derivative,Python,Tensorflow,Keras,Derivative,我需要帮助计算Keras中模型输出wrt输入的导数 我想给损失函数加一个正则化函数。正则化器包含分类器函数的导数。所以我试着求模型输出的导数。该模型是一个具有一个隐藏层的MLP。数据集是MNIST。当我编译模型并求导数时,得到的结果是[None],而不是导数函数 我看过类似的帖子,但也没有得到答案: 这是我的密码。请帮我解决这个问题 import keras from keras.datasets import mnist from keras.models import Sequential

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

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

我看过类似的帖子,但也没有得到答案:

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

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))
下面是代码的输出。这两个参数是张量。gradients函数返回None

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

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

grads = K.gradients(model.output, model.input)

谢谢你的回答。首先问一个问题,你的答案中的K.gradient(model.input,model.output)应该是K.gradient(model.output,model.input)吗?然后,我尝试使用model.input作为参数。现在它在返回[]时工作。我想知道model.input、K.identity(X_train)和tf.placeholder(dtype=tf.float32,shape=(无,784)之间有什么区别。它们都是形状相同的张量:张量(“密集输入:0”,shape=(?,784),dtype=float32),张量(“identity:0”,shape=(60000,784),dtype=float32),张量(“占位符:0”,shape=(?,784),数据类型=32)。但只有第一个可以用于获取梯度。@user7367951是的,参数被交换。K.identity未连接到计算图,您实际上不能将其用于任何事情。它是
K.gradients
不是
K.gradients
tf。启用“急切执行”时不支持梯度。请改用tf.GradientTape