Keras:计算模型输出与输入的导数 returns [None]
Keras: calculating derivatives of model output wrt input returns [None]
我需要帮助计算 Keras 中模型输出与输入的导数。
我想给损失函数添加一个正则化函数。正则化器包含分类器函数的导数。所以我尝试对模型输出求导。该模型是一个具有一个隐藏层的 MLP。数据集是 MNIST。当我编译模型并取导数时,我得到 [None] 作为结果而不是导数函数。
我看过类似的 post,但也没有得到答案:
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))
这是代码的输出。这两个参数是张量。梯度函数 returns None.
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)
我需要帮助计算 Keras 中模型输出与输入的导数。
我想给损失函数添加一个正则化函数。正则化器包含分类器函数的导数。所以我尝试对模型输出求导。该模型是一个具有一个隐藏层的 MLP。数据集是 MNIST。当我编译模型并取导数时,我得到 [None] 作为结果而不是导数函数。
我看过类似的 post,但也没有得到答案: 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))
这是代码的输出。这两个参数是张量。梯度函数 returns None.
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)