我想知道为什么在以下代码中我的梯度返回None:
import tensorflow.keras.losses as lossesloss = losses.squared_hinge(y_true, y_pred)from tensorflow.keras import backend as Kgrads = K.gradients(loss, CNN_model.input)[0]iterate = K.function([CNN_model.input], [loss, grads])
我的CNN_model.input是: <tf.Tensor 'conv2d_3_input:0' shape=(?, 28, 28, 1) dtype=float32>
我的损失是:<tf.Tensor 'Mean_3:0' shape=(1,) dtype=float64>
注意:在我的应用中,我将SVM的预测输出作为y_pred传递,如果这对您有帮助的话。
回答:
根据我之前的经验,Tensorflow需要使用GradientTape
来记录某个变量的活动,从而计算其梯度。在您的情况下,应该是这样的:
x = np.random.rand(10) #您的输入变量x = tf.Variable(x) #为了让GradientTape评估输入,它应该是一个张量with tf.GradientTape() as tape: tape.watch(x) #通过这个方法您可以观察您的变量 proba = model(x) #获取输入的预测 loss = your_loss_function(y_true, proba) #计算损失gradient = tape.gradient(loss, x) #计算梯度,这必须在记录之外进行