簡體   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