繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM